ZendFramework2ガイド

機能編

モジュールの追加

Zend2におけるモジュール

Zend2ではアプリケーションはモジュールの集合であると考えることができます。
モジュールとはその言葉からイメージされるとおり、あるまとまりのある機能の集まりですが、Zend2のフレームワークにはモジュールという概念が明確に存在しており、アプリケーションを構築するには、モジュールの定義が必要になります。

スケルトンアプリケーションのディレクトリ構造のトップレベルにmoduleというディレクトリがあります。ここがまさにアプリケーションとしてのモジュールを格納するディレクトリであり、moduleディレクトリの直下にモジュールを定義するということになります。

また、vendorディレクトリはその名の通り、ソフトウェアベンダーの提供するモジュールをここに格納して利用するためのディレクトリで、Zend2自体もここに格納します。自作の汎用クラスやZend2のクラスの拡張などは、独自のモジュールを定義し、vendorの中に含めるのもいいでしょう。そしてこれらのvendorの中の各モジュールも、Zend2のモジュールとして定義し、アプリケーションからモジュールを利用するようなイメージになります。

モジュールの作成

モジュール配置ディレクトリ

まず、モジュールはどこにでも置けるわけではなく、決められたディレクトリに置く必要があります。といっても、モジュールの置き場所はコンフィグで設定できるので、設定次第でどこにでも置くことができるわけではありますが。

この設定はapplication.config.phpにあります。

config/application.config.php
return array(

    'module_listener_options' => array(

        'module_paths' => array(
            './module',
            './vendor',
        ),

'module_listener_options'の下のmodule_pathsに、モジュールを置くディレクトリが設定されています。スケルトンアプリケーションの初期状態ではmoduleディレクトリとvendorディレクトリです。moduleディレクトリはアプリケーションのメインモジュールです。vendorは上述のとおり、ソフトウェアベンダーなどの提供するライブラリ等をモジュールとして配置するディレクトリです。これらディレクトリにモジュールのディレクトリを作ります。スケルトンアプリケーションmoduleの下にはApplicationというモジュールがありますが、これはメインアプリケーションのサンプルとして存在しています。vendorには必要に応じて配置するわけですが、最初は空っぽです。マニュアルなどにはvendor下にZF2というディレクトリを作って、Zend2自体を置くように鳴っていますが、これはフレームワーク自体なので、モジュールとして動作するわけではない特殊な扱いです。

新規モジュールの作成

vendorの下に自作のモジュールを作成してみましょう。今回は"My"という名前のモジュールにします。
vendorの下にMyディレクトリを作成します。


∟vendor
  ∟My

そして、このディレクトリ以下がモジュールであるとZend2に認識させるには、モジュールのルートディレクトリの直下に"Module.php"というファイルを作成し、Moduleクラスを定義する必要があります。

vendor/My/Module.php
namespace My;

class Module
{	
    public function getAutoloaderConfig()
    {
        return array(
            'Zend\Loader\StandardAutoloader' => array(
                'namespaces' => array(
                    __NAMESPACE__ => __DIR__,
                ),
            ),
        );
    }
}

まず名前空間を定義します。通常はモジュールのディレクトリ名と一致させます。
そしてModule.phpに最低限必要なのは例の通りのgetAutoloaderConfigメソッドです。これは、このモジュールの名前空間とディレクトリの対応を定義し、Zend2のクラスオートロードの仕組みでモジュールを参照できるようにするための設定です。もちろん、このファイルをrequireすることで利用することも可能ですが、Zend2ではそのような野暮ったい手続きは一切なしにオートロードに任せるべきです。そのためにgetAutoloaderConfigは必要です。

フレームワークにモジュールの存在を伝える

ここまででとりあえずモジュールとして扱える状態のものは作成出来たわけですが、このままでは作成しただけで、その存在をフレームワークは知りません。なので知らせる必要があります。それにはapplication.config.phpへ設定を加えます。

config/application.config.php
return array(

    'modules' => array(
        'My',    // 追加
        'Application',
    ),

後は、このモジュールのディレクトリ以下に配置するクラスは、ディレクトリ階層と名前空間階層を一致させればオートロードにより、モジュール内のクラスが利用できるようになるわけです。

例えばMy\FooというクラスとMy/Hoge/Varというクラスを定義してみましょう。

∟vendor
  ∟My
    ∟Hoge
      ∟Var.php
    ∟Foo.php

vendor/My/Foo.php
namespace My;

class Foo
{

}
vendor/My/Hoge/Var.php
namespace My\Hoge;

class Var
{

}

これで、他のモジュールからオートロードによりこのモジュールを呼び出す事ができます。

モジュールの利用

モジュール作成のルールに従っていれば、他のモジュールから簡単に利用することができます。
例えばコントローラーから利用する場合、

module/Application/src/Controller/IndexController.php
namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use My\Foo;
use My\Hoge\Var;

class IndexController extends AbstractActionController
{
    public function indexAction()
    {
        $foo = new Foo();
        $var = new Var();

    }
}

という具合になります。