ルーティング

ルーティング

名前の変更

ルーティングの一般的な役割は、コントローラとそのアクションの名前を変更すること。
/users/some_action/5 でUsersコントローラにアクセスするのではなく、/cooks/some_action/5でアクセスすることができる。

<?php 
$routes->connect(
    '/cooks/:action/*', ['controller' => 'Users']
);
?>
connectメソッド

connectメソッドには3つの引数(URL, ルーティング, オプション)を渡す。

<?php 

$routes->connect(
    '/url/template', // URL
    ['targetKey' => 'targetValue'], // ターゲット
    ['option' => 'matchingRegex'] // オプション
);

 ?>

基本的なルーティング

Articles#index

以下は2つともArticlesControllerのindexアクションを実行するルーティング。
スコープつきルートビルダーの方が、Articlesコントローラの他のアクションのルーティングを記載する場合にコードが簡潔になる。

<?php 
use Cake\Routing\Router;

// スコープ付きルートビルダーを使用。
Router::scope('/', function ($routes) {
    $routes->connect('/', ['controller' => 'Articles', 'action' => 'index']);
});

// static メソッドを使用。
Router::connect('/', ['controller' => 'Articles', 'action' => 'index']);
 ?>
Articles#view

ArticlesControllerのviewアクションへのルーティング。
/articles/15のようなURLを受け取り、view(15)を呼び出す。

<?php 

Router::scope('/', function ($routes) {
    $routes->connect('/articles/*', ['controller' => 'Articles', 'action' => 'view']);
});

 ?>

スターマッチャーではなくプレースホルダーを使うことでURL部分のバリデーションができる(setPatterns)。最後にidプレースホルダーをview関数の引数として渡す(setPass)。

<?php 
$routes->connect('/articles/:id', ['controller' => 'Articles', 'action' => 'view'])
        ->setPatterns(['id' => '\d+'])
        ->setPass(['id']);
?>

HTTPメソッドの指定

以下の例では、GETリクエストとPOSTリクエストを許可する。

<?php
$routes->connect('...')->setMethods(['GET', 'POST'])
?>

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

Router::prefixプレフィックスルーティングする。以下は管理画面のルーティング例。

<?php
Router::prefix('admin', function ($routes) {
    $routes->connect('/', ['controller' => 'Pages', 'action' => 'index']);
    $routes->connect('/new', ['controller' => 'Pages', 'action' => 'new']);
});

$routes->prefixプレフィックスをネストする

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

connectのprefixオプションでルーティング先のコントローラのプレフィックスを明示する

<?php
    $routes->connect('/EngineUpdate', ['prefix' => 'Api/System', 'controller' => 'Engine', 'action' => 'update']);
    // Controllers/Api/System/EnginesControllerにルーティングする
});
?>

Restfulなルーティング

$routes->resources('hoge')によって、HogeControllerのindex, view, add, edit, deleteアクションへのルーティングが定義される。

<?php
Router::scope('/', function ($routes) {
    $routes->setExtensions(['json']); // レスポンスデータの形式を指定
    $routes->resources('Recipes');
});
?>

ネストされたリソースのルーティング

<?php
$routes->resources('Articles', function ($routes) {
   $routes->resources('Comments');
});
?>

一部のアクションのみを定義

<?php
$routes->resources('Recipes', ['only' => ['index']]);
?>