【问题标题】:Zend Framework- Use setBaseUrl to simulate country sub-folders in URLZend Framework - 使用 setBaseUrl 模拟 URL 中的国家子文件夹
【发布时间】: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。

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

【问题讨论】:

    标签: zend-framework routing


    【解决方案1】:

    您无需脱衣或做复杂的事情。您可以添加一条新路线。转到您的 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 中不存在)表示你最喜欢的语言

    【讨论】:

    • 您好奥雷里奥,感谢您的帮助。您的解决方案几乎就是我在尝试当前解决方案之前所拥有的。在自定义路线的数量失控之前效果很好,所以我认为必须有更好的方法来做到这一点。我不明白语言映射到 [a-z]{2} 的第二个数组。
    • @MikeKelly 请注意,此路由对控制器-动作的所有组合都有效,而不仅仅是索引/索引。您看到的第一个数组只是设置 default 值。第二个是对 vars 进行测试(在这种情况下,测试语言是两个字母字符)。
    猜你喜欢
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 2015-07-24
    相关资源
    最近更新 更多