1

我有一个带有额外字段的注册表单。下面是我的代码:

服务.yml

services:
    app.form.registration:
        class: AppBundle\Form\FOSUserBundle\Registration\RegistrationType
        tags:
            - { name: form.type, alias: app_user_registration }

我的扩展注册表:

class RegistrationType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('company', new CompanyForm(), [
            'label' => 'form.company.header', 'translation_domain' => 'FOSUserBundle'
        ]);
    }

    public function getParent()
    {
        return 'fos_user_registration';
    }

    public function getName()
    {
        return 'app_user_registration';
    }
}

公司形式:

class CompanyForm extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name', 'text',  [
            'label' => 'form.company', 'translation_domain' => 'FOSUserBundle'
        ]);
    }


    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Company',
        ));
    }

    public function getName()
    {
        return 'app_form_company';
    }
}

用户实体:

class User extends BaseUser
{

    public function __construct()
    {
        parent::__construct();
        // your own logic
    }

    use Bleamable;

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;


    /**
     * @ORM\ManyToOne(targetEntity="Company",cascade={"persist"})
     * @ORM\JoinColumn(name="company", referencedColumnName="id")
     */
    protected $company;

公司实体

/**
 * @ORM\Entity
 * @ORM\Table(name="company")
 * @UniqueEntity(fields={"identifier"})
 * 
 * @ORM\HasLifecycleCallbacks 
 */
class Company
{
    use Timestampable;
//    use Bleamable;

    /**
     * @var int
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var string
     * @ORM\Column(type="string", nullable=false)
     * @Assert\NotBlank()
     * @Assert\NotNull()
     */
    private $name;

    /**
     * @var string
     * @ORM\Column(type="string", nullable=true)
     */
    private $identifier;

所以基本上注册用户必须提供公司名称 在此处输入图像描述

我想将该公司名称添加到登录表单并检查它是否有效。如果username,password并且company name是 OK 用户应该登录。我知道如何覆盖fos_user_registration但我找不到有关登录表单的信息...你能帮我吗?

4

2 回答 2

0

您必须在为 FOSUserBundle 创建的子包中创建一个新的登录表单。此表单将其声明为 FOSUserBundle 的 LoginForm 的子级,然后为 Company 添加一个新字段。然后覆盖 Security/loginAction 并呈现您刚刚创建的新表单,而不是 FOSUserBundle 的默认表单。

于 2016-03-30T10:30:46.150 回答
0

没有LoginFormType或等效的。您必须覆盖登录模板(简单)并添加自定义逻辑以考虑新字段值,即创建自定义用户提供程序(不太容易):http ://symfony.com/doc/current/cookbook/security/ custom_provider.html

您可以查看 FOSUserBundle 的一个来了解一下: https ://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Security/UserProvider.php

对于模板

根据文档,最简单的解决方案是:

app/Resources在目录中定义一个新的同名模板

对于登录,模板被调用login.html.twig并位于名为Security的文件夹中。

您可以在此处复制原件。

将其复制后app/Resources/FOSUserBundle/views/Security,只需添加您需要的行,例如:

<label for="company">{{ 'your.company'|trans }}</label>
<input type="text" id="company" name="company" value="{{ company }}" required="required" />

如果你想在company现场强制验证,你也应该覆盖验证:见https://symfony.com/doc/master/bundles/FOSUserBundle/overriding_validation.html

于 2015-09-28T20:21:09.440 回答