По-умолчанию в схеме маршрутизации Zend Framework используется дефолтный маршрут. Он добавляется непосредственно перед началом процесса маршрутизации, в методе Zend_Controller_Router_Rewrite::route()
Дефолтный маршрут - это объект класса Zend_Controller_Router_Route_Module. При создании этого объекта в его конструктор передаются объекты диспетчера и запроса.
И тут есть такая тонкость: в конструкторе объекта дефолтного маршрута параметры диспетчера и запроса указаны как необязательные. Может возникнуть предположение, что если в конструктор не были переданы эти объекты, то они автоматически инициализируются внутри дефолтного роута. Так вот - это не так.
Если вы собрались переопределить Zend_Controller_Router_Route_Module, то не забывайте при инстанцировании своего класса всегда передавать в него диспетчер и объект запроса - иначе долго будете искать ошибку, почему ничего не работает (как я искал):
$front = Zend_Controller_Front::getInstance();
$front->getRouter()->addRoute('default',
new My_Controller_Router_Route_Module(
array(
'lang' => 'en',
'module' => 'application',
'controller' => 'index',
'action' => 'index',
),
$front->getDispatcher(),
$front->getRequest()
)
);
Мне не ясно, почему разработчики ZF сделали опциональными те два параметра. По-моему, их стоило бы сделать обязательными, тогда таких ошибок можно было бы не допускать.