Аргумент 1, передаваемый в App \ Entity \ User :: setToken (), должен быть экземпляром App \ Entity \ Token или нулевой, заданной строкой, вызываемой в - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь обновить строку в моей базе данных.

В этом случае я использую две сущности Пользователь и Токен

Это мой метод в моем контроллере:

/**
 * @Route("/forget-password/", name="forget", methods="GET|POST")
 */
 public function emailrestore(Request $request, UserRepository $userrepository, TokenGenerator $tokengenerator, MailGenerator $mailgenerator)
 {
    $userInfo = ['email' => null];
    $form = $this->createForm(ForgetPasswordType::class, $userInfo);
    $form->handleRequest($request);
    if ($form->isSubmitted() && $form->isValid()) {
        $userInfo = $form->getData();
        $email = $userInfo['email'];
        $user = $userrepository->findOneBy(['email' => $email]);
        if ($user === null){
            $message = "This email doesn't exist in our database or is wrong.";
            $this->session->getFlashBag()->add("danger", $message);
            return $this->redirectToRoute('forget');
        }
        // 2.5) Generating token
        $pledge = $tokengenerator->generateToken();
        $url = $this->generateUrl('recovery/', 
        array(
            'token' => $pledge
        ),
        UrlGeneratorInterface::ABSOLUTE_URL
        );
        $user->setToken($pledge);
        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->persist($token);
        $entityManager->flush();
        // 6) Sending the email to the user
        //$mailgenerator->registration($email, $url);
    }         
    return $this->render('emails/forget-password/forget-password.html.twig', array (
        'form' => $form->createView(),
    ));
 }

Как вы можете видеть в части дампа ($ user);По моему запросу у меня есть следующие данные:

enter image description here

Как я понимаю в этой же части, около дампа ($ user).Я хочу обновить новый токен от моего пользователя с помощью метода $ token-> setToken ($ pledge)

Какой метод является правильным для управления этим?

Спасибо за ваше время.

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

Я бы предложил некоторые изменения:

  • вместо редактирования существующего Token, каждый раз генерировать совершенно новую сущность.Имейте в виду, чтобы установить удаление сирот , чтобы удалить старую Token, если имеется

  • , сохраняющую $user, а не $token.Помните о стороне-владельце

  • в самой сущности Token нет необходимости сохранять поле $active, так как сама сущность, кажется, имеетдата истечения срока действия $valid.Я бы изменил это имя на $validUntil или около того (чтобы оно указывало дату / время) и использовал его, чтобы проверить, действительно ли Token все еще активен.Вы можете изменить сущность Token следующим образом:

private $validUntil;

public function isActive()
{
    return $this->validUntil > (new DateTime('now'));
}
  • вместо проверки электронной почты внутри if ($form->isSubmitted() && $form->isValid()), я бы добавил пользовательское ограничение проверки, который будет проверять, существует ли User с данным адресом электронной почты.Таким образом, если нет User, вы никогда не пройдете мимо части $form->isValid(), и к ней автоматически добавляется ошибка в поле email, поэтому нет необходимости во флэш-сообщении (если вы этого не хотите)

На более широком рисунке я бы также изменил сущность Token, чтобы иметь свойство $user для отношения (вместо $username) и свойство $value для *Значение 1047 * (вместо $token).Я бы переименовал $username в $user в сущности Profile (и, возможно, в других сущностях, имеющих отношение к User).

0 голосов
/ 10 апреля 2019

Я использовал следующее:

...............
UrlGeneratorInterface::ABSOLUTE_URL
        );
        $token = $user->getToken();
        $creation = new \DateTime("now");
        $valid = (new \DateTime("now"))->modify('+1 day');
        $token->setToken($pledge);
        $token->setCreation($creation);
        $token->setValid($valid);
        $token->setActive(true);
        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->persist($token);
        $entityManager->flush();
................

Это работает, как я ожидал, это правильный путь?.

...