Dec 11 2008
Zend Framework: Hostname routing
O routování subdomén v Zend Framework (ZF) jsem už v jednom článku psal. Kolega mě upozornil, že v současném ZF 1.7.0 již takové routování je v podobě třídy Zend_Controller_Router_Route_Hostname. V době psaní předchozího článku byla k dispozici pouze verze ZF 1.5.0, která routování domén a subdomén nepodporovala. Prošel jsem proto dokumentaci ZF abych zjistil, od kdy je tato nová vlastnost podporována.
První zmínka je ve verzi ZF 1.5.3 (2008-07-28) -viz zend.controller.router.html
, kapitola Hostname routing staticky:
$route = new Zend_Controller_Router_Route( array( 'host' => 'blog.mysite.com', 'path' => 'archive' ), array( 'module' => 'blog', 'controller' => 'archive', 'action' => 'index' ) ); $router->addRoute('archive', $route);
a dynamicky:
$route = new Zend_Controller_Router_Route( array( 'host' => array( 'regex' => '([a-z]+).mysite.com', 'reverse' => '%s.mysite.com' 'params' => array( 1 => 'username' ) ), 'path' => '' ), array( 'module' => 'users', 'controller' => 'profile', 'action' => 'index' ) ); $router->addRoute('profile', $route);
V této verzi se tedy používal standardní Zend_Controller_Router_Route rozšířený o možnosti routovaní domén a subdomén.
Zend_Controller_Router_Route_Hostname
Překvapující je, že kapitola o routování domén a subdomén mizí od dokumentace ZF 1.6.2 do verze ZF 1.7.0 Preview. Že by chybka? Nebo záměr? Další zmínka se objevuje až v současné verzi online dokumentace, kdy je aktuálně k dispozici Zend Framework 1.7.1. V současné verzi to vypadá tak, že princip routování domén a subdomén doznal zásadních změn a proto byl rozdělen a vznikla vlastní třída pro Zend_Controller_Router: Zend_Controller_Router_Route_Hostname.
Použití je poměrně jednoduché, a můžete routovat všechno včetně třeba TLD:
$routa = new Zend_Controller_Router_Route_Hostname( ':subdomena.domena.cz', array( 'controller' => 'index', 'action' => 'index' ) ); $router->addRoute('hostname', $routa);
Takto nadefinovaná routa začne fungovat na všechny URL s definovanou subdoménou, tedy např.: http://www.domena.cz ale nebude fungovat na http://domena.cz – neobsahuje subdoménu.
Zajímavější je však již zmíněná možnost routovat doménu druhého i prvního řádu (TLD):
$routa = new Zend_Controller_Router_Route_Hostname( ':subdomena.:domena.:tld', array( 'controller' => 'index', 'action' => 'index' ) ); $router->addRoute('hostname', $routa);
což funguje úžasně, přesně podle očekávání, takže na URL http://www.domena.cz (v IndexController.php a action indexAction
vypíšeme $this->getRequest()->getParams()
):
array ( 'subdomena' => 'www', 'domena' => 'domena', 'tld' => 'cz', 'controller' => 'index', 'action' => 'index', )
V dokumentaci Zendu ještě navíc doporučují použít zřetězení této routy s nějakou předchozí definovanou “path” routou proto, aby se tyto parametry nepřenášely pro každé domény či subdomény ale pouze pro určité URL.
A na závěr klasicky, oficiální odkaz on-line dokumentaci zendu.
Comments Off