Невозможно внедрить шаблон в службу Symfony 4

У меня следующий класс:

Уведомление по электронной почте

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.

Почему это так?

Спасибо!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
14
0
15 989
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Скорее всего, у вас нет шаблонов, включенных в ваш проект, в Symfony 4 вы должны требовать его явно:

composer require symfony/templating

У меня вообще есть, я втрое проверял.

iamjc015 18.03.2018 11:24

Сейчас я ввожу \ Twig_Environment, думаю, пока этого хватит.

iamjc015 18.03.2018 11:25

@ iamjc015 Когда вы запускаете php bin/console debug:autowiring, вы видите класс Symfony\Component\Templating\EngineInterface? Это должен быть псевдоним templating.engine.twig. У вас есть запись templating в вашем файле framework.yaml?

MakG 18.03.2018 12:08

Я не вижу EngineInterface. Может в этом проблема, почему так?

iamjc015 19.03.2018 13:26

и у меня нет шаблонов. Да уж, нет Symfony / шаблонов :(

iamjc015 19.03.2018 13:27

@ iamjc015 Я только что воспользовался вашим предложением, отлично работает. Спасибо! Однако в вашем комментарии есть опечатка, для Sf4 мне пришлось использовать \ Twig \ Environment

Muc 26.03.2019 19:59
symfony/templating устарел, начиная с Symfony 4.3. См. stackoverflow.com/a/58380813/1668200 для решения.
Thomas Landauer 14.10.2019 18:40

Вам необходимо установить symfony / templating

composer require symfony/templating

немного измените config / packages / framework.yaml

framework:
    templating:
        engines:
            - twig

Для тех, кто задается вопросом, вы должны добавить часть конфигурации в framework.yaml для автоматического подключения для загрузки компонента Templating.

Link14 22.08.2018 21:29

Есть еще информация, чтобы добавить к этому? Я получаю сообщение об ошибке You have requested a non-existent service "templating.engine.twig". ... I have installed composer require symfony / templating`?

BugHunterUK 14.01.2019 16:07

Я не уверен, что это помогло, но я сделал это: composer require twig, и после этого я смог использовать '@templating'

aga 25.01.2019 14:56
symfony/templating устарел, начиная с Symfony 4.3. См. stackoverflow.com/a/58380813/1668200 для решения.
Thomas Landauer 14.10.2019 18:40

Мне удалось это сделать с помощью 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 как компонент "шаблонов" устарел. На одну зависимость меньше!

emix 26.08.2019 10:24

Другие вопросы по теме