Zend Framework3の始め方2

スポンサーリンク

チュートリアル、チュートリアルに基づくアプリ作成をして自分なりに分かった、Zend Framework3の始め方についてメモを取ります。続きです。

ここからは、モジュールについて、
大体のアプリケーションで使用できる(であろう)テンプレートモジュールの作成を通じて、
自分が理解した範囲の解説と、作成をしていきます。
すでに書きましたが、
チュートリアル、チュートリアルに基づくアプリ作成をして分かったことが基準なので、
これが正しい、効率の良い方法だとは限りません。
一つの方法として読んでください。

注意

ここからは、

  • skeleton-applicationにデフォルトで付属してくるモジュールである、
    「Application」モジュール(module/Applicationフォルダ)
    を使用しない

という仮定の下で説明していきます。

 

テンプレートモジュールの作成

モジュール内には、
自分の作成したいアプリケーションに必要な画面、処理を記述していきます。
皆さんの作りたいアプリケーションに沿った説明をするのは不可能なので
ここでは、
ほとんどのアプリケーションで必要だろうと考えられる、
モジュールの構成(テンプレートと称することにします)を作成します。

 

テンプレートモジュールの作成では、以下のことを行います。

  • ファイル階層の作成
  • 作成したモジュールを登録する
  • MVCの一般設定(エラー画面とか)

 

ファイル階層の作成

必要なフォルダ階層、ファイルを作成します。
以下のようにフォルダとファイルを作成してください。

 

  • module(デフォルトで存在するフォルダ)
    • M
      • config
        • module.config.php
      • src
        • Controller
        • Form
        • Model
        • Module.php
      • view
        • error
          • 404.phtml
          • index.phtml
        • layout
          • layout.phtml
        • M(先頭は小文字)

ここで、
Mは、自分で名前を付けるモジュール名のことを指します。先頭は大文字のアルファベットである必要があります。今後も、モジュール名をMと表記します。先頭は大文字です。
青文字はファイルであることを示しています。

例として、私が以前作成した
scheduleアプリケーションのScheduleモジュールの構成を載せます。
写真中、moduleフォルダ内のScheduleフォルダが、Sheduleモジュールにあたります。

 

ここからは、具体的なテンプレートの作成をしていきます。

 

 

モジュールを登録する

作成したモジュールは、登録する(必要な文を記述する)必要があります。
モジュールを登録するのに必要な作業は以下の通りです。

  • composer.jsonファイルの編集
  • コマンドラインでcomposerを実行
  • modules.config.phpファイルの編集

ひとつづつ攻略していきます。

composer.jsonファイルの編集

path/to/install/composer.jsonを編集します。
ファイル内のautoload部分を探し、以下に置き換えます。

 "autoload": {
        "psr-4": {
            "M\\": "module/M/src/"
        }
    },

ここで、psr-4内に、Applicationの文が記入されていると思います。
Applicationモジュールを使用しないのであれば、その文を削除しても大丈夫です。
path/to/installは、前回、zend-frameworkをインストールした場所に該当します。

コマンドラインでcomposerを実行

コマンドラインで、path/to/installへ移動し、以下の文を実行します。
ちなみに、コマンドライン内での移動は、
cd c:/path/to/install
等のコマンドでできます。

composer dump-autoload

 

modules.config.phpファイルの編集

path/to/install/config/modules.config.phpファイルを開き、
return 文を編集します

return [
    'Zend\Form',
    'Zend\Db',
    'Zend\Router',
    'Zend\Validator',
    //'Application',
    'M',
];

コメントアウトしているように、Applicationモジュールを使用しないときは削除しても構いません

 

 

MVCの一般設定(エラー画面とか)

MVCで必要な設定(初期化とか、エラー画面の設定とか)をしていきます。
ここでは以下のことを行います

  • Module.phpファイルの編集
  • module.config.phpファイルの編集
  • 最低限のエラー画面、レイアウトの設定

これらのファイル編集時、編集内容が中途半端に見えるかもしれません。
理由は、コントローラやモデルを新しく作成するときに記入する必要がある部分が存在するからです。
コントローラやモデルの汎用的(?)な作成方法は、べつのメモに記述する予定です。

 

Module.phpファイルの編集

M/src/Module.phpファイルを開き、以下を記述します。

<?php
namespace M;

use Zend\ModuleManager\Feature\ConfigProviderInterface;

//いつか必要になると思うのでここで書いておきます。不必要なときは削除しても大丈夫です
use Zend\Db\Adapter\AdapterInterface;
use Zend\Db\ResultSet\ResultSet;
use Zend\Db\TableGateway\TableGateway;
 
