2

最初の ZF2 アプリケーションはそこに到達しましたが、依存性注入と ServiceManager に関しては、まだ 1 つまたは 2 つの考えが欠けていると思います。

現在、作成中の新しいデータベース ゲートウェイ クラスに特定の問題があります。データベース アダプターを挿入しないので、AdapterAwareInterface を実装しました。しかし、私のクラスでは setDbAdapter メソッドが呼び出されることはありません。誰かが私のコードを見て、何がうまくいかないのか (または何が欠けているのか!) を提案してくれるのではないかと思っています。

したがって、これが AdapterAwareInterface を実装するクラスです。

<?php
namespace Foo\Database;
use Zend\Db\Adapter\Adapter;
use Zend\Db\Adapter\AdapterAwareInterface;
use Zend\Log\LoggerAwareInterface;
use Zend\Log\LoggerInterface;


class Gateway implements AdapterAwareInterface, LoggerAwareInterface
{
protected $logger = NULL;
protected $db = NULL;

public function setDbAdapter(Adapter $adapter)
{
    $this->db = $adapter;
} 

public function setLogger(LoggerInterface $logger)
{
    $this->logger = $logger;
}

これは、サービス マネージャーの構成方法を示すモジュール ファイルからの抜粋です。

    public function getServiceConfig()
{
    return array(
        'factories' => array(
          ....
        ),
        'invokables' => array(
            'FooDatabaseGateway' => 'Foo\Database\Gateway',
        ),
        'abstract_factories' => array(
            'AbstractFeedParserFactory' => 'Bookmakers\Odds\Feeds\AbstractFeedParserFactory',
        ),
    );
}

これは私がテストしている方法です:

gateway = $this->getServiceLocator()->get('FooDatabaseGateway');

そして、これは私のグローバル設定の一部です:

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

あなたが提供できる助けに感謝します。

:wq

4

1 に答える 1

3

今朝、この問題に新鮮な目を向けてください。これが書き込みの答えだと思います..少なくとも、それは私にとってはうまくいっていると言えます。誰かがまったく異なるより良いアプローチを提案したい場合は、そうしてください:-)。

initializerそのため、サービス マネージャー構成でを使用して、setDbAdapterを実装する任意のクラス インスタンスで関数を呼び出すというビットが欠けていましたAdapterAwareInterfacegetServiceConfigしたがって、ファイルから返す配列にModule.php、次のエントリを追加しました。

public function getServiceConfig() {
  return array(
    'initializers' => array(
      'db' => function($service, $sm)
      {
        if ($service instanceof AdapterAwareInterface)
        {
          $service->setDbAdapter($sm->get('Zend\Db\Adapter\Adapter'));
        }
      }....

ZF2 を学習しているときに欠けているのは、使用する構成要素がたくさんあるということですが、それらの多くを自分で組み立てる必要があります。

物事は順調に進んでおり、フレームワークを楽しんでいますが、学ぶべきことがたくさんあり、古き良きコンストラクター注入ではなく、サーバー マネージャー注入を使用することにまだ納得していません!

:wq

于 2012-12-11T10:20:52.470 に答える