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
スポンサーリンク





