Zend Framework 1.x からわかることは、「アプリケーション リソース」です。
「アプリケーション リソース」の概念は、Zend Framework 2 ではいわゆる「サービス」に置き換えられました(イントロはこちら) 。
もう 1 つの変更点は、モジュール自体です。ZF1 では、モジュールは主に、一部の要求を処理するアプリケーションのサブセクションでした。これは ZF2 では当てはまりません。モジュールがサービスまたはコントローラーを定義している場合、そのサービスまたはコントローラーはすべてのアプリケーションからアクセスできるようになりました。Gary Hockin による ZF1 と ZF2 のいくつかの違いについての紹介があります。
とにかく、モジュールは自己完結型ではありません。それらは隔離された環境で開発し、依存関係をできるだけ少なくする必要がありますが、すべてのアプリケーションに影響を与える相互懸念機能を提供します。
ロガーの特定のケースについては、モジュールで常にロガーを定義して使用することをお勧めします。条件付きでロガーを定義するために実行できることは次のとおりです。
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'));
});
}
}
}
その後、すべてのアプリケーションで「some-logger-name」を使用できます。
別のアプローチは、単にロガー サービスを定義し、後で他のモジュールまたは構成でオーバーライドできるようにすることです。
class MyModule
{
public function getConfig()
{
return array(
'service_manager' => array(
'factories' => array(
'some-logger-name' => 'My\Logger\Factory\ClassName'
),
),
);
}
}
これは柔軟getServiceConfig性が低く、キャッシュできませんが、getConfig(オーバーライドを許可する) より優先度が高く、サービス ファクトリをクロージャーとして定義することもできます。
class MyModule
{
public function getServiceConfig()
{
return array(
'factories' => array(
'some-logger-name' => function ($sl) {
return new MyLogger($sl->get('some-db'));
},
),
);
}
}
次に、使用するロガー (サービス名) を決定するために使用する必要がある構成キーを定義することもできます。
モジュールと構成の概念は、「最後のモジュールが勝つ」というものであるため'some-logger-name'、モジュールまたはその前にロードされたモジュールでサービスを定義できます。
同じ概念が DB 接続にも適用されます。
ご覧のとおり、サービスに移行することで、ある程度の自由が得られました。
「アプリケーション」が何かを定義するわけではないことに注意してください。モジュールはサービス/構成/イベントなどを定義します...実行中のアプリケーションは、これらすべてのものをまとめたものです。