Tym, jaka akcja dla danego kontrolera powinna zostać wykonana zajmuje się front controller.
Jeżeli nie ma żądanego kontrolera lub brakuje akcji dla danego kontrolera, to powinien (front controller) w tym miejscu zwrócić wyjątek.
Coś w tym stylu, załóżmy, że metoda uruchamiająca odpowiednią akcję nazywa się run:
public function run()
{
$request = $this->getRequest(); //metoda request powinna zwracać obiekt z danymi dotyczącymi requestu
$controllerName = $request->getControllerName(); //zwraca nazwę kontrolera lub nazwę domyślnie ustawioną, gdy url jest bez parametrów
$actionName = $request->getActionName(); //analogicznie jak wyżej
try {
$controller = new $controllerName; //autoloader powinien wyrzucić wyjątkiem, jeżeli nie znajdzie kontrolera
$controller->setRequest($request); //request powinien zostać przekazany do kontrolera
}
catch(Autoloader_Exception $e)
{
throw new Controller_Exception('Kontroler ' . $controllerName .' nie istnieje.'); //wyrzucone, gdy autoloader nie znajdzie klasy
}
if(!method_exists($controller, $actionName))
throw new Controller_Exception('Akcja '.$actionName.' nie istnieje.'); //wyrzucane, gdy brakuje metody
$controller->{$actionName}; //wykonanie akcji, możesz zwracać wynik, jeżeli zachodzi taka potrzeba.
}
A kod kontrollera wygląda np. tak:
Controller_A {
public function foo() {}//gdy url: www.site.com/a/foo
public function boo() {}//gdy url: www.site.com/a/boo
}
Radzę zastosować zamiast takich urli: www.site.com/index.php?module=user&action=shownotactive&other=1_2 coś takiego: www.site.com/user/shownotactive?other=1_2 wygląda o wiele ładniej. Wartość parametru other powinna być dostępna z obiektu Request, a nie przekazywana jako parametr metody akcji.