我正在尝试使用在service.yaml中设置的参数:
参数: app.path.users_profile_picture :上传/用户/个人资料图片
直接从用户实体内部,我不知道该怎么做?
答案 0 :(得分:1)
我不确定您要做什么或为什么这么做,看起来确实有更好的方法来实现您想要的目标。
话虽这么说,可以在实体中使用services.yaml
中的参数,但是您不能将其直接注入实体的构造函数中。如果您使用的是Doctrine,则可以通过订阅postLoad
事件来注入它,该事件是在entityManager
构建实体之后分派的。
假设您有一个User
实体,该实体具有您要使用的services.yaml参数的属性:
<?php
namespace App\Entity;
private $serviceArgument;
class User
{
/**
* @return mixed
*/
public function getServiceArgument()
{
return $this->serviceArgument;
}
/**
* @param mixed $serviceArgument
*/
public function setServiceArgument($serviceArgument): void
{
$this->serviceArgument = $serviceArgument;
}
}
您需要一个EventSubscriber
,以便可以在postLoad
事件上做一些事情:
<?php
namespace App\EventSubscriber;
use App\Entity\User;
use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
use Doctrine\ORM\Events;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class UserSubscriber implements EventSubscriberInterface
{
protected $serviceArgument;
// Inject param from services.yaml
public function __construct($serviceArgument)
{
$this->serviceArgument = $serviceArgument;
}
// Listen to postLoad event
public static function getSubscribedEvents()
{
return array(
Events::postLoad,
);
}
// Set the services.yaml param on the entity
public function postLoad(LifecycleEventArgs $args)
{
$user = $args->getObject();
if ($user instanceof User) {
$user->setServiceArgument($this->serviceArgument);
}
}
}
然后在您的services.yaml
中,需要配置订户并传递所需的参数:
# config/services.yaml
services:
_defaults:
autowire: true
autoconfigure: true
public: false
App\EventSubscriber\UserSubscriber:
tags:
- { name: doctrine.event_listener, event: postLoad }
arguments:
$serviceArgument: 'Argument from my services.yaml'
现在,您可以在实体(User::getServiceArgument()
)中使用参数了。