URLをハイフン区切りからアンダーバー区切りやキャメルケースにする方法
CakePHP3.1でURLの区切り文字がアンダーバー(アンダースコア)からハイフンに変更されています。
https://book.cakephp.org/3/ja/development/routing.html#url
コントローラーBlogPosts、アクションaddだった場合、標準では
http://〜〜/blog-posts/add
のようにハイフン区切りになります。
これをCakePHP3.0、CakePHP2以前のように
http://〜〜/blog_posts/add
というようなアンダーバー(アンダースコア)区切りにする方法の解説です。
補足でURLをキャメルケースにする方法も記載しています。
http://〜〜/BlogPosts/add
サイト全体で変更する場合
この区切り文字を管理しているのは/config/routes.phpのRouteClassです。
CakePHP5、CakePHP4
CakePHP5、CakePHP4では下記が該当コードです。
/config/routes.php
use Cake\Routing\Route\DashedRoute; return function (RouteBuilder $routes): void { …… $routes->setRouteClass(DashedRoute::class); …… };
ハイフン区切りからアンダーバー(アンダースコア)区切りにするには、これを下記のように変更します。
use Cake\Routing\Route\InflectedRoute; return function (RouteBuilder $routes): void { …… $routes->setRouteClass(InflectedRoute::class); …… };
CakePHP3
CakePHP3では下記が該当コードです。
/config/routes.php
use Cake\Routing\Route\DashedRoute; …… Router::defaultRouteClass(DashedRoute::class); Router::scope('/', function (RouteBuilder $routes) { …… $routes->fallbacks(DashedRoute::class); });
ハイフン区切りからアンダーバー(アンダースコア)区切りにするには、これを下記のように変更します。
use Cake\Routing\Route\InflectedRoute; …… Router::defaultRouteClass(InflectedRoute::class); Router::scope('/', function (RouteBuilder $routes) { …… $routes->fallbacks(InflectedRoute::class); });
キャメルケース
/vendor/cakephp/cakephp/src/Routing/Route/DashedRoute.php を参考にCamelizeRouteを作れば、URLをキャメルケース(/BlogPosts/add)にすることもできます。
一部のURLのみ変更する場合 resources
/config/routes.php
に下記を追記し、Cake\Utility\Inflectorのunderscore()を使用するようにします。
$routes->resources('BlogPosts', ['inflect' => 'underscore']);
この記述によりコントローラーBlogPostsのアクションview、edit、delete、index、addにアンダーバー区切りの変更が適用されます。
DebugKitのRoutesの項で確認できます。
Route name | URI template | Defaults |
---|---|---|
blogposts:view | /blog_posts/{id} | { "controller": "BlogPosts", "action": "view", "_method": "GET", "plugin": null } |
blogposts:edit | /blog_posts/{id} | { "controller": "BlogPosts", "action": "edit", "_method": [ "PUT", "PATCH" ], "plugin": null } |
blogposts:delete | /blog_posts/{id} | { "controller": "BlogPosts", "action": "delete", "_method": "DELETE", "plugin": null } |
blogposts:index | /blog_posts | { "controller": "BlogPosts", "action": "index", "_method": "GET", "plugin": null } |
blogposts:add | /blog_posts | { "controller": "BlogPosts", "action": "add", "_method": "POST", "plugin": null } |
このアクションの指定の標準値は下記に記述されているものです。
/vendor/cakephp/cakephp/src/Routing/RouteBuilder.php
RouteBuilder
protected static $_resourceMap = [ 'index' => ['action' => 'index', 'method' => 'GET', 'path' => ''], 'create' => ['action' => 'add', 'method' => 'POST', 'path' => ''], 'view' => ['action' => 'view', 'method' => 'GET', 'path' => '{id}'], 'update' => ['action' => 'edit', 'method' => ['PUT', 'PATCH'], 'path' => '{id}'], 'delete' => ['action' => 'delete', 'method' => 'DELETE', 'path' => '{id}'], ];
標準以外のアクションを指定したい場合は、resourceMap配列をresourcesの第二引数$options配列にmapで指定します。
$map = [ 'hogehoge' => ['action' => 'hogehoge', 'method' => 'GET', 'path' => ''], ]; $routes->resources('BlogPosts', ['inflect' => 'underscore', 'map' => $map]);
逆に全体をアンダーバー区切りにして、一部をハイフン区切りにするには、inflectにdasherizeを指定します。
(Cake/Utility/Inflectorのdasherize()を使用するようにします。)
$routes->resources('BlogPosts', ['inflect' => 'dasherize']);
応用としてinflectにcamelizeを指定すると、URLをキャメルケース(/BlogPosts/add)にすることもできます。
一部のURLのみ変更する場合 connect
/config/routes.phpにconnectで個別に指定します。
CakePHP5、CakePHP4
return function (RouteBuilder $routes): void { …… $routes->scope('/', function (RouteBuilder $builder): void { $builder->connect('/blog_posts', ['controller' => 'BlogPosts', 'action' => 'index']); $builder->connect('/blog_posts/add', ['controller' => 'BlogPosts', 'action' => 'add']); …… }); …… };
CakePHP3
Router::scope('/', function (RouteBuilder $routes) { …… $routes->connect('/blog_posts', ['controller' => 'BlogPosts', 'action' => 'index']); $routes->connect('/blog_posts/add', ['controller' => 'BlogPosts', 'action' => 'add']); …… });
関連記事
- テンプレート(template)側でログイン情報を取得する方法
- フォームの必須エラーメッセージをHTML5標準にする方法、カスタマイズする方法
- 標準のHelperを拡張してカスタマイズする方法 CakePHP2
- 国際化i18n(多言語化)
- CakePHP5系の入手方法・インストール方法
- CakePHP4系の入手方法・インストール方法
- CakePHP3系の入手方法・インストール方法
- CakePHP2系の入手方法・インストール方法
- CakePHP1系(CakePHP1.3)をPHP7・PHP8以降に対応させる方法
- CakePHP1系(CakePHP1.3)の入手方法・インストール方法
- Composerコマンドでウクライナへのメッセージが表示されたことがあります
- Composerをインストールする方法と使い方
- コーディング規約のチェックを行う・整形する標準ツール(PHP CodeSniffer)の使い方
- Seedの実行順(外部キー制約などを先に実行させる方法) Foreign key violation
- PostgreSQLでERROR: duplicate key value violates unique constraint "hoge_pkey" DETAIL: Key (id)=(10) already exists.と出る場合
- PostgreSQLで自動採番をするシーケンス(sequence)とは【AUTO INCREMENT】
- Apacheで所有権や書き込み権限があるにも関わらずPermissions deniedが出る場合
- CakePHPのバージョンごとのシステム要件
- PHP Strict Standards: Non-static method と出る場合の対処法
- CakePHPでカラムを比較してSELECTする方法
- [CakePHPのバグ]キャッシュ処理でunlinkエラーが発生する
- 『id』以外のプライマリキーのカラム名を使用する方法
- [CakePHPのバグ]キャッシュ処理でunserializeエラーが発生する
- プライマリキーIDを連番数字ではなく推測しにくい文字列にする方法
- 複数のデータベースを切り替える方法(別データベースを使用する)
- MySQLで文字化けを防ぐ方法
- action名にlistは使えない listを使う方法
- ログイン認証処理をする方法
- CakePHP、Symfony、Zend Frameworkの比較
- CakePHPのDB接続情報設定
- ファイル読み込みPATHを設定
- デバッグレベルを設定
- セキュリティレベルの設定
- キャッシュを有効にする
- CakePHPのエラーテンプレートの一覧
- データベーステーブルを参照しないページを作る
- TOPページはIndexControllerではない Cannot redeclare config()
- ディレクトリ構成
- CakePHP
スポンサーリンク