Zend_Controller_Plugin
Dość często potrzebujemy zrobić coś przed lub po wywołaniu każdej z akcji kontrolerów, czy na przykład po zakończeniu wywoływania wszystkich akcji kontrolerów. Aby uniknąć powtarzania takiego samego kodu w wielu miejscach, możemy użyć plugina do kontrolera frontowego.
Klasa plugina rozszerza klasę abstrakcyjną. Nie musimy definiować wszystkich jej metod, możemy zdefiniować jedynie te, których chcemy użyć. Ważne jest, żeby metody które w parametrze pobierają token $action zwracały go dalej. Poszczególne metody są opisane w komentarzach. Oto szablon plugina:
-
<?php
-
Zend::loadClass('Zend_Controller_Plugin_Abstract');
-
-
/**
-
* Plugin kontrolera umożliwiający np. obsługę layoutów,
-
* proxy itp.
-
*
-
* Przykładowo możemy dzięki niemu zapobieć powtarzaniu
-
* kodu w każdym kontrolerze.
-
*/
-
class Foo_Controller_Plugin_Layout extends Zend_Controller_Plugin_Abstract
-
{
-
/**
-
* Metoda wywoływana przed rozpoczęciem procesu routingu.
-
*/
-
public function routeStartup()
-
{}
-
-
/**
-
* Metoda wywoływana po zakończeniu procesu routingu.
-
*/
-
public function routeShutdown($action)
-
{
-
return $action;
-
}
-
-
/**
-
* Metoda wywoływana przed rozpoczęciem procesu
-
* dispatchingu.
-
*/
-
public function dispatchLoopStartup($action)
-
{
-
return $action;
-
}
-
-
/**
-
* Metoda wywoływana przed każdym wywołaniem kontrolera.
-
*/
-
public function preDispatch($action)
-
{
-
return $action;
-
}
-
-
/**
-
* Metoda wywoływana po każdym wywołaniu kontrolera.
-
*/
-
public function postDispatch($action)
-
{
-
return $action;
-
}
-
-
/**
-
* Metoda wywoływana tylko raz, po wywołaniu wszystkich
-
* kontrolerów.
-
*/
-
public function dispatchLoopShutdown()
-
{
-
// tu akurat wyciągamy obiekt widoku z rejestru
-
// i wyświetlamy stronę na podstawie szablonu
-
-
$view = Zend::registry('view');
-
}
-
}
-
-
?>
Plik plugina powinien być umieszczony w podobnej strukturze katalogów jaka jest używana w frameworku, z tą różnicą, że nasz zestaw klas powinien mieć inną nazwę głównego katalogu (w tym przypadku Foo). Powinno to wyglądać w ten sposób:
Zend
Cache
Config
...
Foo
Controller
Plugin
Layout.php
Teraz jedyne co zostało to zarejestrowanie plugina w kontrolerze frontowym w pliku ładującym (bootstrap), którym najczęściej jest index.php:
-
<?php
-
$controller = Zend_Controller_Front::getInstance();
-
$controller -> registerPlugin(new Foo_Controller_Plugin_Layout());
-
?>
Oczywiście obie klasy (Zend_Controller_Front i Foo_Controller_Plugin_Layout) powinny być wcześniej załadowane. Można to zrobić ręcznie:
-
<?php
-
Zend::loadClass('Zend_Controller_Front');
-
Zend::loadClass('Foo_Controller_Plugin_Layout');
-
?>
lub zdefiniować w pliku ładującym funkcję __autoload:
-
<?php
-
function __autoload($class) {
-
Zend::loadClass($class);
-
}
-
?>
Oczywiście trzeba pamiętać, że plugin zadziała globalnie, czyli dla wszystkich akcji kontrolerów wywoływanych przez daną instancję kontrolera frontowego. Jeśli chcemy zrobić coś tylko dla akcji z konkretnego kontrolera, możemy do tego użyć konstruktora i destruktora (__construct i __destruct).



Wielkie dzięki za ten artykuł Wojciechu, teraz pisanie stron wizytówek jest jeszcze przyjemniejsze!!