【CakePHP3】URLのidパラメーターをスラッシュ区切りにする

CakePHP3
スポンサーリンク

どいうこと?

こんにちは、とらんぽです。
タイトルではわかりにくいですが、どういうことかといいますと。


こんなURLを・・・

こうします。

やっていきましょう。

routes.phpを編集する

このテクニックは、パラメーター渡しというそうです。
実現するには「routes.php」を編集します。

routes.phpは「config」フォルダ配下にあります。

このファイルの、「Router::scope~~~」区画内に以下の通りに書きます。

    $routes->connect(
        '/articles/view/:id', // 例えば /articles/view/3
        ['controller' => 'Articles', 'action'=>'view']
    )
    // 関数に引数を渡すためのルーティングテンプレートの中で、ルート要素を定義します。
    // テンプレートの中で、ルート要素を定義します。
    // ":id" をアクション内の $id にマップします。
    ->setPass(['id']);

※「’/articles/view/:id’」のarticlesはコントローラー、viewはアクション名です。
皆さんのシステムに合わせて変更してください。

※「[‘controller’ => ‘Articles’, ‘action’=>’view’]」ここのコントローラ名は頭文字大文字です。

※これは、viewへのURLにのみ、このパラメータ化のルールを適用する方法です。
のちほど、コントローラー内すべてのアクションへこのルールを適用する方法もご紹介します。

追記しました。

URL作成箇所(テンプレート)を見る

念のため、URLを作成しているテンプレートを確認します。

URLは以下のように記載してください。

<?= $this->Html->link(__('View'), ['action' => 'view', 'id'=>$article->id]) ?>

コントローラーを編集

おそらくこの問題を抱えている方は、コントローラーでidを取得する際に
「$this->request->getQuery(‘id);」でidを取得されてるかとおもいます。

このままではidを取得できません。以下のように変更してください。

$this->request->getParam('id')

これで、index(一覧)画面をリロードするとURLがスラッシュ区切りになっているはずです。
また、リンクをクリックすると、詳細画面が表示されると思います。

すべてのアクションに適用する

基本的に、詳細画面も、編集画面も、削除も、idを取得してからデータを取得するなり編集するなり、削除すると思います。

画面ごとにroutes.phpに行を追加するのも面倒です。

先ほどroutes.phpに追記した命令文を下記の要領で変更すると、コントロール以下のアクションすべてに適用されます。

    $routes->connect(
        '/articles/:action/:id', // 例えば /articles/view/3 や/articles/edit/3
        ['controller' => 'Articles']
    )
    // 関数に引数を渡すためのルーティングテンプレートの中で、ルート要素を定義します。
    // テンプレートの中で、ルート要素を定義します。
    // ":id" をアクション内の $id にマップします。
    ->setPass(['id']);

以上、ルーティングについてでした。

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