Zend Framework Tutorial
Zend_Controller
Używanie kontrolera jest bardzo intuicyjne. Piszę ten tutorial bez używania dokumentacji.
Dokumentacja jest dostępna na stronie Zend Framework.
Zacząłem z kontrolerem frontowym czyli Zend_Controller_Front. Aby zrozumieć jak on działa umieść w pliku index.php następujący kod:
-
<?php
-
-
include 'Zend.php';
-
-
Zend::loadClass('Zend_Controller_Front');
-
-
$controller = Zend_Controller_Front::getInstance();
-
$controller->setControllerDirectory('/path/to/controllers');
-
$controller->dispatch();
-
-
?>
Jeśli wolisz łańcuchową obsługę obiektów (object chaining), możesz to zrobić w ten sposób:
-
<?php
-
-
include 'Zend.php';
-
-
Zend::loadClass('Zend_Controller_Front');
-
-
$controller = Zend_Controller_Front::getInstance()
-
->setControllerDirectory('/path/to/controllers')
-
->dispatch();
-
-
?>
Teraz gdy wykonasz żądanie do /foo/bar, spowodujesz błąd. I bardzo dobrze! Dzięki temu wiesz, że coś się dzieje. Powodem wystąpienia błędu jest to, że kontroler IndexController.php nie został znaleziony.
Zanim utworzysz ten plik warto zrozumieć w jaki sposób działa system kontrolerów. Framework rozbiera adres jaki wywołano na kawałki i na tej podstawie wnioskuje o nazwach kontrolerów i akcji. Na przykład gdy wywołano adres /foo/bar, kontrolerem będzie foo a akcją bar. Dla obydwu domyślną wartością jest index.
Jeśli foo jest nazwą kontrolera to framework szuka w katalogu kontrolerów pliku FooController.php. Ponieważ plik taki nie istnieje, framework szuka pliku IndexController.php. Nie znajduje żadnego z nich co powoduje wyświetlenie błędu.
Aby kontynuować, utwórz plik IndexController.php katalogu kontrolerów (który ustawiasz za pomocą setControllerDirectory()):
-
<?php
-
-
Zend::loadClass('Zend_Controller_Action');
-
-
class IndexController extends Zend_Controller_Action
-
{
-
public function indexAction()
-
{
-
echo 'IndexController::indexAction()';
-
}
-
}
-
-
?>
Klasa IndexController obsługuje żądania w których nazwą kontrolera jest index lub te w których nie podano nazwy kontrolera. Metoda indexAction() obsługuje żądania w których akcją jest index. Zapamiętaj że index jest domyślną wartością dla nazwy zarówno kontrolera jak i akcji. Jeśli spróbujesz wywołać adresy /, /index, or /index/index, to wykonana zostanie metoda indexAction() (ukośniki na końcu adresów nie mają żadnego znaczenia). Żądanie do innych kontrolerów czy akcji spowoduje wystąpienie błędu.
Jest jeszcze jedna użyteczna metoda ktorą dodamy do kontrolera IndexController. Metoda noRouteAction() jest wywoływana zawsze gdy jest zażądany kontroler który nie istnieje. Na przykład, wywołanie adresu /foo/bar uruchomi akcję noRouteAction() jeśli kontroler FooController.php nie istnieje. Jednak wywołanie /index/foo still spowoduje wyświetlenie błędu, ponieważ foo jest nazwą akcji, a nie kontrolera.
Dodaj akcję noRouteAction() w pliku IndexController.php:
-
<?php
-
-
Zend::loadClass('Zend_Controller_Action');
-
-
class IndexController extends Zend_Controller_Action
-
{
-
public function indexAction()
-
{
-
echo 'IndexController::indexAction()';
-
}
-
-
public function noRouteAction()
-
{
-
$this->_redirect('/');
-
}
-
}
-
-
?>
Ten przykład używa metody $this->_redirect('/') aby pokazać możliwą akcję jaką możemy wykonać w akcji noRouteAction(). To powoduje, że żądania do nieistniejących kontrolerów będą przekierowane do głównego dokumentu (strony głównej).
Teraz utwórzmy plik FooController.php:
Jeśli teraz wywołamy adres /foo/bar, powinna zostać wywołana akcja barAction(), ponieważ nazwą akcji jest bar. Nie dość, że aplikacja obsługuje przyjazne adresy URL, to robi to w bardzo dobrze zorganizowany sposób. A uzyskaliśmy to zaledwie kilkoma linijkami kodu.
Możesz także utworzyć metodę __call() aby obsługiwać żądania do akcji które nie istnieją na przykład do /foo/baz:
-
<?php
-
-
Zend::loadClass('Zend_Controller_Action');
-
-
class FooController extends Zend_Controller_Action
-
{
-
public function indexAction()
-
{
-
echo 'FooController::indexAction()';
-
}
-
-
public function barAction()
-
{
-
echo 'FooController::barAction()';
-
}
-
-
public function __call($action, $arguments)
-
{
-
echo 'FooController:__call()';
-
}
-
}
-
-
?>
Teraz mamy już elegancką obsługę żądań przychodzących i możemy kontynuować.



To miłe, że pofatygowałeś się z przetłumaczeniem tutoriala do Zend Framework. Czytanie tego rodzaju opracaowań jest bardziej przyjazne niż sucha lektura dokumentacji, a czytanie w rodzimym języku to wręcz luksus. Robisz fajną robotę ulatwiajac pierwszy kontakt z tym frameworkiem - mowie tu zarówno o powyższym tekscie, jak i o strone http://zf.naruniec.info/. Tak przy okazji czy to (http://framework.zend.com/developer/changeset/589) tlumaczenie tez jest Twojego autorstwa?