【PHP応用】ルーティングルール


CakePHPのルーティングルール

CakePHPは以下のURLを使ってアクセスします。
http://ドメイン/アプリケーション/アクション

例えば、
http://localhost/cake4/app/index
とアクセスをすると、
appアプリケーションのindexアクションを呼び出すことになります。

CakePHPでは「MVC」の1セットをアプリケーションと言います。
アプリケーションに対するリクエストは最初に「Controller」クラスが受け取ります。
「Controller」クラス内に定義されているメソッドを「アクション」と言います。

「Controller」の命名ルールは「アプリケーション名+Controller」です。
つまり、上記のアクセスでは、「AppController」クラスの「index」メソッドが呼び出されることになります。
「index」は自動補完されることになっているため、省略した場合も「index」メソッドが呼び出されます。
また、小文字でアプリケーション名を入力しても、自動的にコントローラ名のアプリケーション名は大文字になります。

bakeコマンドで雛型作成

Sampleアプリケーションを作成していきたいのですが、
Model, View, Controllerファイルが必要となり、手動で作成するとやや手間がかかります。
bakeコマンドを使うと、これらの雛型を自動生成してくれます。(ここではまだ、コマンドは実行しなくて良いです。)

View(Template) をbake
# ./bin/cake bake template アプリケーション名(テーブル名)

2. Controller をbake
# ./bin/cake bake controller アプリケーション名(テーブル名)

3. Model をbake (※事前にテーブルを作成する必要有)
# ./bin/cake bake model アプリケーション名(テーブル名)

4. MVC一式をまとめてbake (※事前にテーブルを作成する必要有)
# ./bin/cake bake all アプリケーション名(テーブル名)

基本の流れ1 リクエスト → Controller

ではまず、「bake」コマンドを使ってControllerを作成してみましょう。

./bin/cake bake controller Sample1

src/Controllerディレクトリ下に「Sample1Controller.php」が作成されます。

最初から色々と記述されていますが、まずは「index」メソッドの中身をコメントアウトし、以下のように記述しましょう。

【Sample1Controller.php】

public function index() {
    // 既存の記述はコメントアウト
    $this->autoRender = false;
    echo "Sample1";
}

http://localhost/cake4/app/sample1/index
にアクセスして「Sample1」と表示されればOKです。

※3行目の、「$this->autoRender = false;」は、ビュー(テンプレート)を読み込む設定をOFFにしています。
これがOFFになっていないと、indexメソッド終了時に、
「src/Template/Sample1/index.ctp」 を読み込もうとしますが、
今の段階では上記ファイルが無いので、読み込ませないことでエラーを回避しています。

基本の流れ2 リクエスト → Controller(値を渡す)

アクションパスの後ろに「/」区切りで値を指定すると、それをアクションメソッドの引数として受け取ることができます。
先ほどのControllerを以下のように変更しましょう。

【Sample1Controller.php(変更)】

public function index($x=“xxx”,$y=“yyy”) {
    // 既存の記述はコメントアウト
    $this->autoRender = false;
    echo "Sample1";
    echo $x;
    echo $y;
}

★以下のようなURLにアクセスして結果を確認しましょう。
http://localhost/cake4/app/sample1/index

http://localhost/cake4/app/sample1/index/apple/banana

http://localhost/cake4/app/sample1/index/apple/banana/cherry //←cherryは表示されない

※functionの引数の初期値を指定しておかないとWarningが発生するので、初期値を設定するようにしましょう。

基本の流れ3 リクエスト → Controller(明示的にControllerを呼び出す)

URLリクエストに応じてControllerは自動で選択されますが、明示的に指定することも可能です。
その場合、config/routes.phpに記述します。
routes.php

$routes->connect('/sample1', ['controller' => 'Sample1', 'action' => 'sample1']);
//→「http://localhost/cake4/app/sample1」にアクセスするとindexではなくsample1が呼び出されます。
 
//URLリクエストのパターンマッチングをさせたい場合は以下のようにプレースホルダを用いることもできます。
$routes->connect('/sample1/:id',['controller'=> 'Sample1', 'action'=>'sample1']);
 
//更に第三引数でプレースホルダの型を指定することもできます。(正規表現で指定)
$routes->connect('/sample1/:id',['controller'=>'Sample1','action'=>'sample1'],['id'=> '\d+']);
 
// URLリクエストからControllerに値を渡したいときには、プレースホルダに対し、「pass」オプションを指定します。
$routes->connect('/sample1/:val1/:val2', ['controller' => 'Sample1', 'action' => 'sample1'], 
['pass' => ['val1','val2']]); 
//→ 「http://localhost/cake4/app/sample1/index/www」にアクセスするとsample1が呼び出され、
//   「index」と「www」がsample1メソッドの引数に渡されます。

Sample1Controller.php

    public function sample1($val1, $val2){
        // 自動描画をオフにする
        $this->autoRender = false;
        echo "Sample1";
        echo "indexの代わり";
        echo "val1 : ${val1}";
        echo "val2 : ${val2}";
    }

基本の流れ4 リクエスト → Controller(ルーティングスコープを使う)

あるURLリクエスト以下の設定をグルーピングしたいときには、ルーティングスコープを使います。

Router::scope('/sample1', function (RouteBuilder $routes) {
  $routes->connect('/:val1/:val2',[‘controller'=>'Sample1','action’=>'sub'],
    ['pass'=>['val1','val2']]);  
  $routes->connect('/:id',['controller' => 'Sample1', 'action' => 'sample1'],['pass' => ['id']]);
});

プロジェクト作成後に最初に確認した、「http://localhost/cake4/app」は、
デフォルトで設定されている以下の設定でルーティングが行われています。

Router::scope('/', function (RouteBuilder $routes) {
    // コメント等省略	
    $routes->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']);
    $routes->connect('/pages/*', ['controller' => 'Pages', 'action' => 'display']);    
});

これを見ると、実際には「http://localhost/cake4/app/pages/display/home」を実行していることがわかります。

自習問題

★src/Controller/PagesController.php を覗いてみよう!
★src/Template/Pages/home.ctp を覗いてみよう!

  • このエントリーをはてなブックマークに追加

PAGE TOP