0

わかりましたので、DoctrineのORMモジュールでZF2を使用しています

というモデルがありますProjectGateway.php

私の質問は、getServiceLocator()->I get call to undefined class エラーを介してサービスロケーターにアクセスする方法です。

モデルはクラスを拡張する必要がありますか? いくつかのインポートがありませんか?

コントローラー経由でアクセスできます。

正しい方向への舵取りは大歓迎です。

4

1 に答える 1

4

これには 2 つの方法があります。

  1. モデルをサービスとして構成に追加しServiceManager、モデル クラスがそのクラスを実装していることを確認しますZend\Service\ServiceLocatorAwareInterface
  2. を使用する別のクラスを介して、ゲッター/セッターによってモデルにサービス マネージャーを手動で追加しますServiceManagerController。_

方法 1:

// module.config.php
<?php
return array(
    'service_manager' => array(
        'invokables' => array(
            'ProjectGateway' => 'Application\Model\ProjectGateway',
        )
    )
);

ServiceLocatorAwareInterfaceモデルがとそのメソッドを実装していることを確認してください。

namespace Application\Model;

use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class ProjectGateway implements ServiceLocatorAwareInterface 
{
    protected $serviceLocator;

    public function setServiceLocator(ServiceLocatorInterface $serviceLocator) {
        $this->serviceLocator = $serviceLocator;
    }

    public function getServiceLocator() {
        return $this->serviceLocator;
    }
}

コントローラーから、次のようにして取得できるようになりProjectGatewayました。

$projectGateway = $this->getServiceLocator->get('ProjectGateway');

ProjectGatewayしたがって、次の手順を実行して、クラスで ServiceManager を使用できるようになりました。

public function someMethodInProjectGateway()
{
    $serviceManager = $this->getServiceLocator();
}

UPDATE 04/06/2014:方法 2:

基本的に、モデルに必要なのは、ServiceManager以下に示す方法 1 に示すように、のゲッター/セッターです。

namespace Application\Model;

use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class ProjectGateway implements ServiceLocatorAwareInterface 
{
    protected $serviceLocator;

    public function setServiceLocator(ServiceLocatorInterface $serviceLocator) {
        $this->serviceLocator = $serviceLocator;
    }

    public function getServiceLocator() {
        return $this->serviceLocator;
    }
}

次に、他の場所(たとえば a )から行う必要があるのは、そこにあるControllerを解析するServiceManagerことだけです:

namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Application\Model\ProjectGateway;

class SomeController extends AbstractActionController
{
    public function someAction()
    {
        $model = new ProjectGateway();

        // Now set the ServiceLocator in our model
        $model->setServiceLocator($this->getServiceLocator());
     }
}

それ以上のことはありません。

ただし、方法 2 を使用するとProjectGateway、アプリケーション全体でオンデマンドでモデルをすぐに利用できないことを意味します。ServiceManager毎回インスタンス化して設定する必要があります。

ただし、最後の注意として、モデルは最初に呼び出す前にインスタンス化されないため、方法 1 は方法 2 よりもリソースがそれほど多くないことに注意する必要があります。

于 2013-09-23T14:43:22.893 に答える