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() 只有 在我尝试重置密码的帐户有图像已关联。如果记录没有图像,则不会造成任何问题。

所以这就是我迷路的地方。我的理解是:

  1. 出于某种原因,Symfony 希望在此阶段获取图像,并且

  2. 由于某些其他原因未能这样做。

我该如何解决这个问题?在这个阶段我不需要图像,所以如果有办法告诉捆绑可能是理想的。

我对 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。然后验证器将查找图像,当然该图像不存在(因为它是空的)。

快速解决方法是将约束添加到表单类型而不是实体。