Как использовать $ this -> _ () в представлениях Zend Framework? - PullRequest
3 голосов
/ 15 ноября 2011

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

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

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

$this->translate('abc');

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

$this->_('abc');

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

Ответы [ 2 ]

6 голосов
/ 16 ноября 2011

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

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

5 голосов
/ 15 ноября 2011

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

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

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


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

До сих пор не осознав, что вы хотите вызвать его из контроллера , я решил пересмотреть свой ответ и дать небольшой отзыв о комментарии, который получил от нижестоящего избирателя.

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

  • Потому что, независимо от того, является ли он "принятым стандартом" или нет, я подтвердите, что все методы и переменные должны иметь осмысленное имя. Я должен утверждать это, потому что я твердо верю в следующие явные стандарты кодирования (в отличие от этих "слухов" или «недавно принятые» практики, которые не соответствуют известная - и, следовательно, доверенная - парадигма). Тем не менее, должен груша, или даже Зенд, решит принять такое радикальное изменение однажды, я буду смирись с моим нравом. ПРИМЕЧАНИЕ: можно утверждать, что заслуживающие доверия такие компании, как Drupal и их самопровозглашенные лучшие практики могли считаться явными стандартами кодирования, но я не согласен. Зачем? Так как Груша ... ну ... это груша. А Zend - это «Компания PHP». Это тяжело чтобы получить больше доверия, чем это. Если кто-то не согласен с этим последним Скажите, пожалуйста, почему или поправьте меня вместо того, чтобы голосовать «вниз». Независимо от стандартов просто предложение не требуется; следовательно, они должны рассматриваться как например. Итак, я думаю, если вы следуете некоторым стандартам, это хорошо! Эти в конце концов, это не правила.

Тем не менее, решение Маркуса было хорошим, кроме имени функции (по причинам, указанным ранее). Единственное, что я хотел бы изменить - это вызов 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);
    }
}
...