如何在zend框架视图中使用$ this - > _()?

Vex*_*tus 3 php model-view-controller translation zend-framework

在我的ZF 1.11应用程序中,我将我的翻译器存储在注册表中,如下所示:

Zend_Registry::set('Zend_Translate', $translator);
Run Code Online (Sandbox Code Playgroud)

所以在我的视图脚本中,我可以这样访问翻译器:

$this->translate('abc');
Run Code Online (Sandbox Code Playgroud)

是否有任何聪明的方法可以使用此调用:

$this->_('abc');
Run Code Online (Sandbox Code Playgroud)

使用$ this-> translate会使视图变得混乱,而且很多人习惯于看到_().

mar*_*kus 6

虽然我普遍同意函数/方法名称应该有意义的概念,但我也同意_()翻译是一种广泛使用的标准,因此是可以接受的.

您可以通过向中间层添加包装器来完成此操作.例如,以下内容将使该方法可用于从MyProject_Controller_Action以下派生的所有控制器:

class MyProject_Controller_Action extends Zend_Controller_Action 
{
    protected $translator;

    public function init()
    {
        $this->translator = Zend_Registry::get('Zend_Translate');
    }



   /**
    * Translator wrapper
    * 
    * @param string $string The string to be translated
    * @return string $translated The translated string
    */
    protected function _($string)
    {
        $translated = $this->translator->translate($string);
        return $translated;
    }
}
Run Code Online (Sandbox Code Playgroud)

当然也可以这样做Zend_View.

免责声明:通过直接调用注册表来混淆代码并不是最好的做法.实际上它是一个反模式,应该被DI取代.Zend Framework 2将使我们更容易避免注册表.可以通过构造函数将转换对象实际注入到类中来改进此代码.


Yes*_*rry 5

不,不是我所知道的.无论如何,有几个与此相关的隐含问题.首先,您应该始终为函数(以及相关的变量)提供有意义的名称.也就是说,__()根本不是一个有意义的名字.事实上,恰恰相反,它没有任何意义.其次,最佳做法是使用下划线仅为 前缀privateprotected函数(以及相应的变量).

最后,通过zend视图帮助程序的工作方式,如果名为__(),您几乎必须对系统进行"欺骗"以定位视图助手.你必须将它命名为类似的东西Zend_View_Helper___并且不起作用.更不用说,这需要为您的文件命名__.php.

我想你可以命名你的助手Zend_View_Helper_T,在这种情况下你可以翻译东西$this->t($string);(我测试了它并且它有效),但你应该再次使用有意义的名字.


编辑

直到现在还没有意识到你想从控制器中调用它,我决定修改我的答案,并对我从下选民收到的评论给出一点反馈.

由于以下原因,很难建议您创建一个包装类Zend_Controller_Action来创建函数_():

  • 因为无论它是否是"公认标准",我都重申所有方法和变量都应该有一个有意义的名称.我必须坚持这一点,因为我坚信遵循明确的编码标准(与那些不直接对应于已知 - 从而信任 - 范式的"传闻"或"最近采用的"实践相反).也就是说,如果PEAR,甚至Zend决定在某一天采取这种激进的改变,我将辞去我的性格.注意:可以说可靠的公司如Drupal及其自称的最佳实践可被视为明确的编码标准,但我不同意.为什么?因为PEAR ......好吧......它是梨子.Zend是"PHP公司".很难获得比这更可信的东西.如果有人不同意最后的陈述,请说明原因或纠正我而不是投票.无论如何,标准仅仅是一项不需要的建议; 因此,他们应该这样对待.所以,我想只要你遵循一些标准,那就太好了!毕竟这些不是规则.

尽管如此,Markus的解决方案除了功能名称之外还很好(原因如前所述).我唯一要改变的是Zend_Registry::get()_()函数的调用.如果你打算像你提到的那样调用那个函数,那么像这样的东西可能会更好:

class MyProject_Controller_Action extends Zend_Controller_Action 
{
    /**
     * the translator object
     * @var Zend_Translate
     */
    protected $_translator;

    public function init()
    {
        $this->_translator = Zend_Registry::get('Zend_Translate');
    }

    /**
     * note my new method name, you don't have to use it but I still
     * recommend it. the name is just a suggestion, if you prefer something
     * like _translate() or _trnslte() then by all means (although I don't
     * recommend abbreviations unless they're super obvious I guess).
     */
    protected function _trans($string)
    {
        return $this->_translator->translate((string) $string);
    }
}
Run Code Online (Sandbox Code Playgroud)