web-dev-qa-db-ja.com

symfony 2.1(Doctrine)のエンティティからサービスコンテナを取得する

doctrine(Symfony 2.1を使用)でエンティティをサービスとして使用する方法。

使用例:

<?php

namespace MyNamespace;

class MyEntity
{
  protected $container = NULL;
  public function __construct($container)
  {
    $this->container = $container;
  }

  /** 
   * @ORM\PrePersist
   */
  public function() 
  {
    // Must call to container and get any parameters
    // for defaults sets entity parameters
    $this->container->get('service.name');
  }
}

その結果、コンテナ全体にアクセスする必要があります。

12
ZhukV

エンティティはデータモデルであり、データのみを保持する必要があります(サービスへの依存関係はありません)。特定のイベント(あなたの場合はPrePersist)の場合にモデルを変更したい場合は、そのために Doctrineリスナー を作成することを検討する必要があります。リスナーを定義するときに、コンテナーを挿入できます。

services:
    my.listener:
        class: Acme\SearchBundle\Listener\YourListener
        arguments: [@your_service_dependency_or_the_container_here]
        tags:
            - { name: doctrine.event_listener, event: prePersist }
25

編集:これIS推奨される方法ではありません、これはエンティティ内にサービスコンテナを取得する唯一の方法です。これは良い習慣ではありません。避ける必要がありますが、これは質問に答えるだけです。

それでもコンテナやリポジトリが必要な場合は、次のようにベースabastractEntityを拡張できます。

<?php

namespace Acme\CoreBundle\Entity;

/**
 * Abstract Entity 
 */
abstract class AbstractEntity
{
    /**
     * Return the actual entity repository
     * 
     * @return entity repository or null
     */
    protected function getRepository()
    {
        global $kernel;

        if ('AppCache' == get_class($kernel)) {
            $kernel = $kernel->getKernel();
        }

        $annotationReader = $kernel->getContainer()->get('annotation_reader');

        $object = new \ReflectionObject($this);

        if ($configuration = $annotationReader->getClassAnnotation($object, 'Doctrine\ORM\Mapping\Entity')) {
            if (!is_null($configuration->repositoryClass)) {
                $repository = $kernel->getContainer()->get('doctrine.orm.entity_manager')->getRepository(get_class($this));

                return $repository;
            }
        }

        return null;

    }

}
28
alex88