2012-06-19 6 views
3

Я пытаюсь использовать перевод в пользовательской веточке фильтре, как этотSymfony2: использовать переводчик в расширении веточки фильтра

public function formatTime($timestamp) 
{ 
    $str = date('j %\m%',$timestamp); 
    $str = str_replace($str, '%m%', $this->get('translator')->trans('month'.date('m', $timestamp))); 
    return $str; 
} 

Offcourse получает неизвестная функция. Должен ли я уведомить об этом Extension об окружающей среде или просто запросить класс перевода, чтобы сделать его доступным?

ответ

11

Вы можете придать translator услугу в своем классе:

<service id="acme.extension" class="Acme\Twig\Extensions\FormatterExtension"> 
    <tag name="twig.extension"/> 
    <argument type="service" id="translator"/> 
</service> 

А затем хранить экземпляр переводчика в защищенной области и использовать его в дальнейшем:

public function formatTime($timestamp) 
{ 
    $str = date('j %\m%',$timestamp); 
    $str = str_replace($str, '%m%', $this->translator->trans('month'.date('m', $timestamp))); 
    return $str; 
} 

UPD1: конфигурацию Определение службы YAML:

acme.extension: 
    class: Acme\Twig\Extensions\FormatterExtension 
    arguments: [@translator] 
    tags: 
     - name: twig.extension 
+0

Моя служба определяется в файле конфигурации YML, я полагаю, он хотел бы это: twig.extension.rc_extension: класс: Acme \ Twig \ Extensions \ FormatterExtension аргументы: - {тип: услуги, идентификатор: переводчик} теги: - {name: twig.extension} – svassr

+0

Добавлено обновление для формата YAML. – lisachenko

+3

Термин «Инъекция зависимостей» - это '@ translator.default' от Symfony 2.6, тэг' @ translator' относится к LoggingTranslator. – Lashae

3

Я бы определил ваш класс как услугу, используя контейнер обслуживания. Затем можно передать в службу переводчика в качестве аргумента, как это:

в services.yml:

services: 
    your.class.identification.key: 
     class: \your\class\name 
     arguments: [@translator] 

впоследствии, переводчик будет доступна через код, который вы Приведенную выше.

+0

Dependency Injection тег является '@ translator.default' на Symfony 2.6,' @ translator' тег относится к LoggingTranslator в настоящее время. – Lashae

1

Внутри уровня контроллера $this->get() вызывает метод get из службы переводчика.

Чтобы подражать этому поведению, вы можете установить инъекцию зависимостей и добавить контейнер зависимостей к вашему конструктору. Как только вы это сделаете, вы можете получить переводчик, используя что-то вроде этого: $this->container->get('translator').

1

Просто обновите @Alexander. Не забудьте поставить

private $translator; 
public function __construct(TranslatorInterface $translator) { 
    $this->translator = $translator; 
}