0

ZF2を学んでいます。

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');

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

4

2 に答える 2

0

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

したがって、この行:

$sm = $this->getServiceLocator();

コントローラー クラスで期待どおりに動作しません。


この変更の詳細については、移行ガイドでもお読みいただけます。

次のインターフェイス、特性、およびクラスが削除されました。

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

ServiceLocatorAware と ServiceManagerAware のインターフェイスと特性は、v2 ではあまりにも頻繁に悪用されており、Service Manager コンポーネントの目的とは正反対のものです。依存関係は直接注入する必要があり、コンテナーをオブジェクトで構成することはできません。

サービスをリファクタリングする必要がありますが、そのためのおそらく最善の方法は、依存関係を注入するサービス ファクトリを作成することです。

ファクトリの構築方法の詳細については、このブログ投稿(「ファクトリ」の章)も参照してください。

于 2016-12-15T08:04:30.220 に答える