使用 Symfony 2.6 FosUser 1.3 注册新用户时如何添加集合

How to add a collection when register a new user using Symfony 2.6 FosUser 1.3

我正在使用 FosUserBundle 1.3 和 Symfo 2.6。

我在注册新用户时需要添加地址(集合类型)。可能吗?

地址实体有所有者方,所以当我想注册(创建)用户时,它returns给我一个错误(约束完整性用户 ID 不能为空)。

我看到我可以在刷新之前对控制器做类似的事情:

if($entity->getAddresses() !== null){
  foreach($entity->getAddresses() as $address){
    $address->setUser($entity);
  }
}

这是最佳做法吗?

现在,我在哪里可以用 Fos 做这件事?我认为这里似乎是正确的地方,但我不确定,我可以覆盖它吗?

RegistrationFormHandler

...

public function process($confirmation = false)
{
    $user = $this->createUser();
    $this->form->setData($user);

    if ('POST' === $this->request->getMethod()) {
        $this->form->bind($this->request);

        if ($this->form->isValid()) {

            // I WOULD LIKE TO COPY MY CODE HERE
            // 

            $this->onSuccess($user, $confirmation);

            return true;
        }
    }

        return false;
    }

...

这将从 2.0 版本开始有效。

我认为你应该注册你自己的 EventListener 来监听 FOSUserEvents::REGISTRATION_SUCCESSFOSUserEvents::REGISTRATION_COMPLETED 然后你可以在那里添加你的自定义逻辑而无需控制器覆盖。类似于:

RegistrationListenerclass:

namespace AppBundle\EventListener;

use FOS\UserBundle\Event\FilterUserResponseEvent;
use FOS\UserBundle\FOSUserEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class RegistrationListener implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return array(
            FOSUserEvents::REGISTRATION_COMPLETED => 'completed'
        );
    }

    public function completed(FilterUserResponseEvent $event)
    {
        $user = $event->getUser();

        // add your custom logic here
    }
}

和services.yml:

app_listener.registration:
    class: AppBundle\EventListener\RegistrationListener
    tags:
        - { name: kernel.event_subscriber }

如果需要,请记住向您的侦听器添加适当的依赖项class。

对于 1.3 版本

您需要创建一个子包,其父包是 FOSUserBundle 和 ovveride:RegistraionController::registerAction 在您的情况下:

<?php

namespace Acme\UserBundle\Controller;

use Symfony\Component\HttpFoundation\RedirectResponse;
use FOS\UserBundle\Controller\RegistrationController as BaseController;

class RegistrationController extends BaseController
{
    public function registerAction()
    {
        $form = $this->container->get('fos_user.registration.form');
        $formHandler = $this->container->get('fos_user.registration.form.handler');
        $confirmationEnabled = $this->container->getParameter('fos_user.registration.confirmation.enabled');

        $process = $formHandler->process($confirmationEnabled);
        if ($process) {
            $user = $form->getData();

            // you custom logic

            if ($confirmationEnabled) {
                $this->container->get('session')->set('fos_user_send_confirmation_email/email', $user->getEmail());
                $route = 'fos_user_registration_check_email';
            } else {
                $this->authenticateUser($user);
                $route = 'fos_user_registration_confirmed';
            }

            $this->setFlash('fos_user_success', 'registration.flash.user_created');
            $url = $this->container->get('router')->generate($route);

            return new RedirectResponse($url);
        }

        return $this->container->get('templating')->renderResponse('FOSUserBundle:Registration:register.html.'.$this->getEngine(), array(
            'form' => $form->createView(),
        ));
    }
}