API Platform 的文档没有提供关于此的很好的文档,这是我发现的唯一的东西,但这不起作用:https://api-platform.com/docs/core/messenger/#using-messenger-with -输入对象
但是当我尝试这个不完整的文档时,我收到错误!
键入的属性 App\Dto\ResetPasswordRequest::$email 不得为 在初始化之前访问
我称这条路线为
POST /api/users/reset_password
带有 json 正文:
{"email": "[email protected]"}
实体:
#[ORM\Entity(repositoryClass: UserRepository::class)]
#[ORM\Table(name: '`user`')]
#[ApiResource(
operations: [
new GetCollection(),
new Post(processor: UserPasswordHasher::class),
new Get(),
new Put(processor: UserPasswordHasher::class),
new Patch(processor: UserPasswordHasher::class),
new Delete(),
new Post(
name: 'reset_password',
status: 202,
messenger: 'input',
input: ResetPasswordRequest::class,
output: false,
uriTemplate: '/users/reset_password'
)
],
normalizationContext: ['groups' => ['user:read']],
denormalizationContext: ['groups' => ['user:create', 'user:update']],
)]
#[UniqueEntity('email')]
class User implements UserInterface, PasswordAuthenticatedUserInterface
{
...
还有 DTO :
<?php
// api/src/Dto/ResetPasswordRequest.php
namespace App\Dto;
final class ResetPasswordRequest
{
public string $email;
}
和处理程序:
<?php
// api/src/Handler/ResetPasswordRequestHandler.php
namespace App\Handler;
use App\Dto\ResetPasswordRequest;
use App\Entity\User;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Address;
use SymfonyCasts\Bundle\ResetPassword\Exception\ResetPasswordExceptionInterface;
use SymfonyCasts\Bundle\ResetPassword\ResetPasswordHelperInterface;
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
final class ResetPasswordRequestHandler implements MessageHandlerInterface
{
public function __construct(
private ResetPasswordHelperInterface $resetPasswordHelper,
private EntityManagerInterface $entityManager,
private MailerInterface $mailer
) {}
public function __invoke(ResetPasswordRequest $forgotPassword)
{
die(var_dump($forgotPassword->email));
$user = $this->entityManager->getRepository(User::class)->findOneBy([
'email' => $forgotPassword->email,
]);
if (!$user) {
return;
}
try {
$resetToken = $this->resetPasswordHelper->generateResetToken($user);
} catch (ResetPasswordExceptionInterface $e) {
return;
}
$email = (new TemplatedEmail())
->from(new Address('[email protected]'))
->to($user->getEmail())
->subject('Your password reset request')
->htmlTemplate('mail/reset_password.html.twig')
->context([
'resetToken' => $resetToken,
'tokenLifetime' => $this->resetPasswordHelper->getTokenLifetime(),
])
;
$this->mailer->send($email);
}
}
这是由于序列化造成的。
您的 DTO ResetPasswordRequest.php 类将是:
<?php
namespace App\Dto;
use Symfony\Component\Serializer\Annotation\Groups;
class ResetPasswordRequest
{
#[Groups(['user:create', 'user:read'])]
public string $email;
}
如果您已经完成此操作或有不同的方法,请分享。