Функция/логика доступа из ветки и контроллера
Я думаю, что для этого есть два решения, оба должны использовать класс Twig_Function_Method
.
1
Первое решение, которое уже опубликовано gilden
, состоит в том, чтобы инкапсулировать логику в службу и создать оболочку для расширения Twig.
2
Другое решение — использовать только расширение Twig. Twig Extensino уже является сервисом, вы должны определить его как сервис с помощью специального <tag name="twig.extension" />
. Но это также и служба, экземпляр которой вы можете захватить контейнером службы. А также можно внедрить другие сервисы:
Итак, у вас есть расширение/сервис Twig:
class MyTwigExtension extends \Twig_Extension
{
private $anotherService;
public function __construct(SecurityService $anotherService= null)
{
$this->anotherService = $anotherService;
}
public function foo($param)
{
// do something
$this->anotherService->bar($param);
}
public function getFunctions()
{
// function names in twig => function name in this calss
return array(
'foo' => new \Twig_Function_Method($this, 'foo'),
);
}
/**
* Returns the name of the extension.
*
* @return string The extension name
*/
public function getName()
{
return 'my_extension';
}
}
Services.xml выглядит так
<service id="acme.my_extension" class="Acme\CoreBundle\Twig\Extension\MyTwigExtension">
<tag name="twig.extension" />
<argument type="service" id="another.service"></argument>
</service>
Чтобы получить доступ к сервису с вашего контроллера, вам нужно использовать только это:
$this->container->get('acme.my_extension')
Уведомление. Единственное отличие от обычного сервиса состоит в том, что расширение twig не загружается отложенно (http://symfony.com/doc/current/cookbook/templating/twig_extension.html).#register-an-extension-as-a-service)
person
timaschew
schedule
12.04.2013