【问题标题】:FOSUserBundle: "The file could not be found." error while resetting/changing passwordFOSUserBundle:“找不到文件。”重置/更改密码时出错
【发布时间】:2017-12-08 02:05:06
【问题描述】:

我在使用 FOSUserBundle 时遇到了一个奇怪的错误。当我尝试为在其实体中具有上传图像文件名的用户重置或更改密码时,我收到错误消息:“找不到文件。”如果图像字段为空,一切都很好。所以我只是通过在resetAction 中的$form->setData($user) 之前将photo 设置为null 来解决这个问题,然后在表单提交和验证之后我再次设置一个旧的照片值。

我的解决方案:

/**
 * Reset user password.
 *
 * @param Request $request
 * @param string  $token
 *
 * @return Response
 */
public function resetAction(Request $request, $token)
{
    /** @var $formFactory \FOS\UserBundle\Form\Factory\FactoryInterface */
    $formFactory = $this->get('fos_user.resetting.form.factory');
    /** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */
    $userManager = $this->get('fos_user.user_manager');
    /** @var $dispatcher \Symfony\Component\EventDispatcher\EventDispatcherInterface */
    $dispatcher = $this->get('event_dispatcher');

    $user = $userManager->findUserByConfirmationToken($token);

    if (null === $user) {
        throw new NotFoundHttpException(sprintf('The user with "confirmation token" does not exist for value "%s"', $token));
    }

    $event = new GetResponseUserEvent($user, $request);
    $dispatcher->dispatch(FOSUserEvents::RESETTING_RESET_INITIALIZE, $event);

    if (null !== $event->getResponse()) {
        return $event->getResponse();
    }

    $form = $formFactory->createForm();

    //fix error upon form validation: "The file could not be found."
    $photo = $user->getPhoto();
    $user->setPhoto(null);

    $form->setData($user);

    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $event = new FormEvent($form, $request);
        $dispatcher->dispatch(FOSUserEvents::RESETTING_RESET_SUCCESS, $event);

        //set photo name instead of null
        $user->setPhoto($photo);

        $userManager->updateUser($user);

        if (null === $response = $event->getResponse()) {
            $url = $this->generateUrl('fos_user_profile_show');
            $response = new RedirectResponse($url);
        }

        $dispatcher->dispatch(
            FOSUserEvents::RESETTING_RESET_COMPLETED,
            new FilterUserResponseEvent($user, $request, $response)
        );

        return $response;
    }

    return $this->render('@FOSUser/Resetting/reset.html.twig', array(
        'token' => $token,
        'form' => $form->createView(),
    ));
}

我的用户实体的片段:

class User extends BaseUser
{
    /**
     * @ var string
     *
     * @ORM\Column(name="photo", type="string", length=255, nullable=true)
     * @Assert\File(mimeTypes={ "image/jpeg", "image/png" })
     */
    private $photo;

我不明白为什么在没有文件上传输入的情况下提交表单时会发生文件验证。重置密码时检查用户的所有字段有什么意义?

【问题讨论】:

    标签: php symfony fosuserbundle


    【解决方案1】:

    在表单工作流提交中提供句柄请求以填充所有用户行,为表单字段设置所需的 false

    【讨论】:

    • 我已经在 RegistrationType 表单中设置了 required false 并且仍然有同样的问题。我应该通过将照片字段标记为 false 来覆盖更改密码和重置表单吗?
    • 你使用的是 'fos_user.resetting.form.factory' 而不是 'fos_user.registration.form.factory' 是的可能
    • 有效!非常感谢! :) 但我仍然不知道在重置密码表单中验证所有用户属性的目的是什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    相关资源
    最近更新 更多