8

エンティティ クラスで Service Manager を使用しようとしていますが、最適な方法がわかりません。

$this->getServiceLocator(); でサービス マネージャーを呼び出すことができるため、コントローラーでは簡単です。

しかし、私のエンティティ クラスでは、ServiceLocatorAwareInterface を実装しても、私のエンティティ クラスはサービス マネージャーで呼び出されないため、ServiceManager を取得できます。

だから最善の方法は何ですか:

1 - コントローラーからエンティティ クラスに serviceManager を渡す 2 - ServiceManager を使用してエンティティ クラスを構築する 3 - ... ?

私の問題を最もよく理解するために、それは動作しない私のコードです:

私のエンティティクラス:

class Demande extends ArraySerializable implements InputFilterAwareInterface {
/../
    public function getUserTable() {
    if (! $this->userTable) {

        $sm = $this->getServiceLocator();//<== doesn't work !
        $this->userTable = $sm->get ( 'Application\Model\UserTable' );
    }
    return $this->userTable;
}
4

1 に答える 1

18

ServiceManager をモデルに挿入しません (ただし、可能です)。ServiceManager にモデルを構築してもらい、必要なものをモデルに直接注入したいと思います。

サービス構成:

'factories' => array(
    'SomethingHere' => function($sm) {
        $model= new \My\Model\Something();

        return $model;
    },
    '\My\Model\Demande' => function($sm) {
        $model= new \My\Model\Demande();
        /**
         * Here you use the SM to inject any dependencies you need
         * into your model / service what ever..
         */
        $model->setSomething($sm->get('SomethingHere'));

        return $model;
    },
    /**
     * Alternatively you can provide a class implementing
     * Zend\ServiceManager\FactoryInterface
     * which will provide an instance for you instad of using closures
     */
    '\My\Model\DemandeDefault' => '\My\Model\DemandeFactory',

依存関係を Service Manager Config 内に配置し、それを使用して依存関係をモデルやサービスなどに注入します。

クロージャではなくファクトリ メソッドを使用する場合のファクトリ クラスの例:

DemandeFactory.php

use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class DemandeFactory implements FactoryInterface
{
    /**
     * Create a new Instance
     *
     * @param ServiceLocatorInterface $serviceLocator
     * @return Demande
     */
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        $config = $serviceLocator->get('Config'); // if you need the config..
        // inject dependencies via contrustor
        $model = new \My\Model\Demande($serviceLocator->get('SomethingHere'));
        // or using setter if you wish.
        //$model->setSomething($serviceLocator->get('SomethingHere'));

        return $model;
    }
}

Service Manager を介してインスタンス化しようとしているモデルの例。

Demande.php

class Demande
{
    protected $_something;

    /**
     * You can optionally inject your dependancies via your constructor
     */
    public function __construct($something)
    {
        $this->setSomething($something);
    }

    /**
     * Inject your dependencies via Setters
     */
    public function setSomething($something)
    {
        $this->_something = $something;
    }

    // Something will be injected for you by the Service Manager
    // so there's no need to inject the SM itself.
}

コントローラーで:

public function getDemande() 
{
    if (! $this->_demande) {
        $sm = $this->getServiceLocator();
        $this->_demande = $sm->get ('\My\Model\Demande');
    }
    return $this->_demande;  
}  

SergiceManager/ServiceLocator をモデルに挿入できますが、モデルは ServiceLocator に依存します。

于 2013-02-14T14:56:19.370 に答える