Symfony2和FOSUserBundle:在更新/创建用户时执行其他操作

时间:2015-03-14 18:07:14

标签: symfony fosuserbundle

我在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

我必须错过一些非常愚蠢的东西......

另一个问题是:我不想更改重定向页面,因此如果原始页面是“发送的电子邮件”(在创建新用户之后),那么就去那里,否则如果它是个人资料更新显示个人资料页面。

0 个答案:

没有答案