Symfony2:如何使用FOSUserBundle构建多个注册表单

Juo*_*lis 6 symfony fosuserbundle

我是Symfony2的新手,但已经爱上了这个框架.

我有一个项目需要有3种不同的用户类型.

一个将是超级管理员,另外两个将是普通用户,但具有不同的配置文件布局.配置文件的不同布局意味着这两种用户类型的注册表单在注册后必须在应用程序中具有不同的表单域和不同的布局.

我想我已经有了这个想法(不知道以后是否可以),如何在注册后管理用户.但是现在我不明白如何构建两个不同的注册表单,这些表单将从FOSUserBundle扩展.

据我所知,FOSUB在配置中只有一点是注册设置,并且不能有多个"注册:"

在config.yml我有:

fos_user:
    db_driver: orm
    firewall_name: main
    user_class: Company\UserBundle\Entity\User
    registration:
        confirmation: { enabled: true }
Run Code Online (Sandbox Code Playgroud)

security.yml:

security:
    encoders:
        FOS\UserBundle\Model\UserInterface: sha512

    main:
        pattern:  ^/
        form_login:
            provider: fos_userbundle
            csrf_provider:  form.csrf_provider
        logout:       true
        anonymous:    true
Run Code Online (Sandbox Code Playgroud)

我的想法是创建三个扩展FOSUB的不同包,但文档说只有一个包可以将FOSUB声明为父包.

另一个选项(来自文档)是扩展ContainerAware实现所有原始方法.但即使在这种情况下,我也不知道如何配置app/config/{config | security | routing} .yml来实例/ register_employee,/ register_manager链接将使用FOSUB和我的自定义表单?

请指出正确的方向.谢谢.

Mun*_*Das 5

是的,它可以是可行的.但这将是一个复杂的过程.你可以做以下(虽然我没有试过自己:))

  • 创建类似的路由模式/register/{type}并相应地修改registerAction.请查看 doc以覆盖控制器.

  • registerAction方法中创建一个空白User实体并从路由参数设置类型.然后打电话$form->setData(),例如[1]

  • 覆盖RegistrationFormType添加事件侦听器将侦听FormEvents::PRE_SET_DATA数据事件.在这里,您将根据类型动态添加表单字段.查看食谱条目.

  • 现在是验证部分.为每种用户类型创建两种类型的验证组.您可以根据提交的数据动态设置验证组.请点击这里.

  • 如果要在表单保存期间执行额外操作,可以覆盖onSuccess方法RegistrationFormHandler.请检查文档的底部以执行此操作.

[1]像这样,

public function registerAction()
{
    $form = $this->container->get('fos_user.registration.form');
    $user = new User();
    $form->setData($user);
    //.....
}
Run Code Online (Sandbox Code Playgroud)

编辑:

第三步不起作用.您必须覆盖从控制器操作传递type参数的process方法RegistrationFormHandler.


小智 4

FOSUserBundle不是提供用户认证而是管理用户。该捆绑包为您提供了更好的结构来管理应用程序的用户。如果您查看代码,您会发现用于默认注册和其他用户活动的控制器。

理想情况下,您希望编写自己的控制器并使用捆绑包来仅存储和检索用户。当您想要管理多个注册/登录表单时,尤其需要这样做。

一旦您开始考虑 FOSUserBundle 仅用于管理用户而不是对用户进行身份验证/注册,事情就会变得更加清晰。

您可能还想查看https://github.com/sonata-project/SonataUserBundle,它提供了 SonataAdminBundle 和 FOSUserBundle 之间的集成。