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.