使用 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_SUCCESS
或 FOSUserEvents::REGISTRATION_COMPLETED
然后你可以在那里添加你的自定义逻辑而无需控制器覆盖。类似于:
RegistrationListener
class:
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(),
));
}
}
我正在使用 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_SUCCESS
或 FOSUserEvents::REGISTRATION_COMPLETED
然后你可以在那里添加你的自定义逻辑而无需控制器覆盖。类似于:
RegistrationListener
class:
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(),
));
}
}