【发布时间】:2015-07-20 05:13:12
【问题描述】:
我在应用程序用户注册,并希望在注册时通过电子邮件通知。我为此服务创建:
app.mail_service:
class: AppBundle\Mail\MailService
arguments: ["@mailer", "@templating"]
app.listener.user:
class: AppBundle\EventListener\UserSubscriber
arguments: ["@app.mail_service"]
tags:
- { name: doctrine.event_subscriber, connection: default }
模板 - TwigEngine
邮件服务类:
class MailService
{
private $mailer;
private $renderer;
public function __construct(Swift_Mailer $mailer, EngineInterface $renderer)
{
$this->mailer = $mailer;
$this->renderer = $renderer;
}
/**
* @return Swift_Mailer
*/
public function getMailer()
{
return $this->mailer;
}
/**
* @return EngineInterface
*/
public function getRenderer()
{
return $this->renderer;
}
public function sendRegistrationMail(User $user)
{
/** @var \Swift_Message $message */
$message = $this->getMailer()
->createMessage();
$message->setSubject('You successful register in website')
->addTo($user->getEmail())
->setBody($this->getRenderer()->render('AppBundle:Mail:register.html.twig', array(
'user' => $user
)), 'text/html', 'UTF-8');
return $this->getMailer()->send($message);
}
}
和用户订阅者监听器:
class UserSubscriber implements EventSubscriber
{
/**
* @var MailService
*/
private $mailService;
public function __construct(MailService $mailService)
{
$this->mailService = $mailService;
}
public function postPersist(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
if ($entity instanceof User) {
$this->mailService->sendRegistrationMail($entity);
}
}
/**
* Returns an array of events this subscriber wants to listen to.
*
* @return array
*/
public function getSubscribedEvents()
{
return array(
'postPersist',
);
}
}
当我尝试添加新用户时,出现异常:
检测到服务“security.authorization_checker”的循环引用,路径:“sensio_framework_extra.security.listener -> security.authorization_checker -> security.authentication.manager -> security.user.provider.concrete.entity_provider -> dictionary.orm .default_entity_manager -> 学说.dbal.default_connection -> app.listener.user -> app.mail_service -> 模板 -> twig -> security.context”。
据我了解,发生错误是因为 Twig 尝试使用 EntityManager 进行安全检查。
在this的文章中,作者使用了一个简单的方案,但是在Doctrine EventListener的Twig中也有使用。那不是抛出异常。
【问题讨论】:
标签: php security symfony doctrine-orm twig