我想注入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] 删除。
我来说两句