Php 如何使用$this->_()在zend框架视图中?
在我的ZF 1.11应用程序中,我将我的转换器存储在注册表中,如下所示: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会把视图弄得乱七八糟,而且很多人都习惯于看()了。不,据我所知不是这样。无论如何,有几个隐含
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('马上打开这扇门')