2013-02-14 15 views
6

私はZend Framework 2を長年のZend Framework 1開発者として学び始めました。私は新しい用語の周りに私の頭を包んで少し問題を抱えています。Zend Framework 2 - アプリケーション/モジュール/サービスマネージャー - Oh My

ZF1に戻って、アプリケーションにグローバルなロガーを作成したいのであれば、application.iniファイルに設定を追加すると、ブートストラップがリソースとして初期化されます(私はそれを正しく言うことを望みます) 。そこで、私のモジュールコントローラのどれかから、ブートストラップリソースを通してロガーにアクセスすることができました。

ZF2と入力してください。モジュールはちょっと違っていて、自己完結型ですが、アプリケーションとのやりとり方法についてちょっと混乱しています。これはServiceManagerが出現する場所のようです。私の目標は、アプリケーションがロガーを定義しているかどうかをチェックするモジュール(コントローラーではなくモジュール自体)を持っているかどうかを確認することです。アプリケーションでロガーが定義されていない場合は、モジュールでモジュールのロギング用のロガーを定義する必要があります。

この質問は、データベースにも関係しています。アプリケーションに必要なテーブルのロジックを定義するために、データベース接続のロジックを定義させたいとしましょう。これをどのように正確に構成すればよいのですか、アプリケーションに定義されているデータベース・リソースがすでに存在するかどうかをどのように/どこで確認できますか。

注:私はロブアレンのクイックスタート(非常に情報と私が見つけた唯一のリソースはあまり知られていない唯一のリソース)とZF2(readthedocs)とグーグルトンを既に見てきました。私が見つけているのは、パズルの特定の部分がどこに行くのかという情報は、一般的に非常にわかりにくいということです。

答えて

6

あなたがZend Framework 1.xから知っていることは、「アプリケーションリソース」です。

