После моего последнего вопроса я не могу назвать услугу из шаблона. Я сделал точно так, как в ответе, но я получаю «Variable» newmessages «не существует» в шаблоне.
Я также попытался вернуть службу в родительский шаблон, но родитель никогда не вызывается, поскольку запрос на него отсутствует, запросы выполняются только для дочерних шаблонов.
public function indexAction(){ $locationService = $this->container->get('newmessages'); return $this->render( 'MedAppCrudBundle:UserBackend\Message:index.html.twig', array('newmessages'=>$locationService->methodToCalculate()) ); }
Как вызвать службу из родительского шаблона? Ответ от последнего вопроса не работает.
Ответ на ваш вопрос довольно прост. Вы публикуете эту услугу как глобальную переменную twig. На основе вашего примера вы должны добавить что-то похожее на ваш config.yml
twig: debug: "%kernel.debug%" strict_variables: "%kernel.debug%" globals: newmessages: "@newmessages"
Чтобы использовать его в своей ветке, вы просто напишите {{ newmessages.methodToCalculate() }}
.
Подробнее об этом можно прочитать в разделе « Как вводить переменные» на страницу « Все шаблоны» .
Вот более подробный пример:
// Add this to config.yml twig: debug: "%kernel.debug%" strict_variables: "%kernel.debug%" globals: newmessages: "@newmessages"
// Add this to services.yml (or if you're using older version of Symfony, add it to config.yml as well) services: newmessages: class: App\YourBundle\Service\NewMessages
// The NewMessages service class <?php namespace App\YourBundle\Service; class NewMessages { public function methodToCalculate() { return "location calculated."; } } ?>
// in your twig template do this {{ newmessages.methodToCalculate() }} // outputs "location calculated."
Вы можете предоставить свою услугу в качестве функции твига и использовать ее в инструкции twig. См. Полный документ здесь . В качестве примера определите расширение как:
services.yml
######### TWIG EXTENSION acme.message_helper_twig_extension: class: Acme\MessageBundle\Twig\MessageHelperExtension arguments: [@newmessages] tags: - { name: twig.extension }
И реализуйте его следующим образом:
namespace Acme\MessageBundle\Twig\MessageHelperExtension; class MessageHelperExtension extends \Twig_Extension { protected $newMessages; function __construct($newMessages) { $this->newMessages = $newMessages; } public function getFunctions() { return array( ////////////////////////////////// 'twig_method_reference_name'=> new \Twig_Function_Method($this, 'getMessages'), ); } public function getMessages() { return $this->newMessages->getMessages() } /** * Returns the name of the extension. * * @return string The extension name */ public function getName() { return 'message_helper'; } }
Затем вы можете использовать его в веточке, как:
{{ twig_method_reference_name() }}
Надеюсь, что эта помощь