Zend Framework 2のモジュールを追加してみる
こんにちは、株式会社ライオンハートの鵜飼です。
前回・前々回に引き続きZend Framework 2についてのメモです。今回はモジュールについて。
小さいアプリケーションであればスケルトンアプリケーションそのまま一つのモジュールで問題は無いと思いますが、複雑なアプリケーションを構築する際には特定の機能ごとに設定を変えたい…という様にモジュールを複数用意をすることで実現が可能です。
今回はスケルトンアプリケーションを元に、新しくモジュールを追加した場合のメモを残しておきます。
module内のデータをコピー
まずは、モジュールのデータを複製してみます。モジュールのデータは、module/Application
に入っていますので、ディレクトリごと複製をします。
今回はSubmodule
という名前で作ってみます。
また、複製したディレクトリの中にも、同様の名称のディレクトリが存在しますので、そちらも変更します。
module/Submodule/src/Application
->module/Submodule/src/Submodule
module/Submodule/view/application
->module/Submodule/src/submodule
取り急ぎデータの準備はこれでOKです。引き続き設定情報等の変更をします。
namespaceを変更する
モジュールの各ファイルの中の所々にnamespace
の記載がありますので、そちらを今回作ったモジュール名に変更します。
namespace
の記載があるファイルは下記の通りです。
module/Submodule/Module.php
module/Submodule/config/module.config.php
module/Submodule/src/Submodule/
ディレクトリ内の各ファイル
今回はApplication
モジュールから複製していますので、Application
をSubmodule
に書き換えます。
例えば、module/Submodule/Module.php
を変更する際は下記の通りです。
<?php namespace Submodule; // Application -> Submoduleに変更 use Zend\Mvc\ModuleRouteListener; use Zend\Mvc\MvcEvent; class Module { // 略 }
module.config.php を設定する
次にモジュールの設定ファイルmodule/Submodule/config/module.config.php
の一部を変更します。
<?php namespace Submodule; // 変更済みのはず return array( 'router' => array( 'routes' => array( // 略 'submodule' => array( // application -> submodule に変更 'type' => 'Literal', 'options' => array( 'route' => '/submodule', // application -> submodule に変更 'defaults' => array( '__NAMESPACE__' => 'Submodule\Controller', // Application -> Submodule に変更 'controller' => 'Index', 'action' => 'index', ), ), 'may_terminate' => true, 'child_routes' => array( 'default' => array( 'type' => 'Segment', 'options' => array( 'route' => '/[:controller[/:action]]', 'constraints' => array( 'controller' => '[a-zA-Z][a-zA-Z0-9_-]*', 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', ), 'defaults' => array( ), ), ), ), ), ), ), // 略 );
layout.phtml
を同じファイルにしたい場合は、view_manager
の値についても調整をした方が良いかもしれません。
application.config.php を設定する
最後に、アプリケーション全体の設定ファイルconfig/application.config.php
に追加したモジュールの情報を追記します。
<?php return array( // This should be an array of module namespaces used in the application. 'modules' => array( 'Application', 'Submodule', // Submoduleを追加 ), // 略 );
これで、http://example.com/submodule/[controller[/action]]
というURLで、作成したモジュールにアクセスが可能となります。
雑感
この辺りの設定の多さについてはちょっと敷居の高さを感じますがその分柔軟性を感じるので、大きなシステムになったとしても、設計・設定がしっかりなっていればスッキリした構成を残したままにすることが出来そうですね。
また、ZF2自体がPSRに準じているので、そのままPSRについても学べそうな感じがして良い感じな気がします。特にnamespace周りは後回しにしてきてしまったので、ここでしっかり学んでいきたいです。