「アプリケーションリソース」の概念は、他の変更は、モジュール自体、いわゆる"services"(イントロhere

によってZend Frameworkの2で置換されています。 ZF1では、モジュールは主に、リクエストの一部を処理するアプリケーションのサブセクションでした。これはZF2ではもはや当てはまりません。モジュールがサービスやコントローラを定義していれば、そのアプリケーションがすべてのアプリケーションにアクセスできるようになります。いくつかの素晴らしいイントロがdifferences between ZF1 and ZF2 by Gary Hockinにあります。

とにかく、モジュールはではありません自己完結型です。これらは、孤立した環境で、できるだけ依存性が低くなるように開発する必要がありますが、すべてのアプリケーションに影響を与える相互関係の機能を提供します。

具体的なロガーの場合は、モジュールが常にロガーを定義して消費することをお勧めします。どのような条件付きロガーを定義するために行うことができることは以下の通りです:あなたは、すべてのアプリケーション間であなたの「いくつかのロガー-name」を使用することができるだろう

class MyModule 
{ 
    public function onBootstrap($e) 
    { 
     // $e->getTarget() is the \Zend\Mvc\Application 
     $sm = $e->getTarget()->getServiceManager(); 

     if (!$sm->has('some-logger-name')) { 
      $sm->setFactory('some-logger-name', function ($sl) { 
       return new MyLogger($sl->get('some-db')); 
      }); 
     } 
    } 
} 

異なるアプローチがちょうどロガーサービスを定義し、他のモジュールまたは構成後に、それを上書きさせることです。

あまり柔軟性があり、キャッシュできないが、より高い有し、 getServiceConfigで達成される
class MyModule 
{ 
    public function getConfig() 
    { 
     return array(
      'service_manager' => array(
       'factories' => array(
        'some-logger-name' => 'My\Logger\Factory\ClassName' 
       ), 
      ), 
     ); 
    } 
} 

同じgetConfig以上の優先順位は(オーバーライドを可能に)、あなたはまた、クロージャとしてサービスファクトリを定義することができます:

class MyModule 
{ 
    public function getServiceConfig() 
    { 
     return array(
      'factories' => array(
       'some-logger-name' => function ($sl) { 
        return new MyLogger($sl->get('some-db')); 
       }, 
      ), 
     ); 
    } 
} 

あなたは、その後も、どのロガー(サービスNAを決定するために使用する必要がある設定キーを定義することができます私)使用する。

モジュールと設定のコンセプトは、「最後のモジュールが勝つ」ということです。そのため、モジュールまたはその前にロードされたモジュールのいずれかにサービス'some-logger-name'を定義することができます。

DB接続にも同じ概念が適用されます。

サービスに移動すると、すでにある程度の自由度が得られています。

「アプリケーション」があなたのために何かを定義しているわけではないことに留意してください:モジュールはあなたのサービス/設定/イベントなどを定義します...実行中のアプリケーションは、

+0

public function onBootstrap(MvcEvent $e) { //setup some $logger $sharedManager = $e->getApplication()->getEventManager()->getSharedManager(); $sharedManager->attach('*', 'log', function($e) use ($logger) { /** @var $e MvcEvent */ $target = get_class($e->getTarget()); $message = $e->getParam('message', 'No message provided'); $priority = $e->getParam('priority', Logger::INFO); $message = sprintf('%s: %s', $target, $message); $logger->log($priority, $message); }); } 

その後、例えば、アプリケーションの任意の場所からコントローラを、それをトリガーあなたが提供したリンクを見て、私は少し遅れて今日深くそれを通ります)。私が抱えていた苦労(上記の質問に部分的に触れた)のために、私はZF2のソースコードを読んでワークフローをよりよく理解し始めました。あなたの応答は、ソースコードを読むことと相まってよく説明されています。私は、どのように一緒に収まるかをよりよく把握し始めています。私はあなたが提供した読み込み(リンク)を楽しみにしていますが、ZF1からZF2に移動する必要があるように見えます。 –

+0

ZF2の新しいリリースと、サービス管理/イベント駆動型へのプロセスの変更量に加えて、これまで利用可能な情報には曖昧さがあります(少なくとも私が見たものから)移行をうまく説明しているように、あなたが提供したリンクを非常に感謝しています。 –

+0

@AaronMurrayのマスター 'ServiceManager'と' EventManager'とすべてがはるかに簡単に見えます。 – Ocramius

3

ロギングの場合は特に、ServiceManagerを使用するよりも、おそらくもっと良い、確かにカプセル化された方法があると思います。 ZF2は本質的にイベント駆動型フレームワークであり、このイベント駆動型アーキテクチャを可能にする機能性を我々の利益に利用することができる。ロギングはそのための完全な例です。ファクトリを定義するのではなく、アプリケーション内のどこからでも起動できるロガーイベントを添付するだけです。

はあなたのModule.phplogイベントリスナーをアタッチ:私は非常に過去記事に感謝(かつ迅速

$this->getEventManager()->trigger('log', $this, array(
    'priority' => \Zend\Log\Logger::INFO, 
    'message' => 'just some info to be logged' 
)); 
+0

これは実際にモジュール全体で利用できる「ロガー」についてではありませんが、基本的にはクロスカッティングの問題を解決するためにイベントマネージャをどのように使用するかについての説明です。 P – Ocramius

+0

Markusが(コードを通じて)言っていることをいくらか理解しています。それは、私がそれについて尋ねていたコードではありませんので、@Ocramiusに同意します。 Zend_Frameworksの「リソース」から私の「リソース」をどこに定義してアプリケーションにアクセスできるようにするかを理解する。私は両方の答えの情報を使ってより鮮明な絵を描き始めています。私はModuleManager、EventManager、ServiceManagerを強く理解している週末の過半数を過ごしていると思うし、私は 'Converted'になるだろうと思う。 –

+0

過去には最も難しいことは、ステートレスな環境ですが、それは私に来ています:) –

関連する問題