我有一个额外字段的注册表。以下是我的代码:
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;
我想将该公司名称添加到登录表单并检查它是否有效。
如果username
,password
和company name
正常,则应该登录用户。我知道如何覆盖fos_user_registration
,但我找不到有关登录表单的信息...可以你帮我吗?
答案 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的默认表单。