首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >传递给App\Entity\User::setToken()的参数%1必须是App\Entity\Token的实例或null、给定的字符串、在

传递给App\Entity\User::setToken()的参数%1必须是App\Entity\Token的实例或null、给定的字符串、在
EN

Stack Overflow用户
提问于 2019-04-11 00:32:03
回答 2查看 988关注 0票数 0

我正在尝试在我的数据库中更新一行。

在本例中,我使用了两个实体User和Token

这是我在控制器中的方法:

代码语言:javascript
复制
/**
 * @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)部分中看到的;我通过请求获得了以下数据:

正如我在同一部分中所理解的,近转储($user)。我想用$ token ->setToken($pledge)方法从我的用户更新新的令牌

为了管理这一点,哪种方法是正确的?

耽误您时间,实在对不起。

EN

回答 2

Stack Overflow用户

发布于 2019-04-11 01:21:49

我使用了以下代码:

代码语言:javascript
复制
...............
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();
................

如我所料,这是正确的方法吗?

票数 0
EN

Stack Overflow用户

发布于 2019-04-11 03:48:19

我建议做一些修改:

  • 不是编辑现有的Token,而是每次生成一个全新的实体。请记住,如果对Token执行present
  • persist操作,则将orphan removal设置为删除旧的Token,而不是$token。记住owning side
  • Token实体本身中没有必要保留$active字段,因为实体本身似乎在$valid下有一个过期日期。我会将该名称更改为$validUntil左右(以便指示日期/时间),并使用它来检查Token是否确实仍处于活动状态。您可以像这样对Token实体进行建模:

代码语言:javascript
复制
private $validUntil;

public function isActive()
{
    return $this->validUntil > (new DateTime('now'));
}

  • 而不是验证if ($form->isSubmitted() && $form->isValid())中的电子邮件,而是添加一个custom validation constraint,它将检查具有给定电子邮件的User是否存在。这样,如果没有User,您永远不会传递$form->isValid()部件,并且error on email字段会自动附加到该部件,因此不需要(除非您需要)

的闪烁消息

从更广泛的角度来看,我还会将Token实体更改为关系的$user属性(而不是$username),以及Token的值的$value属性(而不是$token)。我也会在Profile实体(以及可能与<代码>D40相关的其他实体中)中将$username重命名为$user

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55617372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档