重置密码 API Platform 3.x - 初始化前不得访问

问题描述 投票:0回答:1

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);
    }
}
php symfony api-platform.com
1个回答
0
投票

这是由于序列化造成的。

您的 DTO ResetPasswordRequest.php 类将是:

<?php

namespace App\Dto;

use Symfony\Component\Serializer\Annotation\Groups;

class ResetPasswordRequest
{
    #[Groups(['user:create', 'user:read'])]
    public string $email;
}

如果您已经完成此操作或有不同的方法,请分享。

© www.soinside.com 2019 - 2024. All rights reserved.