2017-07-04 4 views
0

Ich habe einen seltsamen Fehler bei der Arbeit mit FOSUserBundle festgestellt. Wenn ich versuche, ein Passwort für einen Benutzer mit dem Dateinamen des hochgeladenen Bildes in seiner Entität zurückzusetzen oder zu ändern, erhalte ich einen Fehler: "Die Datei konnte nicht gefunden werden." Wenn das Bildfeld null ist, ist alles in Ordnung. Also habe ich gerade dieses Problem gelöst, indem ich in ResetAction das Foto als null vor $ form-> setData ($ user) gesetzt habe und dann nach der Formularübergabe und Validierung wieder einen alten Fotowert gesetzt habe.FOSUserBundle: "Die Datei konnte nicht gefunden werden." Fehler beim Zurücksetzen/Ändern des Passworts

Meine Lösung:

/** 
* 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(), 
    )); 
} 

Fragment meiner Benutzereinheit:

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; 

Ich verstehe nicht, warum Ort Dateiüberprüfung erfolgt, wenn ich Form ohne Datei-Upload-Eingabe einreichen. Und was ist der Zweck, alle Felder des Benutzers zu überprüfen, wenn Sie nur das Passwort zurücksetzen?

Antwort

0

In Form Workflow einreichen Handle bieten alle Benutzer Reihe zu füllen, das Formular mit den erforderlichen false für Ihr Formularfeld

+0

Ich habe es bereits gesetzt einrichten oben mit in RegistrationType Form falsch erforderlich und haben noch gleiche Problem. Sollte ich Change Password überschreiben und Formulare zurücksetzen, indem ich das Foto-Feld als erforderlich markieren? – qleszko

+0

Sie verwenden 'fos_user.resetting.form.factory' nicht 'fos_user.registration.form.factory' ja wahrscheinlich – Timan

+0

Es funktioniert! Danke vielmals! :) aber ich habe immer noch keine Ahnung, was ist ein Zweck der Validierung aller Benutzerattribute in Passwort zurücksetzen. – qleszko

Verwandte Themen