我正在构建一个具有传统目录结构的Zend Framework站点,即
www.example.com/controller/action
我想将国家/地区代码插入到网址中,即
www.example.com/us/controller/action
我想将baseUrl修改为/ us,以便Zend路由器将其从URL中删除并正确分配控制器和操作。如果我不修改baseUrl设置,Zend路由器会认为控制器是'us',操作是'controller'。
为实现这一目标,我尝试在bootstrap.php中添加一个新函数,如下所示:
protected function _initBaseUrl() {
$region = "us";
$front_controller = Zend_Controller_Front::getInstance();
$request = new Zend_Controller_Request_Http();
$request->setBaseUrl($request->getBaseUrl() . '/' . $region);
$front_controller->dispatch($request);
}
这一切都与标准网址完美配合,Zend路由器能够在根据需要确定路由之前剥离国家/地区代码。
不幸的是,当我在图片中添加自定义路线时,一切都会出错。如果我在bootstrap.php中创建一个自定义路由,如下所示:
public function _initRoutes() {
$frontController = Zend_Controller_Front::getInstance();
$router = $frontController->getRouter();
$route = new Zend_Controller_Router_Route(
'/local/:place/:index',
array(
'controller' => 'Local',
'action' => 'directory'
)
);
$router->addRoute('place', $route);
}
我应该可以输入一个网址:
www.example.com/us/local/dallas/01
和Zend Router应该带我到Local控制器中的目录操作以及参数place ='dallas'和index ='01'
然而,这会引发错误。删除url的/ us部分会引发相同的错误,即
致命错误:在第49行的C:\ vhosts \ dev.startyobusiness.com \ application \ controllers \ ErrorController.php中的非对象上调用成员函数hasResource()
ErrorController.php文件如下所示:
public function getLog()
{
$bootstrap = $this->getInvokeArg('bootstrap');
if (!$bootstrap->hasResource('Log')) {
return false;
}
$log = $bootstrap->getResource('Log');
return $log;
}
其中第49行是if语句的第一行。我测试了前一行和
$bootstrap = $this->getInvokeArg('bootstrap');
为$ bootstrap返回null。
在我看来,我在设置自定义路线之前调度前控制器。有谁知道这样做的正确方法?
答案 0 :(得分:4)
你不需要剥离或做复杂的事情。您只需添加新路线即可。转到您的Bootstrap.php并添加此方法:
protected function _initRoutes()
{
$Router = Zend_Controller_Front::getInstance()->getRouter();
$Route = new Zend_Controller_Router_Route(
':language/:controller/:action/*',
array(
'language' => MAIN_LANGUAGE,
'controller' => 'index',
'action' => 'index'
),
array(
'language' => '[a-z]{2}'
)
);
$Router->addRoute('language-controller-action', $Route);
}
注意:MAIN_LANGUAGE是一个伪costant(我的意思是它在PHP中不存在)来说出你最喜欢的语言