Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在使用Symfony 2.6 FosUser 1.3注册新用户时添加集合_Symfony_Controller_Overriding_Fosuserbundle - Fatal编程技术网

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

如何在使用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

我使用的是FosUserBundle 1.3和Symfo 2.6

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

Address实体具有所有者端,因此当我想要注册创建用户时,它会返回一个错误contraint integrity userID不能为null

我看到我可以在刷新之前对控制器执行类似操作:

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(),
        ));
    }
}