如何在使用Symfony 2.6 FosUser 1.3注册新用户时添加集合
我使用的是FosUserBundle 1.3和Symfo 2.6 我需要在注册新用户时添加地址集合类型。可能吗 Address实体具有所有者端,因此当我想要注册创建用户时,它会返回一个错误contraint integrity userID不能为null 我看到我可以在刷新之前对控制器执行类似操作:如何在使用Symfony 2.6 FosUser 1.3注册新用户时添加集合,symfony,controller,overriding,fosuserbundle,Symfony,Controller,Overriding,Fosuserbundle,我使用的是FosUserBundle 1.3和Symfo 2.6 我需要在注册新用户时添加地址集合类型。可能吗 Address实体具有所有者端,因此当我想要注册创建用户时,它会返回一个错误contraint integrity userID不能为null 我看到我可以在刷新之前对控制器执行类似操作: if($entity->getAddresses() !== null){ foreach($entity->getAddresses() as $address){ $ad
if($entity->getAddresses() !== null){
foreach($entity->getAddresses() as $address){
$address->setUser($entity);
}
}
这是最佳实践吗
现在,我在哪里可以用Fos做到这一点?我认为这里似乎是个合适的地方,但我不确定,我可以忽略它吗
注册表单处理程序
…这将从2.0版开始运行
我认为您应该注册自己的EventListener,它将侦听FOSUserEvents::REGISTRATION\u SUCCESS或FOSUserEvents::REGISTRATION\u COMPLETED,然后您可以在那里添加自定义逻辑,而无需覆盖控制器。比如:
注册侦听器类:
和服务.yml:
app_listener.registration:
class: AppBundle\EventListener\RegistrationListener
tags:
- { name: kernel.event_subscriber }
如果需要,请记住向侦听器类添加适当的依赖项
对于1.3版本
您需要创建其父级为FOSUserBundle和ovveride:RegistrationController::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(),
));
}
}
谢谢你的回答。我能用FOS 1.3做到这一点吗?我知道事件与最新版本一致。错了?你是对的-这只在2.0版之后才起作用。对于1.3,您需要覆盖controller->registerAction。如果您使用的是sf 2.6,为什么不将您的FOSUserBundle更新为最新版本?我可以覆盖controller registerAction中调用的Form>Handler中的RegistrationFormHandler.php类吗?是的,您可以覆盖RegistrationFormHandler-您所需要的是:
app_listener.registration:
class: AppBundle\EventListener\RegistrationListener
tags:
- { name: kernel.event_subscriber }
<?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(),
));
}
}