CakePHP4.3でコントローラーのアクションの引数にstring型以外を指定できるようになっていた件
この記事は コネヒト Advent Calendar 2021 14日目の記事です。
最近は業務でCakePHPのバージョンアップ作業を行っており、その中で気づいた小ネタについてまとめてみます。
CakePHP4系のCookbookより
CakePHP4.3移行ガイド中に以下のような記述があります。
- コントローラでは、アクションパラメータに float, int, bool, array のいずれかの型宣言をサポートするようになりました。 ブール型で渡されるパラメータは、 0 か 1 のどちらかでなければなりません。
具体的には以下のように、コントローラー内view
アクションの引数にint
型を指定したりできるようになりました。[1]
class ArticlesController extends AppController
{
public function view(int $id)
{
// 何かしらの処理
}
}
今まではどうだったのか?
CakePHP4.2までは引数にstring
型しか指定できませんでした。
$routes->connect(
'/articles/{id}',
['controller' => 'Articles', 'action' => 'view']
)
->setPatterns(['id' => '\d+'])
->setPass(['id']);
このようにルーティング時点でバリデーションを行い、id
は絶対に数値だ!となっていても、以下のようにstring
型しか指定できませんでした。
そのため、処理の中で$id
をint
型として扱いたい場合は、(int)$id
のようにキャストする必要がありました。
class ArticlesController extends AppController
{
public function view(string $id)
{
// 何かしらの処理
// $idをint型で扱いたい場合は(int)$idのようにキャストが必要
}
}
string
型以外を指定できるよ?
あれ、以前のバージョンでも実はCakePHP3以前では、string
型以外を指定してもエラーにはなりません。これは、暗黙の型変換が行われるためです。
CakePHP4以降は、declare(strict_types=1);
宣言されるようになったため、厳密な型チェックが行われ、string
型以外ではエラーになります。
ちなみに、自分も誤解していたのですが、declare(strict_types=1);
が有効なのは、宣言されたファイルから行われる関数呼び出しに対して[2]です。(宣言されたファイル内の関数に対してではありません!)
CakePHP4以降は、フレームワーク側全体にdeclare(strict_types=1);
宣言されているため、コントローラーのアクションの引数では必ず厳密な型チェックが行われます。
おわりに
実はCakePHP4.3へのバージョンアップはまだまだ先なのですが、気づいたのでまとめてみました。いつかCakePHP4.3にできたら、この機能を活用してみたいと思います〜。
Discussion