LionHeart SD BLOG

株式会社ライオンハート システムデザインの技術ブログ

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モジュールから複製していますので、ApplicationSubmoduleに書き換えます。
例えば、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周りは後回しにしてきてしまったので、ここでしっかり学んでいきたいです。

参考