Symfony 4 - 如何在实体中使用 service.yaml 参数
Symfony 4 - How tu use service.yaml parameter from within Entity
我正在尝试使用我在 service.yaml 中设置的参数:
参数:
app.path.users_profile_picture: uploads/users/profile-picture
直接从用户实体内部,我不知道该怎么做?
我不确定您要做什么或为什么,看起来可能有更好的方法来实现您想要的。
也就是说,可以在实体中使用 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()
)。
我正在尝试使用我在 service.yaml 中设置的参数:
参数: app.path.users_profile_picture: uploads/users/profile-picture
直接从用户实体内部,我不知道该怎么做?
我不确定您要做什么或为什么,看起来可能有更好的方法来实现您想要的。
也就是说,可以在实体中使用 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()
)。