带有zend框架的Url语言前缀


Url language prefix with zend framework

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

routes.page.route = :slug

我在bootstrap中有一个这样的调用:

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?

要做到这一点,你需要链接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下有相同的内容是不好的。重定向更合适。