如何处理学说和关系?

时间:2019-04-07 20:32:00

标签: php symfony

我正在尝试创建一种通过令牌激活用户的方法,但是我对如何使用准则2和关系进行验证有些困惑。

在这里您可以看到我的数据库关系的屏幕。

enter image description here

这是我的用户实体

.............
/**
     * @ORM\OneToOne(targetEntity="App\Entity\Token", mappedBy="username", cascade={"persist", "remove"})
     */
    private $token;

    public function getToken(): ?Token
    {
        return $this->token;
    }

    public function setToken(?Token $token): self
    {
        $this->token = $token;

        // set (or unset) the owning side of the relation if necessary
        $newUsername = $token === null ? null : $this;
        if ($newUsername !== $token->getUsername()) {
            $token->setUsername($newUsername);
        }

        return $this;
    }
.............

这是我的令牌实体

.............
/**
     * @ORM\OneToOne(targetEntity="App\Entity\User", inversedBy="token", cascade={"persist", "remove"})
     */
    private $username;

    public function getUsername(): ?User
    {
        return $this->username;
    }

    public function setUsername(?User $username): self
    {
        $this->username = $username;

        return $this;
    }
.............

当我注册任何用户并且电子邮件已发送时,该应用程序将按预期工作。

在其他没有令牌实现的项目中(将令牌与用户保存在同一表中),使方法如下所示没有问题:

.............
/**
     * @Route("/activation/{token}/", name="activation/", methods={"GET"}))
     */
    public function activation(Request $request, User $user, $token)
    {
        $token = $request->attributes->get('token');
        $update = $user->getToken();
        $user->setToken(null);
        $user->setActive(true);
        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->persist($user);
        $entityManager->flush();
        return $this->render(
            'emails/confirmation.html.twig');
    }
.............

但是使用这种方法,我会收到以下错误消息:无法猜测如何从参数的请求信息中获取Doctrine实例。

有人知道吗?

感谢您的时间。

亲切的问候。

.....................

EDIT1: 错误:无法猜测如何从参数“令牌”的请求信息中获取Doctrine实例。

代码:

    /**
    * @Route("/activation/{pledge}/", name="activation/", methods={"GET"}))
    */
    public function activation(Request $request, Token $token, $pledge)
    {
        $user = $pledge->getUsername();
        if ( null === $user) {

        }
        $user->setToken(null);
        $user->setActive(true);
        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->persist($user);
        $entityManager->flush();
        return $this->render(' emails/confirmation.html.twig');
    }
}

EDIT2:解决方案

/**
    * @Route("/activation/{token}/", name="activation/", methods={"GET"}))
    */
    public function activation(Request $request, Token $pledge, $token)
    {
        $token = $request->attributes->get('token');
        $user = $pledge->getUsername();
        if ( null === $pledge) {

        }
        $pledge->setToken(null);
        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->persist($pledge);
        $entityManager->flush();
        return $this->render('emails/confirmation.html.twig');
    }

1 个答案:

答案 0 :(得分:1)

在旧设置中,User实体可以与ParamConverter匹配,因为正如您所写的那样,其中有一个token字段。

现在token字段是Token实体的一部分,因此您可以做的就是匹配Token实体并从中获取用户:

public function activation(Request $request, Token $token)
{
    $user = $token->getUsername();
    if (null === $user) {
        // Here handle the situation with the token already used to activate a user
    }
    $user->setToken(null);
    $user->setActive(true);
    $entityManager = $this->getDoctrine()->getManager();
    $entityManager->persist($user);
    $entityManager->flush();

    return $this->render( 'emails/confirmation.html.twig');

}

 ....