12

コントローラーでモデルを作成して使用するので、

public function getAlbumTable()
{
    if (!$this->albumTable) {
        $sm = $this->getServiceLocator();
        $this->albumTable = $sm->get('Album\Model\AlbumTable');
    }
    return $this->albumTable;
}

このグローバル Service Locator をプロジェクトの別の場所 (たとえば、他のモデルなど) で、コントローラーだけでなく使用するにはどうすればよいですか?

データベースへの接続の構成は、次のファイルで定義されます: my_project/config/autoload/global.php

ありがとうございました。

4

3 に答える 3

15

Zend MVC は、ServiceLocator インスタンスを Zend\ServiceManager\ServiceLocatorAwareInterface を実装するクラスに挿入します。モデル テーブルの簡単な実装は次のようになります。

<?php
use Zend\Db\TableGateway\AbstractTableGateway;
use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class UserTable extends AbstractTableGateway implements ServiceLocatorAwareInterface {
  protected $serviceLocator;

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

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

  // now instance of Service Locator is ready to use
  public function someMethod() {
    $table = $this->serviceLocator->get('Album\Model\AlbumTable');
    //...
  }
}
于 2012-10-07T18:13:23.507 に答える
6

決めた。そう。モデルのクラスのタスクを解決するには、インターフェイス ServiceLocatorAwareInterface を実装する必要があります。したがって、インジェクション ServiceManager はモデルで自動的に発生します。前の例を参照してください。

アプリケーションのフォームやその他のオブジェクトについては、ここで提案されている適切なメソッドhttp://michaelgallego.fr/blog/?p=205基本クラス フォームを作成して、BaseForm を拡張し、ServiceManagerAwareInterface を実装して、そこからアプリケーションでそのフォームを継承することができます。 .

namespace Common\Form;

use Zend\Form\Form as BaseForm;
use Zend\ServiceManager\ServiceManager;
use Zend\ServiceManager\ServiceManagerAwareInterface;

class Form extends BaseForm implements ServiceManagerAwareInterface
{
    /**
     * @var ServiceManager
     */
    protected $serviceManager;

    /**
     * Init the form
     */
    public function init()
    {
    }

    /**
     * @param ServiceManager $serviceManager
     * @return Form
     */
    public function setServiceManager(ServiceManager $serviceManager)
    {
        $this->serviceManager = $serviceManager;

        // Call the init function of the form once the service manager is set
        $this->init();

        return $this;
    }
}

ServiceManager のオブジェクトを挿入するには、ファイル module.config.php のセクション service_manager に自動的に書き込む必要があります。

'invokables' => array(
    'Album\Form\AlbumForm' => 'Album\Form\AlbumForm',
),

次に、コントローラーでフォームを作成して、

$form = $this->getServiceLocator()->get('Album\Form\AlbumForm');

フォームには、他の依存関係を許可するオブジェクト ServiceManager が含まれます。

ご協力ありがとうございます。

于 2012-10-09T05:52:18.417 に答える