• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

symfony4 -> przypomnienie hasla

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
259 wizyt
pytanie zadane 11 lipca 2018 w PHP przez suice Gaduła (3,960 p.)

Proponuje napisac przypomnienie hasla w sf4

Przebieg appki:

1. uzytkownik wpisuje w formularzu adres emailowy

class RemindPasswordType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('email', EmailType::class, [
            'label' => 'label.email'
        ]);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => User::class,
            'validation_groups' => [
                'remind_password'
            ]
        ]);
    }
}

Encja usera:

class User implements UserInterface
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string")
     * @Assert\NotBlank(message="default.not_blank")
     * @Assert\Email(message="default.email")
     * @AcmeAssert\ExistentEmail(groups= {"remind_password"})
     */
    private $email;

    /**
     * @ORM\Column(type="string", nullable=true)
     */
    private $remindToken;
}

ExistentEmailValidator:

class ExistentEmailValidator extends ConstraintValidator
        {
            private $userRepository;

            public function __construct(UserRepository $userRepository)
            {
                $this->userRepository = $userRepository;
            }

            public function validate($value, Constraint $constraint)
            {
                if (!$this->userRepository->findUserByEmail($value)) {
                    $this->context->buildViolation($constraint->message)->addViolation();
             }
        }

Problem:

Chcialbym, zeby formularz wyrzucil mi cala encje uzytkownika po mailu, zwraca obiekt usera z samym mailem, a entity manager traktuje ten obiekt jako zupelnie nowy, przez co przy flushu chce mi go zinsertowac. Przez co musze zlapac uzytkowwnika na nowo w controlerze ($rep->findUserByEmail($email)) co mnie totalnie nie zadowala. Domyslam sie, ze uzycie validation_groups chyba nie jest najlepszym pomyslem? W jaki poprawny sposob powinienem to zrobic?

komentarz 11 lipca 2018 przez Paweł Antyporowicz Stary wyjadacz (11,470 p.)
Pokaż kod kontrolera i routing. Ogólnie, jeżeli Entity Manger Ci dodaje rekord, zamiast go uaktualniać, to problem w tym, że Entity Manager szuka Ci obiektu w bazie danych po jego ID. Jeżeli, przesłany obiekt nie będzie miał pola ID, to Entity Manager, zamiast uaktualniać rekord w bazie danych, będzie dodawał nowy rekord do bazy danych.
Zdebuguj, dane jakie przechodzą Ci przez formularz i zobacz, czy obiekt posiada przypisanego ID czy null-a.

Pozdrawiam.
komentarz 11 lipca 2018 przez suice Gaduła (3,960 p.)
wiem jak dziala entity manager, wspomnialem ze jest dla mnie jasne dlaczego probuje insertowac :)

no wlasnie zwraca mi nulla przy id, zgaduje ze przez validation_group (jedyna grupa walidacji przy tym formie to remind_password [bez default i user])?
komentarz 11 lipca 2018 przez Paweł Antyporowicz Stary wyjadacz (11,470 p.)
A możesz mi pokazać kod kontrolera oraz routingu?
komentarz 11 lipca 2018 przez suice Gaduła (3,960 p.)
   /**
     * @Route("/forgotten", name="forgotten", methods={"GET", "POST"})
     */
    public function forgotten(Request $request): Response
    {
        $form = $this->createForm(RemindPasswordType::class);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {

            dump($form->getData());
            die;
        }
    }

 

wynik dumpa:

SecurityController.php on line 67:
User {#129758 ▼
  -id: null
  -login: null
  -plainPassword: null
  -password: null
  -email: "xxxx@gmail.com"
  -code: null
  -question: null
  -answer: null
  -coins: 0
  -logs: ArrayCollection {#129759 ▶}
  -lastActivity: DateTime @1531301869 {#129761 ▶}
  -registeredAt: DateTime @1531301869 {#129760 ▶}
  -banTime: null
  -banReason: null
  -roles: array:1 [▶]
  -remindToken: null
  -remindTokenExpires: null
}

 

 

1 odpowiedź

+1 głos
odpowiedź 11 lipca 2018 przez Paweł Antyporowicz Stary wyjadacz (11,470 p.)
Znalazłem rozwiązanie Twojego problemu, spójrz na dokumentacje:
http://symfony.com/doc/current/form/data_transformers.html

Podobne pytania

0 głosów
2 odpowiedzi 526 wizyt
pytanie zadane 6 marca 2019 w PHP przez bromba Nowicjusz (180 p.)
0 głosów
1 odpowiedź 285 wizyt
pytanie zadane 4 stycznia 2018 w PHP przez Kacper Duda Obywatel (1,970 p.)
0 głosów
1 odpowiedź 1,218 wizyt
pytanie zadane 2 czerwca 2018 w PHP przez `Krzychuu Stary wyjadacz (13,940 p.)

93,443 zapytań

142,434 odpowiedzi

322,691 komentarzy

62,805 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

...