У меня следующий класс:
Уведомление по электронной почте
namespace App\Component\Notification\RealTimeNotification;
use Symfony\Bridge\Twig\TwigEngine;
use Symfony\Bundle\FrameworkBundle\Templating\EngineInterface;
use App\Component\Notification\NotificationInterface;
class EmailNotification implements NotificationInterface
{
private $logNotification;
public function __construct(LogNotification $logNotification, \Swift_Mailer $mailer, EngineInterface $twigEngine)
{
$this->logNotification = $logNotification;
}
public function send(array $options): void
{
$this->logNotification->send($options);
dump('Sent to email');
}
}
В моем yml есть следующее определение службы:
app.email_notification:
class: App\Component\Notification\RealTimeNotification\EmailNotification
decorates: app.log_notification
decoration_inner_name: app.log_notification.inner
arguments: ['@app.log_notification.inner', '@mailer', '@templating']
Однако, когда я пытался запустить свое приложение, оно выдает исключение:
Cannot autowire service "App\Component\Notification\RealTimeNotification\EmailNotification": argument "$twigEngine" of method "__construct()" has type "Symfony\Bundle\FrameworkBundle\Templating\EngineInterface" but this class was not found.
Почему это так?
Спасибо!




Скорее всего, у вас нет шаблонов, включенных в ваш проект, в Symfony 4 вы должны требовать его явно:
composer require symfony/templating
Сейчас я ввожу \ Twig_Environment, думаю, пока этого хватит.
@ iamjc015 Когда вы запускаете php bin/console debug:autowiring, вы видите класс Symfony\Component\Templating\EngineInterface? Это должен быть псевдоним templating.engine.twig. У вас есть запись templating в вашем файле framework.yaml?
Я не вижу EngineInterface. Может в этом проблема, почему так?
и у меня нет шаблонов. Да уж, нет Symfony / шаблонов :(
@ iamjc015 Я только что воспользовался вашим предложением, отлично работает. Спасибо! Однако в вашем комментарии есть опечатка, для Sf4 мне пришлось использовать \ Twig \ Environment
symfony/templating устарел, начиная с Symfony 4.3. См. stackoverflow.com/a/58380813/1668200 для решения.
Вам необходимо установить symfony / templating
composer require symfony/templating
немного измените config / packages / framework.yaml
framework:
templating:
engines:
- twig
Для тех, кто задается вопросом, вы должны добавить часть конфигурации в framework.yaml для автоматического подключения для загрузки компонента Templating.
Есть еще информация, чтобы добавить к этому? Я получаю сообщение об ошибке You have requested a non-existent service "templating.engine.twig". ... I have installed composer require symfony / templating`?
Я не уверен, что это помогло, но я сделал это: composer require twig, и после этого я смог использовать '@templating'
symfony/templating устарел, начиная с Symfony 4.3. См. stackoverflow.com/a/58380813/1668200 для решения.
Мне удалось это сделать с помощью Twig Environment и HTTP Response.
<?php
namespace App\Controller;
use Twig\Environment;
use Symfony\Component\HttpFoundation\Response;
class MyClass
{
private $twig;
public function __construct(Environment $twig)
{
$this->twig = $twig;
}
public function renderTemplateAction($msg)
{
return new Response($this->twig->render('myTemplate.html.twig'));
}
}
Это предпочтительный способ, поскольку Symfony 4.3 как компонент "шаблонов" устарел. На одну зависимость меньше!
У меня вообще есть, я втрое проверял.