BLOG

[Craft3]独自プラグインでControllerを使う

2018-11-21 15:17:00

Craft 3 Craft CMS

Craft3では自作のプラグインを組み込むことができますが、プラグインでControllerを使う手順を説明したいと思います。

TL;DR

プラグインのPlugin::init()に設定を以下のように記述します。


 // ユーザ
 Event::on(UrlManager::class,
 UrlManager::EVENT_REGISTER_SITE_URL_RULES,
 function (RegisterUrlRulesEvent $event) {
 // /my へのルーティング
 $event->rules['my'] = '[plugin handle]/[controllers/***Controller.phpの***部分(小文字)]/[action***()の***部分(小文字)]';
 }
 );
 // 管理画面
 Event::on(UrlManager::class,
 UrlManager::EVENT_REGISTER_CP_URL_RULES,
 function (RegisterUrlRulesEvent $event) {
 // admin/my へのルーティング
 $event->rules['my'] = '[plugin handle]/[controllers/***Controller.phpの***部分(小文字)]/[action***()の***部分(小文字)]';
 });

Controllerとは

Webプログラミングでよく利用される、MVCパターンのC(Controller)を指します。Controllerでは各モデルにメッセージを送って処理をしてもらったり、Viewに表示する内容を渡したりします。
Craft3のベースとなるYii FrameworkはこのMVCパターンを用いて実装を行います。Craft3のプラグインでもMVCパターンを用いて実装を行うことができます。

ディレクトリ構造

ディレクトリ構造は以下のような形になります。

myplugin
┣ composer.json
┗ src
  ┣ Plugin.php
  ┗ controllers
    ┗ TopController.php

"myplugin"が独自プラグインのディレクトリとなります。"composer.json"はプラグインの設定を記述します。"Plugin.php"がプラグインの実行で呼び出されるファイルになります。Controllerは"controllers'というディレクトリに配置します。今回はTopController.phpを用意しました。

実装

上からcomposer.json、Plugin.php、controllers/TopController.phpとなります。

composer.jsonはプラグインの設定を記述しますが、ここで大事なところは"autoload"と"handle"です。autoloadにnamespaceを指定して、プラグイン内のそれぞれのクラスのパッケージを指定します。"handle"ですが、プラグインのユニークなIDになります。Craft3ではhandleは必須項目となりますので、他のプラグインと被らないような名前をつける必要があります。

Plugin.phpですが、ここでどのパスでどのControllerを実行するかを設定します。ユーザ画面に対して設定している箇所は、


 Event::on(UrlManager::class,
 UrlManager::EVENT_REGISTER_SITE_URL_RULES,
 function (RegisterUrlRulesEvent $event) {
 $event->rules['my'] = 'myplugin/top';
 }
 );

この部分になります。"$event->rules['my']"というのが「/myにアクセスしたとき」を指し、'myplugin/top'が「handleがmypluginの中にあるcontrollers/TopController.php(のactionIndex)を実行」を指しています。
簡単に表すと「[plugin handle]/[***Controller.phpの***部分を小文字にしたもの](/[action***()の***部分を小文字にしたもの])」となる感じです

同じく、管理画面のパスも設定することができ、こちらは


 Event::on(UrlManager::class,
 UrlManager::EVENT_REGISTER_CP_URL_RULES,
 function (RegisterUrlRulesEvent $event) {
 $event->rules['my'] = 'myplugin/top/admin';
 });

この部分になります。ユーザ画面との違う部分はUrlManager::EVENT_REGISTER_CP_URL_RULESになっているところくらいで記述方法は同じです。この設定だと「admin/myにアクセスした時」「mypluginにあるcontrollers/TopController.phpのactionAdmin()を実行」となります。

まとめ

このようにControllerを利用できるようにすることで、各ページごとの処理をきれいにまとめることができます。