プレフィックスルーティング

Posted by muchag | CakePHP 3.x | 2018-02-23 (金) 15:10:12


公式:ルーティング プレフィックスルーティング

【環境】
CakePHP: 3.5.8
php: 7.1.5
概要

最初は URL にプレフィクスを付けるのかと思ったけど
どうやらディレクトリ構成のプレフィクスらしい。

ディレクトリ構成

通常は、下記のようなディレクトリ構成。
Controller の例。


src
 ┗ Controller
   ┣ AdminController
   ┗ FrontController

これをプレフィックスルーティングを用いることで、下記のようなディレクトリ構成を実現できる。


src
 ┗ Controller
   ┣ Admin
   ┃  ┗ AdminController
   ┗ Front
      ┗ FrontController
メリット

この例だと意味不明だけど、これができれば下記のようなメリットがある気がする。
これから試すので予想!

URL と処理との関係

/admin/* という URL で管理系処理をまとめたい場合、
ノーマルルーティングだと AdminController にアクションを全て集約しなければならなくなるけど
プレフィックスルーティングだと、コントローラをわかりやすくファイル分割できる。

ファイル整理

ノーマルルーティングでコントローラファイルを分割しようとすると、
何系の処理かわかりにくい、または、クラス名にプレフィックスを付けることになるけど
プレフィックスルーティングなら、ディレクトリ毎にまとめられるので、見やすい♪

書式
/vendor/cakephp/cakephp/src/Routing/Router.php

public static function prefix($name, $params = [], $callback = null)
個別指定

connect メソッドにて個別指定する手法。


$routes->connect('/admin', ['plugin' => 'MyPlugin', 'controller' => 'Users', 'action' => 'index', 'prefix' => 'admin']);
一括指定

prefix メソッドにて一括指定する手法。


Router::prefix('admin', function ($routes) {
  
  $routes->fallbacks(DashedRoute::class);
});
プラグイン

プレフィックスに対して、全てのルーティングを同一プラグインに割り当てる手法。


Router::prefix('admin', ['plugin' => 'MyPlugin'], function ($routes) {
  
  $routes->fallbacks(DashedRoute::class);
});
階層化

プレフィックスを2段階にしたい場合。


Router::prefix('manager', function ($routes) {
    $routes->prefix('admin', function ($routes) {
        $routes->connect('/:controller');
    });
});

上記のコードは、 /manager/admin/:controller のようなルートテンプレートを生成します。
接続されたルートは prefix というルート要素を manager/admin に設定します。

コントローラ

コントローラ Bake コマンド。
–prefix オプションを用いる。


bin/cake bake controller --plugin MyPlugin --prefix admin administrators

これにて下記のようなディレクトリ構成となる。


src
 ┗ Controller
   ┗ Admin
     ┗ AdministratorsController
取得

現在のプレフィックスをリクエストから取得するには、コントローラで下記のように取得。


$prefix = $this->request->getParam('prefix');

// または
$prefix = $this->request->params['prefix'];
番外編

本来のプレフィックスルーティングとは異なるけど
結果的に似たようなことをできる設定方法を見つけたのでメモ。
Qiita:CakePHPのコントローラを階層化する(2016-01-31)
ここの追記部分。


Router::connect('/:dir/:controller/', array('action' => 'index'));

とかでも動くんですね(bootstrap.phpは書かなきゃいけない様子)。
知らなかったとはいえ拙いことを書いて申し訳ありませんでした。
/:dirであるとか/:langであるとか、好きな名前で書いてやると今度はリンクを貼るときに
array(‘dir’=>’hoge’,’controller’=>’fuga’)とかで動いてくれて便利です。名前付きパラメータで取れますし。

ディレクトリとか言語とかでURLがごちゃごちゃになってきたら第三引数に正規表現書いて判断させます。

ちょっと読んだだけでは、よく意味がわからなかったけど
いつかわかるようになりたい。

参考サイト

Qiita:CakePHP3でフロントとバックエンドでControllerとTemplateをフォルダ分けするための設定(2017-01-20)
→ほぼほぼこちらの記事を参考にさせていただいた

あなたとあなたの会社にあったITを提供するエンジニア:CakePHP3で管理画面を作る、その1(2017-04-07)
→プレフィックスルーティングのコマンドを参考にさせていただいた

stack overflow:CakePHP 3.x: all routes to the plugin(2015-04-01)
→プラグイン一括指定方法を参考にさせていただいた

CakePHP 3.x | 2018-02-23 (金) 15:10:12 |

コメントはまだありません »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment