用模块实现Zend_Locale和Zend_Translate



我在互联网上搜索了一个很好的解决方案,将Zend_Locale和Zend_Translate集成到一个模块化结构中。这是我想要的结束路径:

http://url/: lang/模块/:控制器/动作
http://url/: lang/:控制器/动作
http://url/:module/:controller/:action <=应使用默认语言环境

我看过很多使用路由器的教程,但似乎没有一个适合我。有人能帮我解决这个问题吗?

谢谢!

这里的第一个问题是,当使用路由时,你需要有非常具体的约束,以便与这么多变量匹配规则。

我建议不要同时接受//url/:lang/:module/:controller/:action和//url/:module/:controller/:action,而只使用第一个结构。这样一来,就更容易将第一条规则与这一条//url/:lang/:controller/:action隔离开来,这样就只有2条规则,每条规则都有不同的"单词"(url部分)。

$withModule = new Zend_Controller_Router_Route(
    ':lang/:module/:controller/:action',
    array()
);
$withoutModule = new Zend_Controller_Router_Route(
    ':lang/:controller/:action',
    array(
        'module' => 'default'
    )
);
$router->addRoute('withModule', $withModule);
$router->addRoute('withoutModule', $withoutModule);

在第一个路由中,你没有指定任何默认值,所以它不会匹配第二个路由的url,而在第二个路由中,你默认了模块(因为ZF需要那个信息)。

对于第三条规则,我建议使用一个基本祖先控制器,比如MyLib_Controller,并在它的init()方法中验证是否接收到语言参数,如下面的例子所示:

if(!$this->_getParam('lang')) {
    //this should cover the 3rd use case
    $this->_redirect('/en/' + $this->view->url(), array('exit' => true, 'prependBase' => false));
} else {
    //setup Zend_Translate
}

另一种可能是将:lang变量限制为只有两个字母的单词,但这会产生问题,我宁愿避免它。

相关内容

  • 没有找到相关文章

最新更新