Zend Framework3の始め方3

スポンサーリンク

自分なりにわかった、Zend Framework3の始め方をメモしていきます。

 

何度も言っていますが
ここで書いた内容は
あくまで一つの方法です。よりよい方法があるかもしれません。

すること

今回は、

  • コントローラの作成
  • 対応するビューの作成

をしていきます。

 

コントローラの作成

コントローラを作成するとき、
具体的には

  • ファイル(コントローラ)作成
  • ルーティング設定等

をします。最低限これは行わなければなりません。
これ以外の作業も、必要に応じてする必要があります。

アクションとは

アクションとは、
作成するウェブサイトの動作単位のようなもので、
サイトの画面(ビュー)毎に作成します。
アクションの点から見たコントローラとは、
複数の関連するアクションをまとめたもののことを指します。

例えば、あるルーティング規則において、URLが

http://tekitou/con/act

となっているとき

コントローラ名「con」のアクション名「act」を実行している
となります。

仮に時間割のウェブサイトなら、
時間割管理を行うコントローラがあり、
時間割を見るアクション
時間割を変更するアクション
が存在することになります。

 

 

ここから、コントローラ追加の仕方について、書いていきます。

ファイル(コントローラ)作成

ファイルを作成します。

作成したモジュール/src/Controller内に、コントローラ用のファイルを作成します。
ファイル名は、
名前(先頭大文字)+Controller.php となります。
また、クラス名とファイル名は同一にします。

仮に、メモを管理するウェブサイトであれば、
MemoController.php
を作成します。

中に、以下を記述します。
これは、メモ管理サイトの場合なので、適宜クラス名などを変更してください。

<?php
namespace Memo\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;


class MemoController extends AbstractActionController{
  public function indexAction(){
    //show all memo
    return new ViewModel([]);
  }
  // 以下省略
}

クラス名は、ファイル名と同じです。
コードの通り、アクションは関数として扱い、先頭は小文字でActionが後ろにつきます。
アクションは、ViewModelを返し、[]内には、ビューに渡すデータを連想配列で渡します。

 

 

ルーティング設定など

次に、URLから、
どのコントローラのどのアクションを実行するかを設定する、
ルーティングを行います。

作成したモジュール/config/module.config.phpファイルを開き、
router -> routes内に、ルーティング設定を行います。
ここでは例を載せて説明します。

//namespaceに注意!
'router' =>[
		'routes' =>[
			'memo' =>[
				'type' => Segment::class,
				'options' =>[
					'route' => '/memo[/:action[/:id]]',
					'constraints' =>[
						'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
						'id' => '[0-9]+',
					],
					'defaults' => [
						'controller' => Controller\MemoController::class,
						'action' => 'index',
					]
				],
			],
		],
	],

ざっくり説明します。
Memoコントローラを作成したら、memoという配列を設定します。
その中にはtype(segment::class)、optionsを設定します。
optionsの中には、

  • route … URL構造の設定
    :をつけると、変数扱い(:idは変数)
    []をつけると任意(あっても無くてもよい)となる
  • constraints … 変数の制限を設定する
    • ‘[a-zA-Z][a-zA-Z0-9_-]*’ … 1文字目が数字でない大体の文字列
    • ‘[0-9]+’ … 数値
  • defaults … コントローラ名の設定等
    • controller … 使うコントローラ名。namespaceに注意!
    • action … デフォルトAction。変数Actionに何も入らなかったらこのアクションになる

を設定します。

namespaceに注意してください。私はこれでそこそこ悩みました。
Controllerクラスの
namespaceとこのファイルのnamespaceを確認しましょう。

上述の通りに設定したとき
http://domain/memo/indexと入力すると、
memoController内にあるindexActionを実行するということになります。

 

 

その後、同じファイルのcontrollers -> factoriesにコントローラを登録します。
ここでは二つの方法があります。どちらか片方を選んでください。
ちなみに、公式のチュートリアルでは一時的に1番をしたのち、
最終的に2番に変更していました。個人的には2番です。

1.作成したモジュール/config/module.config.phpに登録する。

<?php
namespace M;
//add
use Zend\ServiceManager\Factory\InvokableFactory;

return[
	//ルーティングの設定
	'router' =>[
//      ...略
	],
        //このcontrollersに追加
        controllers' => [
                'factories' => [
                    Controller\MemoController::class => InvokableFactory::class,
                    //複数コントローラ時はここにその分を記述する
                    //Controller\hogeController::class => InvokableFactory::class,
                ],
        ],

	//エラー画面の設定や、ビュー全般の設定を行います。
	'view_manager' =>[		
        // ... 略
	],
];

 

2.作成したモジュール/src/Module.phpに登録する。

<?php
namespace Memo;

use Zend\ModuleManager\Feature\ConfigProviderInterface;

//追加
use Zend\ServiceManager\Factory\InvokableFactory;

class Module implements ConfigProviderInterface{
	//module.config.phpファイルに記入した設定をロードする
	public function getConfig(){
		return include __DIR__ . '/../config/module.config.php';
	}

        //この関数を追加
	//controllerに関する設定(初期化など)を記入する
	public function getControllerConfig(){
		return [
			'factories' =>[
	                    Controller\MemoController::class => InvokableFactory::class,
                            //複数コントローラならここに追加
                            //Controller\hogeController::class => InvokableFactory::class,
                        ]
                ]
	}
}

 

これで最低限のコントローラの作業は終了です。
このままでは、ビューがないため、画面にはエラーしか表示されません。

ビューの作成

コントローラ、アクションを作成したので、対応するビューを作成します。
簡単のために言うと
基本、コントローラ名&アクション名に対応するビューを作成します。
またビューは、
コントローラ名と同じフォルダ内の、
アクション名と同じファイル名のファイルが、
ビューとして扱われます。

ですので、例として、MemoControllerのindexActionを実行したときに表示されるビューは
作成したモジュール/view/作成したモジュール名/memo/index.phtml
が該当のビューとなります。
余談なんですけど
なんでモジュール内に記述したviewなのに、モジュール名フォルダが必要なんですかね。
どこかで変更できたら変更したいな

また、テンプレートモジュールで作成した場合、
各ビューには、レイアウトファイルが適用されます。
ですので、対応するビューには、内容だけを書きましょう。

例としての、index.phtmlです。

<div>
	this is index action<br />
	<a href="<?= $this->url('memo', ['action' => 'add']) ?>">add</a><br />
	<a href="<?= $this->url('memo', ['action' => 'edit', 'id' => 1]) ?>">edit</a><br />
	<a href="<?= $this->url('memo', ['action' => 'delete']) ?>">delete</a><br />
</div>

zend側で、いくつかの関数が用意されています。
たとえば$this->urlで、コントローラ名、アクション名その他URLの変数を配列として設定すれば、そのリンクを作成してくれます。あとは、html+phpの技術で様々な画面を作成できます。

同様に、1アクションに1画面を作成することで、簡単なサイトを作成することができます。

 

まとめ

コントローラとビューを簡単に作成しました。
勿論より複雑な物や便利な方法もありますが、
最低限これだけ知れば、ある程度のウェブサイトは作れます。

次はデータベースを使う方法について、モデルの作成や適用をメモする予定です。

コメント

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