Zend Framework-使用setBaseUrl模拟URL中的国家/地区子文件夹

时间:2011-11-20 13:25:46

标签: zend-framework routing

我正在构建一个具有传统目录结构的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。

在我看来,我在设置自定义路线之前调度前控制器。有谁知道这样做的正确方法?

1 个答案:

答案 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中不存在)来说出你最喜欢的语言