ZendFramework2ガイド

入門編

独自のアプリケーション環境の作成

モジュールの作成

Zend2はモジュールという単位で復数のアプリケーションを作成できるようになっています。
これは個別のアプリケーションもそうですが、モジュールという名前の通り、汎用的な部品としてのモジュール作成にも利用できる仕組みです。

スケルトンアプリケーションのディレクトリ構造を見るとmoduleというディレクトリがあり、以下のようになっています。

module/
  ∟Application/
    ∟config/
    ∟language/
    ∟src/
    ∟view/
    ∟Module.php

この、moduleというディレクトリの直下に復数のアプリケーションを作ることが出来るわけです。
既にサンプルモジュールとしてApplicationというディレクトリが存在しています。これはあくまでサンプルのモジュール名が"Application"と名付けられているだけのものです。

これは置いておいて新たなモジュールを作成して一から構築していきたいと思います。
ここでは簡単な通販サイトを作成していきます。


まずは楽をするためにApplicationディレクトリをコピーし、Ecというディレクトリを作成しましょう。

module/
  ∟Application/
    ∟config/
    ∟language/
    ∟src/
    ∟view/
    ∟Module.php
  ∟Ec/
    ∟config/
    ∟language/
    ∟src/
    ∟view/
    ∟Module.php

Zend2ではあらゆる情報はコンフィグファイルで設定します。
Zend1では規定されたルール通りにファイルを配置したり、名前規則でルーティングが行なわれるようになっていました。
もともとZend自体、数あるフレームワークの中でも自由度が高い部類ですが、Zend2は更に規約より設定という考え方に寄っており、より柔軟性が重視されています。

新しいモジュールについても、コンフィグで設定することでフレームワークに通知してやる必要があります。
このコンフィグファイルは/config/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',
        'Ec',       //←追加
    ),


ApplicationモジュールのディレクトリをコピーしてEcディレクトリを作ったので、中に存在するファイルにはApplicationという記述がいくつかあります。
これを修正していきます。

まずはmodule/Ec/src直下のApplicationディレクトリを適切にリネームします。
今回はEcにします。
module直下のディレクトリはモジュール名ですが、module/Ec/src直下のディレクトリはそのモジュールにおける、PHPのクラスの名前空間のトップレベルと考えられます。
ここは基本的にモジュール名と一致させます。

ちなみに名前空間はPHP5.3以降で採用された仕組みです。Zend2はこの名前空間の仕組みをフルに活用した作りになっていますので、これに慣れ親しんでいない方は、PHPの公式マニュアルや、その多無数にある解説サイトである程度学習が必要かもしれません。

module/
  ∟Ec/
    ∟src/
      ∟Ec/

クラスファイルの先頭にはそのクラスの名前空間が定義されています。
これが全て"Application"で定義されているため、"Ec"に書き換える必要があります。

まず、module/Ecの直下にModule.phpというファイルがあります。

module/Ec/Module.php
namespace Ec;   // ←ApplicationをEcに修正

use Zend\Mvc\ModuleRouteListener;
use Zend\Mvc\MvcEvent;

class Module
{
    public function onBootstrap(MvcEvent $e)
    {

次にmodule/Ec/src/Ec/Controllerの下にあるコントローラークラスです。

module/Ec/src/Ec/Controller/IndexController.php
namespace Ec\Controller;   // ←ApplicationをEcに修正

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

class IndexController extends AbstractActionController
{

}

module/Ec/viewの下にはビューテンプレートが格納されていますが、
これは名前空間名でディレクトリが存在しますので、これもapplicationからecに修正します。

module/
  ∟Ec/
    ∟view/
      ∟ec/

そしてモジュールの設定ファイルがmodule/Ec/configの下にあります。
この中にはApplicationの記述がたくさんありますので、全てEcに書き換えます。

module/Ec/config/module.config.php
return array(
    'router' => array(
        'routes' => array(
            'home' => array(
                'type' => 'Zend\Mvc\Router\Http\Literal',
                'options' => array(
                    'route'    => '/',
                    'defaults' => array(
                        'controller' => 'Ec\Controller\Index',  // ←ApplicationをEcに修正
                        'action'     => 'index',
                    ),
                ),
            ),
            'application' => array(
                'type'    => 'Literal',
                'options' => array(
                    'route'    => '/ec',  // ←applicationをecに修正
                    'defaults' => array(
                        '__NAMESPACE__' => 'Ec\Controller',  // ←ApplicationをEcに修正
                        'controller'    => 'Index',
                        'action'        => 'index',
                    ),
                ),

~~~(中略)~~~

    'controllers' => array(
        'invokables' => array(
            'Ec\Controller\Index' => 'Ec\Controller\IndexController'  // ←ApplicationをEcに修正
        ),
    ),
    'view_manager' => array(

~~~(中略)~~~

        'template_map' => array(
            'layout/layout'           => __DIR__ . '/../view/layout/layout.phtml',
            'ec/index/index' => __DIR__ . '/../view/ec/index/index.phtml',  // ←applicationをecに修正
            'error/404'               => __DIR__ . '/../view/error/404.phtml',
            'error/index'             => __DIR__ . '/../view/error/index.phtml',
        ),
        'template_path_stack' => array(
            __DIR__ . '/../view',
        ),
    ),

~~~(中略)~~~
);

修正箇所は以上です。
ブラウザから/ecへアクセスしてみてください。
Welcome to Zend Framework 2のページが表示されればOKです。