eduardo_conceicao
eduardo_conceicao

Reputation: 174

Access configuration value inside a symfony 2 entity

What is the best way to access configuration values inside an entity in a symfony 2 application?

I've searched about this and i've found two solutions:

  1. Define the entity as a service and inject the service container to access configuration values
  2. And this approach which defines a class in the same bundle of the entity with static methods that allows to get the parameter value

Is there any other solution? What's the best workaround?

Upvotes: 0

Views: 4612

Answers (2)

qooplmao
qooplmao

Reputation: 17759

Your entity shouldn't really access anything else, apart from associated entities. It shouldn't really have any connection outwardly to the outside world.

One way of doing what you want would be to use a subscriber or listener to listen to the entity load event and then pass that value in to the entity using the usual setter.

For example....

Your Entity

namespace Your\Bundle\Entity;

class YourClass
{
    private $parameter;

    public function setParameter($parameter)
    {
        $this->parameter = $parameter;

        return $this;
    }

    public function getParameter()
    {
        return $this->parameter;
    }

    ...

}

Your Listener

namespace Your\Bundle\EventListener;

use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Your\Bundle\Entity\YourEntity;

class SetParameterSubscriber implements EventSubscriber
{
    protected $parameter;

    public function __construct($parameter)
    {
        $this->parameter = $parameter;
    }

    public function getSubscribedEvents()
    {
        return array(
            'postLoad',
        );
    }

    public function postLoad(LifecycleEventArgs $args)
    {
        /** @var YourEntity $entity */
        $entity = $args->getEntity();

        // so it only does it to your YourEntity entity
        if ($entity instanceof YourEntity) {
            $entity->setParameter($this->parameter);
        }
    }
}

Your services file.

parameters:
    your_bundle.subscriber.set_parameter.class: 
            Your\Bundle\EventListener\SetParameterSubscriber
            // Should all be on one line but split for readability

services:
    your_bundle.subscriber.set_parameter:
        class: %your_bundle.subscriber.set_parameter.class%
        arguments:
            - %THE PARAMETER YOU WANT TO SET%
        tags:
            - { name: doctrine.event_subscriber }

Upvotes: 2

Cyprian
Cyprian

Reputation: 11374

You shouldn't need a configuration in your entity.

For example you have File entity and you need to save a file represented by this entity to a disk. You need some parameter, let say "upload_dir". You can pass somehow this parameter to the entity and define a method inside this entity which saves a file to upload dir. But better way would be create a service which would be responsible for saving files. Then you can inject configurtion into it and in save method pass entity object as an argument.

Upvotes: 0

Related Questions