问题
I'm trying to use a parameter that i've set in service.yaml as such :
parameters: app.path.users_profile_picture: uploads/users/profile-picture
Directly from within a User Entity, And I can't figure out how to do this ?
回答1:
I'm not sure of what you're trying to do or why, it does look like there may be a better way of achieving what you want.
That being said, it is possible to use a parameter from your services.yaml in an entity, but you can't inject it directly in the entity's constructor. If you're using Doctrine you can inject it by subscribing to the postLoad event, which is dispatched after an entity is constructed by the entityManager.
Let's say you have a User entity with an attribute for the services.yaml param you want tu use:
<?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;
}
}
You need an EventSubscriber so you can do stuff on the postLoad event:
<?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);
}
}
}
Then in your services.yaml you need to configure the subscriber and pass the param you want:
# 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'
Now you can use your param in your entity (User::getServiceArgument()).
来源:https://stackoverflow.com/questions/56619776/symfony-4-how-tu-use-service-yaml-parameter-from-within-entity