class Module implements ConfigProviderInterface{
	//module.config.phpファイルに記入した設定をロードする
	public function getConfig(){
		return include __DIR__ . '/../config/module.config.php';
	}

}

 

module.config.phpファイルの編集

M/config/module.config.phpファイルを開き、以下を記入します。

<?php
namespace M;
//使いそうなのであらかじめ記述しています。使わないときは削除しても大丈夫です
use Zend\Router\Http\Segment;
use Zend\Router\Http\Literal;


return[
	
	//ルーティングの設定をここに記述します
	'router' =>[
		'routes' =>[
		],
	],

	//エラー画面の設定や、ビュー全般の設定を行います。
	'view_manager' =>[		
        'display_not_found_reason' => true,
        'display_exceptions'       => true,
        'doctype'                  => 'HTML5',
        'not_found_template'       => 'error/404',
        'exception_template'       => 'error/index',
        'template_map' => [
            'layout/layout'           => __DIR__ . '/../view/layout/layout.phtml',
            'error/404'               => __DIR__ . '/../view/error/404.phtml',
            'error/index'             => __DIR__ . '/../view/error/index.phtml',
        ],        
		'template_path_stack' => [
			'schedule' => __DIR__ . '/../view'
		],
	],
];

 

最低限のエラー画面、レイアウトの作成

404エラー画面、例外が投げられたときのエラー画面を作成します。

M/view/error/404.phtml
M/view/error/index.phtml
を開き、
エラー画面っぽいhtmlを記述します。
具体的な例として、
デフォルトでついてきたApplicationモジュール内の
view/error/404.phtml
view/error/index.phtml
ファイルが挙げられます。

ここにそれを転載します。

view/error/404.phtml

<?php
use Zend\Mvc\Application;
?>
<h1>A 404 error occurred</h1>
<h2><?= $this->message ?></h2>

<?php if (! empty($this->reason)) :
    switch ($this->reason) {
        case Application::ERROR_CONTROLLER_CANNOT_DISPATCH:
            $reasonMessage = 'The requested controller was unable to dispatch the request.';
            break;
        case Application::ERROR_MIDDLEWARE_CANNOT_DISPATCH:
            $reasonMessage = 'The requested middleware was unable to dispatch the request.';
            break;
        case Application::ERROR_CONTROLLER_NOT_FOUND:
            $reasonMessage = 'The requested controller could not be mapped to an existing controller class.';
            break;
        case Application::ERROR_CONTROLLER_INVALID:
            $reasonMessage = 'The requested controller was not dispatchable.';
            break;
        case Application::ERROR_ROUTER_NO_MATCH:
            $reasonMessage = 'The requested URL could not be matched by routing.';
            break;
        default:
            $reasonMessage = 'We cannot determine at this time why a 404 was generated.';
            break;
    }
?>
<p><?= $reasonMessage ?></p>
<?php endif ?>

<?php if (! empty($this->controller)) : ?>
<dl>
    <dt>Controller:</dt>
    <dd>
        <?= $this->escapeHtml($this->controller) ?>
        <?php
        if (! empty($this->controller_class) && $this->controller_class != $this->controller) {
            printf('(resolves to %s)', $this->escapeHtml($this->controller_class));
        }
        ?>
    </dd>
</dl>
<?php endif ?>

<?php if (! empty($this->display_exceptions)) : ?>
    <?php if (isset($this->exception)
        && ($this->exception instanceof \Exception || $this->exception instanceof \Error)) : ?>
<hr/>

<h2>Additional information:</h2>
<h3><?= get_class($this->exception) ?></h3>
<dl>
    <dt>File:</dt>
    <dd>
        <pre><?= $this->exception->getFile() ?>:<?= $this->exception->getLine() ?></pre>
    </dd>
    <dt>Message:</dt>
    <dd>
        <pre><?= $this->escapeHtml($this->exception->getMessage()) ?></pre>
    </dd>
    <dt>Stack trace:</dt>
    <dd>
        <pre><?= $this->escapeHtml($this->exception->getTraceAsString()) ?></pre>
    </dd>
</dl>

        <?php if ($ex = $this->exception->getPrevious()) : ?>
<hr/>

<h2>Previous exceptions:</h2>
<ul class="list-unstyled">
            <?php $icount = 0 ?>
            <?php while ($ex) : ?>
    <li>
        <h3><?= get_class($ex) ?></h3>
        <dl>
            <dt>File:</dt>
            <dd>
                <pre><?= $ex->getFile() ?>:<?= $ex->getLine() ?></pre>
            </dd>
            <dt>Message:</dt>
            <dd>
                <pre><?= $this->escapeHtml($ex->getMessage()) ?></pre>
            </dd>
            <dt>Stack trace:</dt>
            <dd>
                <pre><?= $this->escapeHtml($ex->getTraceAsString()) ?></pre>
            </dd>
        </dl>
    </li>
                <?php
                $ex = $ex->getPrevious();
                if (++$icount >= 50) {
                    echo '<li>There may be more exceptions, but we do not have enough memory to process it.</li>';
                    break;
                }
                ?>
            <?php endwhile ?>
