我正在用传统的目录结构构建一个Zend Framework网站,即
www.example.com/controller/action我想插入国家代码到url即
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);
}
这一切都与标准url完美配合,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);
}
我应该能够输入一个url,如:
www.example.com/us/local/dallas/01和Zend Router应该带我到本地控制器中的目录操作,以及参数place = 'dallas'和index = '01'
但是,会抛出错误。删除url的/us部分会抛出相同的错误,即
致命错误:在C:vhostsdev.startyobusiness.comapplicationcontrollersErrorController.php第49行调用非对象的成员函数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。
在我看来,在自定义路由设置之前,我正在调度前端控制器。有人知道正确的方法吗?
你不需要剥离或做复杂的事情。你可以添加一条新路线。进入你的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是一个伪常量(我的意思是它在PHP中不存在)来表示你最喜欢的语言