微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

API Plateform 自定义获取操作

如何解决API Plateform 自定义获取操作

我正在尝试使用 API 平台构建电子商务网站。

由于我将 JWT 身份验证与 LexikJWTAuthenticationBundle 结合使用,因此我很难让用户获得令牌。

我想访问用户的购物车。

我设法通过自定义发布操作添加到购物车。

LitElement

我正在尝试使用相同的方式,但有一个 get 请求

<?PHP

namespace App\Controller;

use App\Entity\Article;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;


class AddToCart extends AbstractController
{
    private $em;

    public function __construct(EntityManagerInterface $em)
    {
        $this->em = $em;
    }

    public function __invoke(Article $data)
    {
        $user = $this->getUser();
        $user->addCart($data);
        $this->em->flush();
        return $user->getCart();
    }
}

namespace App\Controller;


use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;


class GetCart extends AbstractController
{
    public function getCart()
    {
        $user = $this->getUser();
        return $user->getCart();
    }
}

知道我做错了什么吗?

解决方法

您是否尝试使用自定义 DataProvider 并注入安全性,而不是使用控制器?


use Symfony\Component\Security\Core\Security;
use ApiPlatform\Core\DataProvider\ItemDataProviderInterface;
use ApiPlatform\Core\DataProvider\RestrictedDataProviderInterface;
use ApiPlatform\Core\DataProvider\SerializerAwareDataProviderInterface;
use ApiPlatform\Core\DataProvider\SerializerAwareDataProviderTrait;

class UserDataProvider implements ItemDataProviderInterface,RestrictedDataProviderInterface,SerializerAwareDataProviderInterface
{
    use SerializerAwareDataProviderTrait;
    public const OPERATION_NAME = "get_cart";
    private $security;

    public function __construct(Security $security)
    {
        $this->security = $security;
    }

    public function supports(string $resourceClass,string $operationName = null,array $context = []): bool
    {
        return User::class === $resourceClass && self::OPERATION_NAME === $operationName;
    }

    public function getItem(string $resourceClass,$id,array $context = []): ?TableDuplication
    {
        dump($this->security->getUser(),$this->security->getToken()); die();
        // Do what you need
    }
}

$this->security->getUser() 将返回您的用户,$this->security->getToken() 将返回有关您的令牌的所有信息

文档如下:https://api-platform.com/docs/core/data-providers/#custom-item-data-provider

,

使用自定义控制器不会关闭 api 平台的内置服务(DataProvider、(De)Serializer、DataPersister)。 使用内置的 DataProvider,您不能在没有 id 的情况下进行项目操作。您的 GetCart 控制器不需要内置的 DataProvider,因此您可以将其关闭:

 * @ORM\Entity(repositoryClass=UserRepository::class)
 * @ApiResource(
 *     itemOperations={
 *          "get",*          "put",*          "get_cart"={
 *               "method"="GET",*               "path"="/cart",*               "controller"=App\Controller\GetCart,*               "read"=false,*          },*     }
 * )
 */
class User implements UserInterface
// ...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。