【问题标题】:Url language prefix with zend framework带有 zend 框架的 URL 语言前缀
【发布时间】:2013-06-19 12:41:20
【问题描述】:

我迷失在 Zend Framework 的 url 重写中! 我有一个这样的route.ini

routes.page.route = :slug

我在引导程序中有这样的电话:

protected function _initRoutes() {

    $uri = explode('/', $_SERVER['REQUEST_URI']);

    if (!in_array('admin', $uri)) {
        //$front = Zend_Controller_Front::getInstance();

        $config = new Zend_Config_Ini(APPLICATION_PATH . '/configs/routes.ini');
        $router = $front->getRouter();
        $router->addConfig($config, 'routes');

        $front->registerPlugin(new Rez_Controller_Plugin_Routing(), 2);
    }
}

插件是这样的:

class Rez_Controller_Plugin_Routing extends Zend_Controller_Plugin_Abstract {

public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request) 
{
    $item_db = new Application_Model_DbTable_Item();

    if(NULL != $request->getParam("slug")){

        if("admin" == $request->getParam("slug")){

            $request->setModuleName('admin');
            $request->setControllerName("index");
            $request->setActionName('index');

        }

        $page = $item_db->getPage($request->getParam("slug"));

        if(FALSE == $page){

            $request->setModuleName('default');
            $request->setControllerName($request->getParam("slug"));
            $request->setActionName('index');

            return;

        }else{

           if(NULL !== $request->getParam("language")){
             $page["lang"] = $request->getParam("language");
           }

            $request->setModuleName('default');
            $request->setControllerName("index");
            $request->setActionName('page');
            $request->setParams($page);

            return;

        }

    }
}

问题是我必须在 URL "htttp://mywebsite.com/en/a-simple-page" 中添加语言前缀,只有当浏览器的语言是英语或用户点击了英语标志时,否则 URL 必须像 "http://mywebsite.com/a-simple-page"

我试图在 route.ini 中添加这个:

routes.page.route = :language/:slug
routes.page.reqs.language = "^(en|nl)$"
routes.page.defaults.language = "nl"

但是当我尝试"http://mywebsite.com/a-simple-page" 时它不起作用,而"http://mywebsite.com/en/a-simple-page" 工作并且我可以在插件中获取参数。即使语言代码不在 URL 中,如何使其接受所有 URL?

【问题讨论】:

  • 我设法通过在 route.ini 中添加更多路由来解决我的问题
  • 只是一个建议,为什么不使用 PHP 检测用户语言,然后使用会话存储呢?在网站顶部显示一个小标志选项,例如graphicz.co.uk/en检测语言:dyeager.org/blog/2008/10/…

标签: php zend-framework url url-rewriting


【解决方案1】:

为此,您需要链接 2 条路线。

resources.router.routes.defaultmodule.type = Zend_Controller_Router_Route_Module
resources.router.routes.defaultmodule.abstract = On    
resources.router.routes.defaultmodule.defaults.module = "default"

resources.router.routes.locale.type = Zend_Controller_Router_Route
resources.router.routes.locale.route = ":locale"
resources.router.routes.locale.reqs.locale = "^(en)$"
resources.router.routes.locale.defaults.locale = "nl"

resources.router.routes.default.type = Zend_Controller_Router_Route_Chain
resources.router.routes.default.chain = "locale,defaultmodule"

请记住,由于 SEO 的影响,在 2 个网址下拥有相同的内容并不好。重定向会更合适。

【讨论】:

  • 这两个url的内容不一样,一个是英文的,一个是荷兰文的。
  • 请看看我改进后的答案。我希望这会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-03
  • 2020-07-20
  • 2012-08-16
  • 2014-02-13
  • 2011-02-18
  • 1970-01-01
相关资源
最近更新 更多