# Wtyczki

## Wprowadzenie

Architektura kontrolera zawiera także system wtyczek, który pozwala programiście na wykonanie własnego kodu, gdy następują określone zdarzenia w trakcie trwania procesu kontrolera. Kontroler frontowy używa agenta wtyczek jako rejeestru dla wtyczek programisty, a agent wtyczek jest odpowiedzialny za to, że metody zdarzeń są wywoływane dla każdej wtyczki zarejestrowanej w kontrolerze frontowym.

Metody zdarzeń są zdefiniowane w klasie abstrakcyjnej `Zend_Controller_Plugin_Abstract`, z której dziedziczy każda klasa wtyczki:

- Metoda `routeStartup()` jest wywoływana zanim `Zend_Controller_Front` wywoła router w celu sprawdzenia żądania pod kątem zarejestrowanych tras.

- Metoda `routeShutdown()` jest wywoływana po tym jak router zakończy routing żądania.

- Metoda `dispatchLoopStartup()` jest uruchamiana zanim `Zend_Controller_Front` zacznie pętlę uruchamiania.

- Metoda `preDispatch()` jest wywoływana zanim akcja zostanie uruchomiona przez obiekt uruchamiający. Pozwala to na stworzenie funkcjonalności proxy lub filtra. Nadpisując żądanie i resetując flagę uruchomienia (za pomocą `Zend_Controller_Request_Abstract::setDispatched(false)`), obecna akcja może być pominięta lub zastąpiona.

- `postDispatch()` jest wywoływana po tym jak akcja zostanie uruchomiona przez obiekt uruchamiający. Pozwala to na stworzenie funkcjonalności proxy lub filtra. Nadpisując żądanie i resetując flagę uruchomienia (za pomocą `Zend_Controller_Request_Abstract::setDispatched(false)`), można określić nową akcję do uruchomienia.

- Metoda `dispatchLoopShutdown()` jest wywoływana po tym jak `Zend_Controller_Front` zakończy pętlę uruchamiania.

## Pisanie wtyczek

W celu napisania klasy wtyczki, w prosty sposób rozszerz klasę abstrakcyjną `Zend_Controller_Plugin_Abstract`:

    class MyPlugin extends Zend_Controller_Plugin_Abstract
    {
        // ...
    }

Żadna z metod klasy `Zend_Controller_Plugin_Abstract` nie jest abstrakcyjna, co oznacza, że nie jest konieczne implementowanie wszystkich dostępnych metod zdarzeń opisanych powyżej. Autor wtyczki może zaimplementować tylko te metody zdarzeń, które są mu rzeczywiście potrzebne.

`Zend_Controller_Plugin_Abstract` udostępnia także obiekty żądania i odpowiedzi wtyczkom kontrolera za pomocą metod `getRequest()` oraz `getResponse()`, odpowiednio.

## Użycie wtyczek

Klasy wtyczek są rejestrowane za pomocą metody `Zend_Controller_Front::registerPlugin()` i mogą być rejestrowane w dowolnym momencie. Poniższy kod pokazuje w jaki sposób wtyczka może być użyta przez kontroler:

    class MyPlugin extends Zend_Controller_Plugin_Abstract
    {
        public function routeStartup(Zend_Controller_Request_Abstract $request)
        {
            $this->getResponse()->appendBody("<p>Wywołano metodę routeStartup()</p>\n");
        }

        public function routeShutdown(Zend_Controller_Request_Abstract $request)
        {
            $this->getResponse()->appendBody("<p>Wywołano metodę routeShutdown()</p>\n");
        }

        public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
        {
            $this->getResponse()->appendBody("<p>Wywołano metodę dispatchLoopStartup()</p>\n");
        }

        public function preDispatch(Zend_Controller_Request_Abstract $request)
        {
            $this->getResponse()->appendBody("<p>Wywołano metodę preDispatch()</p>\n");
        }

        public function postDispatch(Zend_Controller_Request_Abstract $request)
        {
            $this->getResponse()->appendBody("<p>Wywołano metodę postDispatch()</p>\n");
        }

        public function dispatchLoopShutdown()
        {
            $this->getResponse()->appendBody("<p>Wywołano metodę dispatchLoopShutdown()</p>\n");
        }
    }

    $front = Zend_Controller_Front::getInstance();
    $front->setControllerDirectory('/path/to/controllers')
          ->setRouter(new Zend_Controller_Router_Rewrite())
          ->registerPlugin(new MyPlugin());
    $front->dispatch();

Zakładając, że żadne wywołana akcja nie wyświetliła żadnych danych, i że tylko jedna akcja została wywołana, to funkcjonalność powyższej wtyczki spowoduje wyświetlenie takich danych:

    <p>Wywołano metodę routeStartup()</p>
    <p>Wywołano metodę routeShutdown()</p>
    <p>Wywołano metodę dispatchLoopStartup()</p>
    <p>Wywołano metodę preDispatch()</p>
    <p>Wywołano metodę postDispatch()</p>
    <p>Wywołano metodę dispatchLoopShutdown()</p>

Wtyczki mogą być zarejestrowane w dowolnym momencie podczas uruchomienia kontrolera frontowego. Jednak jeśli zdarzenie dla którego we wtyczce była zarejestrowana metoda już minęło, to metoda ta będzie ominięta.

## Wtyczki dołączone do standardowej dystrybucji

Zend Framework w standardowej dystrybucji zawiera wtyczkę służącą do obsługi błędów.