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 nameURI templateDefaults
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']);
……
});

関連記事

スポンサーリンク

EclipseでPHPプロジェクトにする方法

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る