Symfony FOSUserBundle 密码重置 - 找不到文件
Symfony FOSUserBundle Password Reset - The file could not be found
我正在使用 FOSUserBundle
。
我定义了以下特征:
trait Logo
{
/**
* @Assert\Image()
* @ORM\Column(type="string", nullable=true)
*/
private $logo;
/**
* @return mixed
*/
public function getLogo()
{
return $this->logo;
}
/**
* @param mixed $logo
*/
public function setLogo($logo)
{
$this->logo = $logo;
}
}
然后我将它应用到我的用户 class:
use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity()
* @ORM\Table(name="fos_user")
*/
class User extends BaseUser
{
use Logo;
...
这一切都很好,并为能够将图像关联到我的用户提供了基础。
问题是这会破坏 FOS 密码重置 - 在我提交表单后,我收到以下消息作为表单错误:
The file could not be found.
Symfony Profiler 进一步详细说明如下:
ConstraintViolation {#1368
root: Form {#879 …}
path: "data.logo"
value: "553d1f015637bf5d97b9eb66f71e6587.jpeg"
}
这是因为徽标 属性 上的 @Assert\Image()
和 只有 在我尝试重置密码的帐户有图像已关联。如果记录没有图像,则不会造成任何问题。
所以这就是我迷路的地方。我的理解是:
出于某种原因,Symfony 希望在此阶段获取图像,并且
由于某些其他原因未能这样做。
我该如何解决这个问题?在这个阶段我不需要图像,所以如果有办法告诉捆绑可能是理想的。
我对 Symfony 比较陌生,如果这个问题有明显的答案但我看不到,我深表歉意。
为密码重置创建验证组as explained in the documentation。
之后,重写 ResettingFormType 并定义您自己要使用的验证组。
这里的目标是图像的断言检查不应该在这个表单中完成,但是由于整个用户对象将作为数据注入到表单本身中,所以所有的断言都会进行直到表单得到被告知不这样做。
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'validation_groups' => array('my_resetting'),
));
}
覆盖 FormType 的示例:
# AppBundle\Form\Type\ProfileFormType.php
class ProfileFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
# example -> disable change of username in profile_edit
$builder
->add('username', TextType::class, array(
'disabled' => true,
'label' => 'form.username',
'translation_domain' => 'FOSUserBundle'
))
;
}
public function getParent()
{
return 'FOS\UserBundle\Form\Type\ProfileFormType';
}
public function getBlockPrefix()
{
return 'app_user_profile';
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'validation_groups' => array('my_resetting'),
));
}
}
并在 config.yml
fos_user:
profile:
form:
type: AppBundle\Form\Type\ProfileFormType
当您提交表单时,它会调用 setLogo
,并将其设置为 null
。然后验证器将查找图像,当然该图像不存在(因为它是空的)。
快速解决方法是将约束添加到表单类型而不是实体。
我正在使用 FOSUserBundle
。
我定义了以下特征:
trait Logo
{
/**
* @Assert\Image()
* @ORM\Column(type="string", nullable=true)
*/
private $logo;
/**
* @return mixed
*/
public function getLogo()
{
return $this->logo;
}
/**
* @param mixed $logo
*/
public function setLogo($logo)
{
$this->logo = $logo;
}
}
然后我将它应用到我的用户 class:
use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity()
* @ORM\Table(name="fos_user")
*/
class User extends BaseUser
{
use Logo;
...
这一切都很好,并为能够将图像关联到我的用户提供了基础。
问题是这会破坏 FOS 密码重置 - 在我提交表单后,我收到以下消息作为表单错误:
The file could not be found.
Symfony Profiler 进一步详细说明如下:
ConstraintViolation {#1368
root: Form {#879 …}
path: "data.logo"
value: "553d1f015637bf5d97b9eb66f71e6587.jpeg"
}
这是因为徽标 属性 上的 @Assert\Image()
和 只有 在我尝试重置密码的帐户有图像已关联。如果记录没有图像,则不会造成任何问题。
所以这就是我迷路的地方。我的理解是:
出于某种原因,Symfony 希望在此阶段获取图像,并且
由于某些其他原因未能这样做。
我该如何解决这个问题?在这个阶段我不需要图像,所以如果有办法告诉捆绑可能是理想的。
我对 Symfony 比较陌生,如果这个问题有明显的答案但我看不到,我深表歉意。
为密码重置创建验证组as explained in the documentation。
之后,重写 ResettingFormType 并定义您自己要使用的验证组。
这里的目标是图像的断言检查不应该在这个表单中完成,但是由于整个用户对象将作为数据注入到表单本身中,所以所有的断言都会进行直到表单得到被告知不这样做。
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'validation_groups' => array('my_resetting'),
));
}
覆盖 FormType 的示例:
# AppBundle\Form\Type\ProfileFormType.php
class ProfileFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
# example -> disable change of username in profile_edit
$builder
->add('username', TextType::class, array(
'disabled' => true,
'label' => 'form.username',
'translation_domain' => 'FOSUserBundle'
))
;
}
public function getParent()
{
return 'FOS\UserBundle\Form\Type\ProfileFormType';
}
public function getBlockPrefix()
{
return 'app_user_profile';
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'validation_groups' => array('my_resetting'),
));
}
}
并在 config.yml
fos_user:
profile:
form:
type: AppBundle\Form\Type\ProfileFormType
当您提交表单时,它会调用 setLogo
,并将其设置为 null
。然后验证器将查找图像,当然该图像不存在(因为它是空的)。
快速解决方法是将约束添加到表单类型而不是实体。