新しい ZF2 アプリを作成しています。「どこからでも」サービスを呼び出す ServiceLocator の使用パターンが ZF3 から非推奨になっていることに気付きました。ZF3向けのコードを書きたいと思っています。
コンストラクター時にすべての依存関係を呼び出すようにコントローラーを設定することができました。しかし、それはつまり、Doctrine
必要になる前にオブジェクトをロードすることを意味します。
質問
すぐに必要なときにのみ読み込まれるように設定するにはどうすればよいですか? (遅延ロード)。ZF3 はロードをコントローラーの構造に移行することを理解しています。
古いコード
class CommissionRepository
{
protected $em;
function getRepository()
{
//Initialize Doctrine ONLY when getRepository is called
//it is not always called, and Doctrine is not always set up
if (! $this->em)
$this->em = $this->serviceLocator->get('doctrine');
return $this->em;
}
}
ServiceLocator パターンのリファクタリング後の現在のコード
class CommissionRepository
{
protected $em;
function getRepository()
{
return $this->em;
}
function setRepository($em)
{
$this->em = $em;
}
function useRepository($id)
{
return $this->em->find($id);
}
}
class CommissionControllerFactory implements FactoryInterface
{
public function createService(ServiceLocatorInterface $serviceLocator)
{
$parentLocator = $controllerManager->getServiceLocator();
// set up repository
$repository = new CommissionRepository();
$repository->setRepository($parentLocator->get('doctrine'));
// set up controller
$controller = new CommissionController($repository);
$controller->setRepository();
return $controller;
}
}
class CommissionController extends AbstractActionController
{
protected $repository;
public function setRepository(CommissionRepository $repository)
{
$this->repository = $repository;
}
public function indexAction()
{
//$this->repository already contains Doctrine but it should not
//I want it to be initialized upon use. How?
//Recall that it has been set up during Repository construction time
//and I cannot call it from "anywhere" any more in ZF3
//is there a lazy loading solution to this?
$this->repository->useRepository();
}