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

Php 如何使用$this->_()在zend框架视图中?,php,model-view-controller,zend-framework,translation,Php,Model View Controller,Zend Framework,Translation,在我的ZF 1.11应用程序中,我将我的转换器存储在注册表中,如下所示: Zend_Registry::set('Zend_Translate', $translator); 因此,在我的视图脚本中,我可以通过以下方式访问转换器: $this->translate('abc'); 是否有任何聪明的方法可以使用此呼叫: $this->_('abc'); 使用$this->translate会把视图弄得乱七八糟,而且很多人都习惯于看()了。不,据我所知不是这样。无论如何,有几个隐含

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

Zend_Registry::set('Zend_Translate', $translator);
因此,在我的视图脚本中,我可以通过以下方式访问转换器:

$this->translate('abc');
是否有任何聪明的方法可以使用此呼叫:

$this->_('abc');

使用$this->translate会把视图弄得乱七八糟,而且很多人都习惯于看()了。

不,据我所知不是这样。无论如何,有几个隐含的问题与此相关。首先,您应该始终提供函数(以及变量)。这就是说,
\uu()
根本不是一个有意义的名字。恰恰相反,事实上,它没有任何意义。其次,最好的做法是在函数(以及变量)前面加下划线,仅在
private
protected
函数前面加下划线

最后,按照zend view helper的工作方式,如果视图helper的名称为_()的话,您几乎必须排序“欺骗”系统来定位它。您必须将其命名为
Zend\u View\u Helper\uuuuuuuuuu
,但这不起作用。更不用说,这将需要将您的文件命名为
\uu.php

我想你可以把你的助手命名为
Zend\u View\u helper\u T
,在这种情况下,你可以使用
$this->T($string)翻译东西(我对此进行了测试,它可以正常工作),但您应该始终使用


编辑

直到现在,我还没有意识到你想从控制员内部打电话给我,所以我决定修改我的答案,并就我从投票人那里收到的评论给出一些反馈

由于以下原因,很难建议您为
Zend\u Controller\u Action
创建一个包装类,以便在其中创建函数

  • 因为不管它是否是一个“公认的标准”,我 重申所有方法和变量都应具有 有意义的名字。我必须坚持这一点,因为我坚信 遵循明确的编码标准(与那些“传闻”相反) 或“最近采用的”实践,这些实践与 已知的,因而值得信赖的范式)。也就是说,应该是梨,还是 即使是Zend,如果有一天我决定采取这样一个彻底的改变,我也会的 放弃我的性情。注:可以认为 像Drupal这样的公司及其自称的最佳实践可以 被认为是明确的编码标准,但我不同意。为什么?因为 梨是…嗯…它是梨。Zend是“PHP公司”,这很难 要比这更可信。如果有人不同意最后一点 声明请说明原因或纠正我,而不是否决投票。不管怎样,标准 仅仅是一个不需要的建议;因此,应将其视为 这样的所以,我想只要你遵循一些标准,那就好了!这些 毕竟不是规则
尽管如此,除了函数名之外,markus的解决方案还是不错的(出于前面所述的原因)。我唯一要更改的是调用
\u0()
函数中的
Zend\u 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);
    }
}

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

可以通过向中间层添加包装器来实现这一点。例如,以下方法将使从
MyProject\u Controller\u 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;
    }
}
当然,使用
Zend_View
也可以做到这一点


免责声明:直接调用注册表并不是最好的做法。实际上,这是一种反模式,应该被DI所取代
Zend Framework 2
将使我们更容易避开注册表。通过构造函数将翻译对象实际注入类中,可以改进此代码。

在任何类型的软件开发中,聪明通常都是不受欢迎的,因为除了作者之外,其他人必须在某个时候阅读和理解代码。简单总比聪明好,但只有当它也清楚的时候。-1因为你的答案有些部分是错误的。a) 我同意有意义的名字的主题,但下划线翻译是一个广泛使用的标准,是可以理解的。b) 在现代IDE的背景下,不再需要或建议使用和下划线作为私有和受保护方法的前缀。c) 这可以在没有任何帮助的情况下完成。我想他说的是Zend编码标准,该标准不允许将uncore作为函数名,而函数名应该是有意义的。关于插件路径/类名,他是对的,让这个视图助手工作起来会很棘手。1)你是最正确的Kees,这就是我所指的;除了我指的是梨标准,而不是Zend。2) 视图助手:我想他会从视图调用translate函数,而不是从控制器调用(在我看来,它变化很大)。谢谢你的两条评论!)@当我在我的回答中写道,你可以用Zend_View做同样的事情!My_View扩展了Zend_View…如果他像他说的那样使用translate,那么最好在构造函数中设置类似于
$this->_translator
的内容,这样你就不必每次调用函数时都从注册表中获取它。我会按照建议对其进行改进。但我仍然不同意protected/private的下划线变量。现代IDE使这成为一种过时的做法。lol很公平。我想对我来说,很难改掉这个特殊的习惯,尤其是因为我所有的同事都采用了这个习惯。不过我尊重你的意见。干杯请记住,此方法只传递第一个参数,限制您翻译没有变量的项。。。通常人们会叫$this->translate('马上打开这扇门')