Symfony:必须是 Twig_Environment 的一个实例 [英] Symfony: Must be an instance of Twig_Environment
问题描述
我正在尝试为已经制作的 Symfony 应用程序实施密码重置功能.我想我快到了......但我对 Symfony 还很陌生,我仍在搜索我自己的周围......我有一个视图将 JSON 帖子发送到控制器,但它返回以下消息:
I am trying to implement a password resset feature to an already made Symfony app. I think I am almost there ... But i am pretty new to Symfony and I am still searching my self arround ... I have a view that send a JSON post to a controller but it returns the following message:
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 }
我真的不知道我做错了什么.感谢您的帮助!
I am really don't know what I am doing wrong. Thx for your help!
推荐答案
问题在于您的服务定义.我不确定到底是什么导致了这种情况,但似乎 Symfony 正在重新安排这些论点.有 2 种方法可以修复它.删除参数的键或通过正确使用命名属性来修复它们:
The problem is your service definition. I am not sure exactly what is causing this, but it seems that Symfony is rearranging the arguments. There are 2 ways to fix it. Either remove the keys for the arguments or fix them by properly using named properties:
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"
重要的一点是 $
前缀,并且名称与构造函数中的参数名称相匹配.
The important bit is the $
-prefix and that the name matches the argument name in the constructor.
这篇关于Symfony:必须是 Twig_Environment 的一个实例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!