Php Symfony:必须是Twig_环境的实例

Php Symfony:必须是Twig_环境的实例,php,symfony,Php,Symfony,我正在尝试为一个已经制作好的Symfony应用程序实现一个密码RESET功能。我想我就快到了。。。但我对Symfony还很陌生,我仍然在寻找我的自我。。。我有一个向控制器发送JSON post的视图,但它返回以下消息: Type error: Argument 1 passed to AppBundle\Event\ForgotPasswordEventListener::__construct() must be an instance of Twig_Environment, instanc

我正在尝试为一个已经制作好的Symfony应用程序实现一个密码RESET功能。我想我就快到了。。。但我对Symfony还很陌生,我仍然在寻找我的自我。。。我有一个向控制器发送JSON post的视图,但它返回以下消息:

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);
    }
}

我真的不知道我做错了什么。谢谢你的帮助

问题在于您的服务定义。我不确定到底是什么原因导致了这一点,但似乎Symfony正在重新安排争论。有两种方法可以修复它。删除参数的键或通过正确使用命名属性修复它们:

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"

重要的一点是
$
-前缀,并且名称与构造函数中的参数名称匹配。

问题在于您的服务定义。我不确定到底是什么原因导致了这一点,但似乎Symfony正在重新安排争论。有两种方法可以修复它。删除参数的键或通过正确使用命名属性修复它们:

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"

重要的一点是
$
-前缀,并且名称与构造函数中的参数名称匹配。

请再次查看代码。在您提供的示例中,服务定义了2次,配置不同。您的权利!哈哈,我可能尝试了太多东西,以至于我没有注意到双重服务!但这给了我和其他错误。致命错误:未捕获的Symfony\Component\DependencyInjection\Exception\InvalidArgumentException:无效的服务“app.listener.遗忘\u密码”:方法“AppBundle\Event\ForgotPasswordEventListener::\uu构造()”没有提示为“模板化”的参数类型。检查您的服务定义。在/home/quebecentreseau/public#html/intranet/vendor/symfony/src/symfony/Component/DependencyInjection/Compiler/ResolveNamedArgumentsPass.php:80堆栈跟踪:#0得到的错误是由
服务中定义的参数命名引起的。yaml
可以重命名
模板:
细枝:
或使用破折号
-
对于每一行,请不要命名。请再次查看您的代码。在您提供的示例中,服务定义了2次,配置不同。您的权利!哈哈,我可能尝试了太多东西,以至于我没有注意到双重服务!但这给了我和其他错误。致命错误:未捕获的Symfony\Component\DependencyInjection\Exception\InvalidArgumentException:无效的服务“app.listener.遗忘\u密码”:方法“AppBundle\Event\ForgotPasswordEventListener::\uu构造()”没有提示为“模板化”的参数类型。检查您的服务定义。在/home/quebecentreseau/public#html/intranet/vendor/symfony/src/symfony/Component/DependencyInjection/Compiler/ResolveNamedArgumentsPass.php:80堆栈跟踪:#0得到的错误是由
服务中定义的参数命名引起的。yaml
可以重命名
模板:
细枝:
或使用破折号
-
对于每一行,而不是命名。