如何在__contstruct中注入服务?

温扎

我想注入Symfony\Component\Security\Core\Security__construct获得当前用户。使用@UniqueEnitity验证器需要我

<?php

declare(strict_types=1);

namespace App\Entity;

use ApiPlatform\Core\Annotation\ApiResource;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Security\Core\Security;
//...


/**
 * @ApiResource()
 * @ORM\Entity(repositoryClass="App\Repository\SimpleEntityRepository")
 * @UniqueEntity(fields={"foo", "user"})
 */
class SimpleEntity
{

    //...

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\User")
     * @ORM\JoinColumn(nullable=false)
     */
    private $user;

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

    //...
}

但我得到错误: Cannot create an instance of App\Entity\SimpleEntity from serialized data because its constructor requires parameter "security" to be present.

请帮忙

元类

Symfony可以将服务注入其他服务的构造函数中,但不能注入实体的构造函数中。

通常,通过装饰apip的内置DataPersister可以在实体上设置当前用户。但是,持久保存几乎发生在处理请求的最后,而验证则更早发生。因此,验证者将看不到持久性者以后要设置的用户。因此,您需要在验证之前先在过程中设置用户。这可以通过装饰Denormalizer完成这是一项服务,因此您可以注入安全服务:

// api/src/Serializer/SimpleEntityDenormalizer

namespace App\Serializer;

use Symfony\Component\Security\Core\Security;
use Symfony\Component\Serializer\Normalizer\ContextAwareDenormalizerInterface;
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
use Symfony\Component\Serializer\SerializerAwareInterface;
use Symfony\Component\Serializer\SerializerInterface;
use App\Entity\SimpleEntity;

final class SimpleEntityDenormalizer implements ContextAwareDenormalizerInterface, SerializerAwareInterface
{
    private $decorated;
    private $security;

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

    public function supportsDenormalization($data, string $type, string $format = null, array $context = [])
    {
        if ($type !== SimpleEntity::class) return false;

        return $this->decorated->supportsDenormalization($data, $type, $format, $context);
    }

    public function denormalize($data, string $type, string $format = null, array $context = [])
    {
        $object = $this->decorated->denormalize($data, $type, $format, $context);

        if (null === $object->getUser()) {
            $object->setUser($this->security->getUser());
        }

        return $object;
    }

    public function setSerializer(SerializerInterface $serializer)
    {
        if($this->decorated instanceof SerializerAwareInterface) {
            $this->decorated->setSerializer($serializer);
        }
    }
}

将以下内容添加到api / config / services.yaml中:

'App\Serializer\SimpleEntityDenormalizer':
    decorates: 'api_platform.jsonld.normalizer.item'
    arguments: [ '@App\Serializer\SimpleEntityDenormalizer.inner' ]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章