編集 1: 自分自身をうまく説明できなかったようです。クラス Foo はエンティティではありません。エンティティマネージャーにアクセスしたい汎用モデルです。
編集 2: 私の質問に対する答えはないと思います。基本的に、このクラスがサービス マネージャーによって呼び出されなくても EntityManager にアクセスできるクラスが必要でした。これは、サービス マネージャーによっても呼び出されないクラスによって呼び出される可能性があるためです。言い換えれば、私は ZF1 で Zend_Registry が達成していたことを達成しようとしていました。私がやろうとしていることを行う別の方法を見つけなければなりません。
コントローラーで行ったのと同様の方法で、モデルでDoctrineのエンティティマネージャーにアクセスしようとしています:
$this->getServiceLocator()->get('Doctrine\ORM\EntityManager');
ZF2 マニュアル (http://framework.zend.com/manual/2.0/en/modules/zend.service-manager.quick-start.html) には次のように書かれています。
デフォルトでは、Zend Framework MVC は、Zend\ServiceManager\ServiceLocatorAwareInterface を実装する任意のクラスに、Zend\ServiceManager\ServiceLocatorInterface の実装である ServiceManager インスタンスを挿入するイニシャライザを登録します。
そこで、次のクラスを作成しました。
<?php
namespace MyModule\Model;
use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class Foo implements ServiceLocatorAwareInterface
{
protected $services;
public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
{
$this->services = $serviceLocator;
}
public function getServiceLocator()
{
return $this->services;
}
public function test()
{
$em = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager');
}
}
次に、別のクラスから、このクラスを次のように呼び出します。
$foo = new \MyModule\Model\Foo();
$foo->test()
次のエラーがスローされます。
PHP 致命的なエラー: 非オブジェクトでのメンバー関数 get() の呼び出し
だから、私はどこかで何かが欠けていると思いますが、何ですか?どこ?どのように?おそらく、エンティティマネージャーに簡単にアクセスできますか?
ありがとう!