FOSUserBundle - 添加登录额外字段

时间:2015-09-28 20:05:20

标签: symfony fosuserbundle symfony-2.7

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

service.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';
    }
}

Comapny表单:

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;

Comapny实体

/**
 * @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;

基本上,注册用户必须提供公司名称 enter image description here

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

2 个答案:

答案 0 :(得分:0)

没有LoginFormType或同等的。您必须覆盖登录模板(简单)并添加自定义逻辑以考虑新字段值,即创建自定义用户提供商(不太容易):{{ 3}}

你可以看看FOSUserBundle的一个想法: http://symfony.com/doc/current/cookbook/security/custom_provider.html

对于模板

根据https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Security/UserProvider.php,最简单的解决方案是:

  

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

对于登录,模板名为login.html.twig,位于名为安全的文件夹中。

您可以复制原始docs

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

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

如果您想在company字段上强制执行验证,您也应该覆盖验证:请参阅here

答案 1 :(得分:0)

您必须在为FOSUserBundle创建的子包中创建新的LogIn表单。此表单将其声明为FOSUserBundle的LoginForm的子项,然后为公司添加新字段。然后覆盖Security / loginAction并渲染刚刚创建的新表单,而不是FOSUserBundle的默认表单。