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');
}
}
その結果、コンテナ全体にアクセスする必要があります。
エンティティはデータモデルであり、データのみを保持する必要があります(サービスへの依存関係はありません)。特定のイベント(あなたの場合は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 }
編集:これ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;
}
}