Bootstrap w Zend Framework – Bootstrap.php

Jest kilka plików w Zendzie umożliwiających dostosowanie w niemal dowolny sposób całe środowisko, a które mijane są szerokim łukiem przez początkujących (a nawet średnio-zaawansowanych) programistów Zend’a. Blady strach na nich pada, gdy muszą modyfikować np. application.ini, czy Bootstrap.php. Niniejszy tekst jest o tym drugim pliku. Nie będę wchodził w zbytnie szczegóły, a tylko pokażę czemu powinniśmy zaznajomić się z nim i, mam nadzieję, że zachęcę do wgłębienia się w temat.

W ‘czystym’ środowisku plik Bootrstrap.php jest tylko pustą klasą o następującej postaci.

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {
}

Teraz pytanie – do czego nam jest to potrzebne? Zacznę od tego, że większość ustawień konfiguracyjnych umieszczonych jest w plikach *.ini w katalogu config. Jednak to co jesteśmy w stanie tam ustawić to tylko ograniczona liczba parametrów, które zostały przewidziane przez autorów. Jeżeli chcemy skonfigurować coś ponad to, wtedy właśnie powinniśmy skorzystać z Bootstrap.php. Dlaczego? Po pierwsze – bo nasze ustawienia wejdą w życie na samym początku pracy naszej aplikacji. Po drugie – bo jest tam kilka mechanizmów, które umożliwią nam bezkonfliktowe działanie. O jakie konflikty może mi tu chodzić? Ano np. o takie, że będziemy chcieli ustawić jakiś parametr Zend_View, a okaże się, iż nie został jeszcze załadowany do pamięci.

Teraz powiem o tym, jak używamy Bootstrap.php. Użyję tu popularnego przykładu z ustawieniem DOCTYPE dla Zend_View. Można tego ustawienia dokonać gdzie indziej, ale jest to prosty i przemawiający do wyobraźni przykład.

Jeżeli chcemy ‘podłączyć’ się do Bootstrap’a musimy dopisać mu metodę. Nazwa metody składa się ze stałego prefixu o postaci _init oraz dołączonej do prefixu dowolnej części nazwy, która będzie dla nas coś znaczyła. Jako, że mu ustawiamy DOCTYPE, to nazwiemy naszą metodę, jak poniżej.

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {
   protected function _initDoctype() {
      ;
   }
}

Podkreślenie w prefixie nie jest przypadkowe. Powoduje ono (ale nie wiem czy zawsze tak jest), że ta metoda zostanie wywołana zaraz po powołaniu do życia obiektu danej klasy.

Parametr określający stosowany DOCTYPE jest ustawiany za pomocą obiektu klasy Zend_View. Zend tworzy jeden taki obiekt podczas startu naszej aplikacji i trzyma do niego referencje. Wszystkie takie obiekty, które są niezbędne do działania naszej aplikacji są tworzone właśnie poprzez podobne metody Bootstrap’u, tylko ich nie widzimy w naszym pliku Bootstrap.php, gdyż są one dynamicznie tworzone na podstawie tego co Zend znajdzie w application.ini.

W każdym razie, musimy się upewnić, że Zend załadował już Zend_View do pamięci.

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {
   protected function _initDoctype() {
      $this->bootstrap('view');
   }
}

Te polecenie upewnia nas, że zanim przejdziemy dalej zostanie wywołana metoda _initView(), która tworzy i zapisuje obiekt klasy Zend_View. Jednak, jeżeli czytałeś uważnie, to powinieneś zwrócić uwagę, że ‘niewidoczne’ metody są tworzone na postawie application.ini. Jeżeli chcemy, żeby Zend utworzył i ‘wkleił’ nam do Bootstrap’a odpowiednia metodę powinniśmy dopisać jedną linię właśnie do appliaction.ini.

[production]
...
resources.view[] =
...

Nie przekazujemy tu, jak widać, żadnych parametrów, ale sprawiamy tym zapisem, że Zend stworzy odpowiednią metodę w Bootrapie, a co za tym idzie zainicjuje nam obiekt Zend_View.

Kiedy już wiemy, że obiekt Zend_View został załadowany do pamięci, możemy pobrać do niego uchwyt. W tym celu zastosujemy kolejną metodę Bootstrap’a.

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {
   protected function _initDoctype() {
      $this->bootstrap('view');
      $view = $this->getResource('view');
   }
}

W ten sposób pozyskamy referencje do załadowanego obiektu klasy Zend_View, który Zend zainicjował dla naszej aplikacji. Teraz już bardzo prosto ustawiamy DOCTYPE.

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {
   protected function _initDoctype() {
      $this->bootstrap('view');
      $view = $this->getResource('view');
      $view->doctype('XHTML1_STRICT');
   }
}

Proste? Proste… Jak się wie jak…