Validation 如何覆盖FOSUserBundle的验证规则
我的Validation 如何覆盖FOSUserBundle的验证规则,validation,symfony,symfony-forms,fosuserbundle,Validation,Symfony,Symfony Forms,Fosuserbundle,我的ExampleUserBundle扩展了FOSUserBundle。我覆盖了RegistrationFormType,如下所示: <?php // Example/UserBundle/Form/Type/RegistrationFormType.php namespace Example\UserBundle\Form\Type; use Symfony\Component\Form\FormBuilderInterface; use FOS\UserBundle\Form\Ty
ExampleUserBundle
扩展了FOSUserBundle
。我覆盖了RegistrationFormType
,如下所示:
<?php
// Example/UserBundle/Form/Type/RegistrationFormType.php
namespace Example\UserBundle\Form\Type;
use Symfony\Component\Form\FormBuilderInterface;
use FOS\UserBundle\Form\Type\RegistrationFormType as BaseType;
class RegistrationFormType extends BaseType
{
public function buildForm(FormBuilderInterface $builder, array $options) {
parent::buildForm($builder, $options);
$builder->remove('username');
}
public function getName() {
return 'example_user_registration';
}
}
在/app/config/config.yml中:
fos_user:
db_driver: orm
firewall_name: main
user_class: Example\UserBundle\Entity\User
registration:
form:
type: example_user_registration
使用此表单创建新的
用户
时,FOSUserBundle
的基本验证规则不会覆盖。(电子邮件->唯一;密码->超过3个字符;…。基本解决方案是为注册表指定不同的验证组
这个解决方案对我有效:我也有类似的问题,但我想在我的注册表格中添加新的字段,我就是这样工作的 另外,我应该说,我在覆盖的注册表中使用了嵌入表单
class RegistrationType extends AbstractType
{
$builder
->add('avatar',FileManagerType::class,[
"by_reference" => false,
"data_class"=>File::class
])
->add('files', CollectionType::class,[
"entry_type"=> UserFileManagerType::class,
"allow_add" => true,
"allow_delete"=>true,
"by_reference"=>false
])
public function getParent()
{
return 'FOS\UserBundle\Form\Type\RegistrationFormType';
}
public function getBlockPrefix()
{
return 'app_user_registration';
}
然后在我的嵌入表单中,我喜欢这样
class FileManagerType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('file',FileType::class,[
"constraints"=>[
new \Symfony\Component\Validator\Constraints\File([
"mimeTypes"=>["image/jpeg", "image/gif", "image/png", "image/jpg"],
"groups"=>["Registration"]
])
]
]);
}
public function configureOptions(OptionsResolver $resolver)
{
//dump($resolver);
$resolver->setDefaults(array(
'data_class' => File::class
));
}
}
然后在另一种形式中嵌入
class UserFileManagerType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('file',FileType::class,[
"constraints"=>[
new \Symfony\Component\Validator\Constraints\File([
"mimeTypes"=>["application/pdf", "application/x-pdf"],
"groups"=>["Registration"]
])
]
]);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => File::class
]);
}
}
现在可以开始工作了您可以通过覆盖用户属性本身来覆盖FosUserBundle的验证规则 示例:如果我不想再需要用户名,那么我必须覆盖AppBundle\Entity\User中的用户名(这扩展了FosUserBundle用户)
使用条令\ORM\Mapping\AttributeOverrides;
使用条令\ORM\Mapping\AttributeOverride;
/**
*使用者
*
*@ORM\Table(name=“fos\u user”)
*@AttributeOverrides({
*@AttributeOverride(name=“username”,
*column=@ORM\column(
*name=“username”,
*type=“string”,
*长度=255,
*唯一=错误,
*可为空=真
* )
* ),
*@AttributeOverride(name=“usernamecononical”,
*column=@ORM\column(
*name=“usernamecononical”,
*type=“string”,
*长度=255,
*唯一=错误,
*可为空=真
* )
* )
* })
*@ORM\Entity(repositoryClass=“AppBundle\Repository\UserRepository”)
*/
类用户扩展了BaseUser
{
//..
此代码将使用户名在数据库中为空(在运行php-bin/console-doctrine:schema:update--force
之后)并且在验证规则中不是必需的
class UserFileManagerType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('file',FileType::class,[
"constraints"=>[
new \Symfony\Component\Validator\Constraints\File([
"mimeTypes"=>["application/pdf", "application/x-pdf"],
"groups"=>["Registration"]
])
]
]);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => File::class
]);
}
}