我在Symfony2上使用FOSUserBundle。
我将User类扩展为包含其他字段,因此我还在树枝中添加了新字段。
其中一个字段是许可证代码。当用户填写该字段时,我想执行与DB的连接以查看该许可证是否有效。如果不是则返回错误,如果是,则在“licenceEvents”表中创建一个事件,将当前用户分配给该许可证。
[编辑]正如我所建议的那样,我创建了一个自定义验证器(它的工作方式就像一个魅力),一旦用户被创建或更新,我现在正在努力解决数据库中存在的问题。
我创建了一个事件监听器,如下所示:
<?php
// src/AppBundle/EventListener/UpdateOrCreateProfileSuccessListener.php
namespace AppBundle\EventListener;
use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\FormEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Doctrine\ORM\EntityManager; //added
class UpdateOrCreateProfileSuccessListener implements EventSubscriberInterface
{
private $router;
public function __construct(UrlGeneratorInterface $router, EntityManager $em)
{
$this->router = $router;
$this->em = $em; //added
}
/**
* {@inheritDoc}
*/
public static function getSubscribedEvents()
{
return array(
FOSUserEvents::REGISTRATION_COMPLETED => array('onUserCreatedorUpdated',-10),
FOSUserEvents::PROFILE_EDIT_COMPLETED => array('onUserCreatedorUpdated',-10),
);
}
public function onUserCreatedorUpdated(FilterUserResponseEvent $event)
{
$user = $event->getUser();
$code = $user->getLicense();
$em = $this->em;
$lastEvent = $em->getRepository('AppBundle:LicenseEvent')->getLastEvent($code);
$licenseEvent = new LicenseEvent();
// here I set all the fields accordingly, persist and flush
$url = $this->router->generate('fos_user_profile_show');
$event->setResponse(new RedirectResponse($url));
}
}
我的服务如下:
my_user.UpdateOrCreateProfileSuccess_Listener:
class: AppBundle\EventListener\UpdateOrCreateProfileSuccessListener
arguments: [@router, @doctrine.orm.entity_manager]
tags:
- { name: kernel.event_subscriber }
正确触发侦听器,设法按预期创建与DB的连接,但是给了我以下错误
Catchable Fatal Error: Argument 1 passed to AppBundle\EventListener\UpdateOrCreateProfileSuccessListener::onUserCreatedorUpdated()
must be an instance of AppBundle\EventListener\FilterUserResponseEvent,
instance of FOS\UserBundle\Event\FilterUserResponseEvent given
我必须错过一些非常愚蠢的东西......
另一个问题是:我不想更改重定向页面,因此如果原始页面是“发送的电子邮件”(在创建新用户之后),那么就去那里,否则如果它是个人资料更新显示个人资料页面。