【发布时间】:2012-01-02 08:38:57
【问题描述】:
我正在构建一个具有传统目录结构的 Zend Framework 站点,即
www.example.com/controller/action
我想在网址中插入国家代码,即
www.example.com/us/controller/action
我想将 baseUrl 修改为 /us,以便 Zend 路由器将其从 url 中删除,并正确分配控制器和操作。如果我不修改baseUrl设置,Zend Router会认为controller是'us',action是'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);
}
我应该可以输入如下网址:
www.example.com/us/local/dallas/01
Zend Router 应该将我带到本地控制器中的目录操作以及参数 place = 'dallas' 和 index = '01'
但是,这会引发错误。删除网址的 /us 部分会引发相同的错误,即
致命错误:在 C:\vhosts\dev.startyobusiness.com\application\controllers\ErrorController.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。
在我看来,我在设置自定义路由之前调度了前端控制器。有谁知道这样做的正确方法吗?
【问题讨论】: