2016-01-29 3 views
1

У меня есть очень специализированный фильтр, который я хочу использовать для одной страницы, не делая его глобальным фильтром. Я попытался сделать это (то есть не функция, которую я хочу, это просто тест):Как добавить локальное расширение Twig с контроллера

$this->get('twig') 
    ->addFilter(new \Twig_SimpleFilter('chgname', function ($string) { 
     return substr($string, 0, 5); 
    })); 

Но я получаю сообщение об ошибке «Не удалось добавить фильтр в качестве расширения уже инициализирована».

Я знаю, что я могу создать класс в каталоге AppBundle/Twig и добавить его в качестве сервиса, но 1) Это невероятно тяжело и PITA для простого фильтра, который мне нужен, и 2) Он делает его глобальным для всего приложения, которое глупо для чего-то, что мне нужно локально.

Есть ли способ сделать это, или я придерживаюсь только глобальных расширений? Заранее спасибо.

+0

Если вы хотите, чтобы это сделать локально, просто используйте 'substr()' в контроллере и передайте результат на веточку. – malcolm

+1

Он сказал, что это не функция, которую он хочет. Я должен спросить op, хотя, что не так, используя его глобально для вашего пакета/приложения? Это правильный способ сделать это, это не тяжело, и какое это имеет значение, если оно «глобальное» или нет? –

+0

Почему у вас локальные переменные? Почему бы не сделать их глобальными? Почему бы не сделать все функции глобальными? Ответ заключается в том, что плохой практикой является загрязнение вашего пространства имен функциями, которые не обязательно должны быть глобальными. В этом случае это очень специфическая функция форматирования для одной страницы, которая не применима нигде в приложении. Глупо сделать простую одноразовую глобальную функцию. – Nairebis

ответ

0

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

, если вы думаете, Symfony слишком тяжел вы можете взглянуть на Silex (который использует компоненты Symfony), так что вы могли бы написать что-то вроде:

$app['twig'] = $app->extend('twig', function ($twig) { 
    $twig->addFilter(new \Twig_SimpleFilter('chgname', function ($string) { 
     return substr($string, 0, 5); 
    })); 

    return $twig; 
}); 

см http://silex.sensiolabs.org

+0

Снова оригинальный плакат заявил, что функция 'substr()' на самом деле не то, что он хочет, это был просто пример. –

+0

Итак, он тоже написал пример! SO - это не викторина, которую мы должны угадать, что означает автор функции. – malcolm

Смежные вопросы