0

私はZF2を学んでいます。getServiceLocator()を使用してモデル内のアダプタを取得するにはどうすればよいですか?

getServiceLocator()を使用してモデルでアダプタを取得できますか?だから、

/config/autoload/global.php

return array(
    'db' => array(
     'driver'   => 'Pdo', 
     'dsn'   => 'mysql:dbname=zf2tutorial;host=localhost', 
     'driver_options' => array(
      PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' 
     ), 
    ), 
    'service_manager' => array(
     'factories' => array(
      'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory', 
     ), 
     'aliases' => array(
      'db' => 'Zend\Db\Adapter\Adapter', 
     ), 
    ), 
); 

/config/autoload/local.php

return array(
    'db' => array(
     'username' => 'YOUR USERNAME HERE', 
     'password' => 'YOUR PASSWORD HERE', 
    ), 
); 

、どのように私は使用することができます。

$sm = $this->getServiceLocator(); 
$this->dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 

モデルでアダプタを取得するには?

答えて

0

最新のZend Frameworkバージョンを使用している場合は、ServiceLocatorAwareInterfaceServiceManagerAwareInterfaceの両方が削除されているので、コントローラクラスでgetServiceLocatorメソッドを使用することはできません。

ので、この行:あなたは多分あなたのコントローラクラスで期待どおり

$sm = $this->getServiceLocator(); 

は動作しません。


はまたthe migration guideにこの変更の詳細を読むことができます:

次のインタフェース、特徴、およびクラスは削除されました:

  • ...
  • のZend \ ServiceManager \ ServiceLocatorAwareInterface
  • Zend \ ServiceManager \ ServiceLocatorAwareTrait
  • のZend \ ServiceManager \ ServiceManagerAwareInterface

ServiceLocatorAwareとServiceManagerAwareインタフェースおよび特徴は、あまりにも頻繁にv2の下に虐待され、およびService Managerのコンポーネントの目的のアンチテーゼを表しました。依存関係は直接注入されるべきであり、コンテナは決してオブジェクトによって構成されるべきではありません。

サービスをリファクタリングする必要があります。サービスをリファクタリングする必要があります。これを行うには、依存関係を注入するサービスファクトリを作成するのが最も良い方法でしょう。

また、ファクトリの構築方法の詳細については、this blog postファクトリ)を参照してください。

2

アダプターをモデル作成時に、例えば工場で注入する必要があります。お使いの設定で例えば

'service_manager' => array(
    'factories' => array( 
     'Application\Some\Model' => '\Application\Some\ModelFactory' 
    ) 
) 

あなたは、あなたのモデルにアダプタを注入するファクトリを作成します。

<?php 
namespace Application\Some; 

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

class ModelFactory implements FactoryInterface 
{ 
    /** 
    * Create service 
    * 
    * @param ServiceLocatorInterface $serviceLocator 
    * @return mixed 
    */ 
    public function createService(ServiceLocatorInterface $serviceLocator) 
    { 
     $adapter = $serviceLocator->get('Zend\Db\Adapter\Adapter'); 

     return new Model($adapter); 
    } 
} 

あなたは、その後明らかにあなたのモデルを受け入れるようにする必要がありますこの場合、コンストラクタ内のアダプタです。

あなたが呼びたい注入し、アダプタを使用して、モデルのインスタンスを取得する必要があり、これまで今

$serviceLocator->get('Application\Some\Model'); 

をこれは、工場に電話して、アダプタとの完全なモデルを取り戻すだろう。

次に、同じ種類のアプローチを使用して、必要なコントローラまたはサービスクラスにモデルを注入します。あなたのオブジェクトに直接サービスロケータ/サービスマネージャを注入するのではなく、それを使用して、Factoryクラスなどの中から必要な項目(アダプタ/マッパーなど)を追加してください。

関連する問題