</ul>
        <?php endif ?>
    <?php else : ?>
<h3>No Exception available</h3>
    <?php endif ?>
<?php endif ?>

 

view/error/index.phtml

<h1>An error occurred</h1>
<h2><?= $this->message ?></h2>

<?php if (! empty($this->display_exceptions)) : ?>
    <?php if (isset($this->exception)
        && ($this->exception instanceof \Exception || $this->exception instanceof \Error)) : ?>
<hr/>

<h2>Additional information:</h2>
<h3><?= get_class($this->exception) ?></h3>
<dl>
    <dt>File:</dt>
    <dd>
        <pre><?= $this->exception->getFile() ?>:<?= $this->exception->getLine() ?></pre>
    </dd>
    <dt>Message:</dt>
    <dd>
        <pre><?= $this->escapeHtml($this->exception->getMessage()) ?></pre>
    </dd>
    <dt>Stack trace:</dt>
    <dd>
        <pre><?= $this->escapeHtml($this->exception->getTraceAsString()) ?></pre>
    </dd>
</dl>

        <?php if ($ex = $this->exception->getPrevious()) : ?>
<hr/>

<h2>Previous exceptions:</h2>
<ul class="list-unstyled">
            <?php $icount = 0 ?>
            <?php while ($ex) : ?>
    <li>
        <h3><?= get_class($ex) ?></h3>
        <dl>
            <dt>File:</dt>
            <dd>
                <pre><?= $ex->getFile() ?>:<?= $ex->getLine() ?></pre>
            </dd>
            <dt>Message:</dt>
            <dd>
                <pre><?= $this->escapeHtml($ex->getMessage()) ?></pre>
            </dd>
            <dt>Stack trace:</dt>
            <dd>
                <pre><?= $this->escapeHtml($ex->getTraceAsString()) ?></pre>
            </dd>
        </dl>
    </li>
                <?php
                $ex = $ex->getPrevious();
                if (++$icount >= 50) {
                    echo '<li>There may be more exceptions, but we do not have enough memory to process it.</li>';
                    break;
                }
                ?>
            <?php endwhile ?>
</ul>
        <?php endif ?>
    <?php else : ?>
        <h3>No Exception available</h3>
    <?php endif ?>
<?php endif ?>

 

このファイル優秀で、どこでエラーが起きたのかを教えてくれるので
そのまま利用するのがおすすめです。
ただし、インターネットに公開するときはしかるべきページにするべきです。
エラー内容なんて表示させないよね

 

レイアウト画面を作成します。
レイアウトファイルとは、
そのモジュールにアクセスしているときは常に表示しておいてほしい
メニューバーだったり、リンクだったりを記述しておくファイルです。
また、cssのロード、jqueryのロードなどもこのファイルに記述しておくと便利です。
M/view/layout/layout.phtmlファイルを開き、
レイアウトを編集します。

これも具体的な例として、Applicationモジュール内の
view/layout/layout.phtml
ファイルが挙げられます。

<?= $this->content ?>

という文に、今後のビュー作成時に作る画面が入ります。

最低限のlayout.phtmlを載せます。

<?= $this->doctype() ?>

<html lang="en">
    <head>
        <meta charset="utf-8">
        <?= $this->headTitle('M')->setSeparator(' - ')->setAutoEscape(false) ?>
        <?= $this->headMeta()
            ->appendName('viewport', 'width=device-width, initial-scale=1.0')
            ->appendHttpEquiv('X-UA-Compatible', 'IE=edge')
        ?>       
    </head>
    <body>
        <div>
            <!--中身のview表示-->
            <?= $this->content ?>
            <hr>
            <footer>               
            </footer>
        </div>
        <?= $this->inlineScript() ?>
    </body>
</html>

 

 

これでテンプレートは完成ですが、
このままでは何もできません。こんな画面が表示されます。
404.phtmlが表示されているはずです。

おわりに

これで、最低限必要なファイルはできました。
しかし、これだけでは、本当に何も表示できません。
理由は、コントローラーやルーティングの設定が全くないからです。

次回は、コントローラーの設定について、
自分の理解している範囲で、一般化して説明します。
より詳しい内容は機会があれば…

 

コメント

タイトルとURLをコピーしました