2009-05-17 5 views
7

Czy ktoś wie o sposobie, aby ustawić moduł domyślny dynamicznie w Zend Framework i nie napotkać problemów przestrzeni nazw? Na przykład, chcę utworzyć tabelę modułów, które mogą być ładowane, a jeden z nich jest ustawiony jako moduł domyślny. Na przykład, mogę mieć:Dynamiczny moduł domyślny w Zend Framework

jako moduły, które można załadować. Jeśli mam "blog" jako domyślny moduł, to "admin" i "calendar" muszą mieć przypisane nazwy kontrolerów (Admin_IndexController, Calendar_IndexController), podczas gdy "blog" nie jest (IndexController).

Jeśli zmienię "kalendarz" na moduł domyślny, ZF nie może już znaleźć klas ze względu na obszar nazw.

Jak sobie z tym poradzić? Obecnie używam następujący kod:

$modules = new Modules(); 
$activeModules = $modules->fetchActive(); 
foreach($activeModules as $mod) { 
    $loadedModules[$mod->name] = '..application/modules/' . $mod->name . '/controllers'; 
    if($mod->default) { 
     $defaultModule = $mod->name; 
    } 
} 
$frontController->setControllerDirectory($loadedModules); 
$frontController->setDefaultModule($defaultModule); 

Odpowiedz

6

Jeśli planujesz zmianę moduł domyślny, to chyba najlepiej do przestrzeni nazw WSZELKIE moduły, a następnie określić, że moduł domyślne powinny być poprzedzone :

Najpierw zmienić moduł "blog", aby użyć przestrzeni nazw:

<?php 

// Used to be "class IndexController" 
class Blog_IndexController extends Zend_Controller_Action { 

} 

Następnie zadzwonić setParam dla prefixDefaultModule opcja na instancji Zend_Controller_Front:

<?php 

    // Allow your default module to be prefixed 
    $frontController->setParam('prefixDefaultModule', true); 

Zobacz bug # 1831 o wyjaśnienia.

1

Można dokonać moduł domyślny faktycznie być decydującym elementem w tym procesie. Dokładniej - spraw, aby wszystkie żądania dotyczące modułu domyślnego przechodziły do ​​klasy, która następnie zadecyduje, który konkretny moduł jest aktualnie domyślny i przekieruje do niego żądanie.

Przynajmniej tak to mamy wdrożone go;)

0

Brzmi jak praca wtyczki kontrolera preDispatch.

Możesz zmodyfikować żądanie zmiany modułu na podstawie określonego żądania lub tożsamości/sesji/znanych danych w celu przesłania dalej lub przekierowania na żądanie.

4

użycie application.ini: resources.frontController.prefixDefaultModule = true resources.frontController.defaultModule = default