我正在尝试创建一种通过令牌激活用户的方法,但是我对如何使用准则2和关系进行验证有些困惑。
在这里您可以看到我的数据库关系的屏幕。
这是我的用户实体
.............
/**
* @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');
}
答案 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');
}
....