Symfony: должен быть экземпляром Twig_Environment - PullRequest
0 голосов
/ 22 декабря 2018

Я пытаюсь реализовать функцию восстановления пароля в уже созданном приложении Symfony.Я думаю, что я почти там ... Но я довольно новичок в Symfony, и я все еще ищу себя вокруг ... У меня есть представление, которое отправляет сообщение JSON на контроллер, но оно возвращает следующее сообщение:

Type error: Argument 1 passed to AppBundle\Event\ForgotPasswordEventListener::__construct() must be an instance of Twig_Environment, instance of Doctrine\ORM\EntityManager given, called in /home/***/public_html/intranet/var/cache/prod/ContainerJxqbmi7/getApp_Listener_ForgotPasswordService.php on line 8

Это мой контроллер:

<?php

namespace AppBundle\Event;
use CoopTilleuls\ForgotPasswordBundle\Event\ForgotPasswordEvent;

class ForgotPasswordEventListener
{

    private $twig;
    private $mailer;
    private $manager;

    public function __construct(\Twig_Environment $twig, \Swift_Mailer $mailer, \Doctrine\ORM\EntityManager $manager)
    {
        $this->templating = $twig;
        $this->mailer = $mailer;
        $this->manager=$manager;
    }

    /**
     * @param ForgotPasswordEvent $event
     */
    public function onCreateToken(ForgotPasswordEvent $event)
    {
        $passwordToken = $event->getPasswordToken();
        $user = $passwordToken->getUser();

        $swiftMessage = new \Swift_Message(
            'Reset of your password',
            $this->templating->render(
             'security/forgot-password.html.twig',
                [
                    'reset_password_url' => sprintf('http://www.example.com/forgot-password/%s', $passwordToken->getToken()),
                ]
            )
        );

        $swiftMessage->setFrom('no-reply@example.com');
        $swiftMessage->setTo($user->getEmail());
        $swiftMessage->setContentType('text/html');
        if (0 === $this->mailer->send($swiftMessage)) {
            throw new \RuntimeException('Unable to send email');
        }
    }

    /**
     * @param ForgotPasswordEvent $event
     */

    public function onUpdatePassword(ForgotPasswordEvent $event)
    {
        $passwordToken = $event->getPasswordToken();
        $user = $passwordToken->getUser();
        $user->setPlainPassword($event->getPassword());
        $this->manager->persist($user);
    }
}

Это мой сервис:

app.listener.forgot_password:
    class: AppBundle\Event\ForgotPasswordEventListener
    arguments:
        templating: "@twig"
        mailer:     "@mailer"
        manager:    "@doctrine.orm.entity_manager"
    tags:
        - { name: kernel.event_listener, event: coop_tilleuls_forgot_password.create_token, method: onCreateToken}
        - { name: templating.helper, alias: templating, event: coop_tilleuls_forgot_password.create_token, method: onCreateToken}
        - { name: kernel.event_listener, event: coop_tilleuls_forgot_password.update_password, method: onUpdatePassword }

Я действительно не знаю, что я делаю неправильно.Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 22 декабря 2018

Проблема в определении вашего сервиса.Я не уверен точно, что является причиной этого, но кажется, что Symfony перестраивает аргументы.Есть 2 способа это исправить.Либо удалите ключи для аргументов, либо исправьте их, правильно используя именованные свойства:

app.listener.forgot_password:
    class: AppBundle\Event\ForgotPasswordEventListener
    arguments:
        - "@twig"
        - "@mailer"
        - "@doctrine.orm.entity_manager"

или для второго подхода:

app.listener.forgot_password:
    class: AppBundle\Event\ForgotPasswordEventListener
    arguments:
        $twig: "@twig"
        $mailer: "@mailer"
        $manager: "@doctrine.orm.entity_manager"

Важным битом является префикс $и что имя совпадает с именем аргумента в конструкторе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...