Intereting Posts
Использование блока checkbox PHP с помощью метода GET Добавление нескольких маркеров на Картах Google из базы данных MySQL Анонимная функция PHP вызывает синтаксическую ошибку при некоторых установках mysql заявление о дате последнего месяца Как зарегистрировать путь в автозагрузке с помощью одного экземпляра. Как получить разницу в секундах в PHP? Выполнение Curl с PHP Путь к папке с localhost Почему «нет такого файла или каталога … autoload.php» при доступе к приложению Laravel? Полученные значения PHP SimpleXML имеют странные символы вместо дефис и апострофов Что такое использование конструктора в абстрактном классе в php Почему пустой ожидает T_PAAMAYIM_NEKUDOTAYIM, когда задана не переменная? Как проверить, разрешает ли друг мне опубликовать на стене или не использовать php sdk Facebook XMPP Chat API отправить сообщение PHP (# 200) Пользователь не разрешил приложению выполнить это действие facebook php api error?

Как использовать $ this -> _ () в представлениях среды zend?

В моем приложении ZF 1.11 я сохраняю свой переводчик в реестре следующим образом:

Zend_Registry::set('Zend_Translate', $translator); 

Поэтому, по моему мнению, скрипты я могу получить доступ к переводчику следующим образом:

 $this->translate('abc'); 

Есть ли какой-нибудь умный способ использовать этот вызов:

 $this->_('abc'); 

Использование $ this-> translate загромождает взгляды, и многие люди привыкли видеть _ () в любом случае.

В то время как я в целом согласен с тем, что имена функций / методов должны быть значимыми, я также согласен с тем, что _() для переводов является широко используемым стандартом и поэтому приемлемым.

Вы можете сделать это, добавив обертки к вашим промежуточным слоям. Например, следующее может сделать этот метод доступным для всех ваших контроллеров, полученных из 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; } } 

Конечно же, это можно сделать и с Zend_View .

Отказ от ответственности: это не самая лучшая практика, чтобы загромождать ваш код прямыми вызовами в реестре. На самом деле это анти-шаблон, который следует заменить DI. Zend Framework 2 упростит нам работу с реестром. Этот код можно было бы улучшить, фактически введя объект трансляции в класс через конструктор.

Нет, не то, что я знаю. В любом случае есть несколько неявных вопросов, связанных с этим. Во-первых, вы должны всегда давать функции (и переменные, если на то пошло) значимые имена . Тем не менее, __() не является значимым именем вообще. Наоборот, это не имеет никакого значения. Во-вторых, считается лучшей практикой префикс только private и protected функций (и, опять же, переменных, если на то пошло) с подчеркиванием.

Наконец, благодаря тому, как работают помощники вида zend view, вам в значительной степени придется сортировать «трюк» системы, чтобы найти ваш помощник вида, если он был назван __ (). Вы должны называть его чем-то вроде Zend_View_Helper___ и это не сработает. Не говоря уже о том, что это повлечет за собой необходимость называть ваш файл __.php .

Полагаю, вы могли бы назвать своего помощника Zend_View_Helper_T , и в этом случае вы могли бы перевести материал, используя $this->t($string); (Я тестировал это, и он работает), но снова вы всегда должны использовать значащие имена .


редактировать

Не осознав, что вы хотели называть это изнутри контроллера до сих пор, я решил пересмотреть свой ответ и дать небольшую обратную связь о комментарии, который я получил от избирателя.

Трудно рекомендовать создать класс-оболочку для Zend_Controller_Action в котором можно создать функцию _() по следующей причине:

  • Потому что, независимо от того, что это «принятый стандарт» или нет, я повторяю, что все методы и переменные должны иметь осмысленное имя. Я должен утверждать это, потому что я твердо убежден в соответствии с явными стандартами кодирования (в отличие от тех «слухов» или «недавно принятых» практик, которые непосредственно не соответствуют известной и, следовательно, доверенной – парадигме). Тем не менее, если PEAR или даже Zend решит однажды принять такое радикальное изменение, я отставлю свое решение. ПРИМЕЧАНИЕ. Можно утверждать, что заслуживающие доверия компании, такие как Drupal и их самопровозглашенные передовые методы, могут считаться явными стандартами кодирования, но я не согласен. Зачем? Потому что PEAR … ну … это 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); } }