Zend框架-使用setBaseUrl来模拟URL中的国家子文件夹



我正在用传统的目录结构构建一个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中不存在)来表示你最喜欢的语言

最新更新