Symfony 4-如何从实体内部使用service.yaml参数

时间:2019-06-16 14:31:26

标签: php symfony4

我正在尝试使用在service.yaml中设置的参数:

参数:      app.path.users_profile_picture :上传/用户/个人资料图片

直接从用户实体内部,我不知道该怎么做?

1 个答案:

答案 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())中使用参数了。