CakePHP Advent Calendar 2019の1日目がやってきました。今年のCakePHPの大きなトピックとしては、CakeFestが日本で開催されたことではなかったでしょうか。CakeFest 2019では、CakePHPのFounderであるLarry Mastersさんや、Lead DeveloperであるMark Storyさんなど、CakePHPのコアメンバーの方々が一同した会でした。そこで、CakeFest 2017に続き、CakePHPの次のメジャーバージョン 4.0 の説明がありました。初日の本日は、そんなCakePHP 4.0をざっくり知る記事を展開していきます。
CakePHP 4.0 のこれまでの経緯
CakeFest 2017で行われたMark Storyのプレゼンテーション「CakePHP - The Road Ahead」にて、CakePHPの過去と現在と未来の話をされていました。
その中で、未来のCakePHPの話としてメジャーバージョン 4.0 のアイデアの紹介がされました。
Announcing CakePHP 4 Strawberry. To be built upon the shoulders of giants! #CakePHP #announcement https://t.co/ExpEP118d1
— CakePHP (@cakephp) June 22, 2017
その直後2017年6月23日に、「Upcoming CakePHP Roadmap & Releases」が公開され、CakePHP 4 のアナウンスがされました。
Work on CakePHP 4 has started! What would you like to see in future releases? Check out the CakePHP 4 roadmap #CakePHP #oss #php #phpc #opensource #CakePHP4 https://t.co/XwumvUd4um pic.twitter.com/XKHXyubO1p
— CakePHP (@cakephp) June 4, 2018
そして、2018年6月4日に、CakePHP 4 の開発開始が告知され、4.0のRoadmapが紹介されました。
CakePHP 4.0 の開発進捗は、その後コアデベロッパーのツイッターにて時々見受けられるようになり、例えば2019年1月29日には、CakePHP 4.0 がPSR-15のサポートをする実装ができたといったツイートがされるなど、進んでいっていました。
CakePHP 4.0 will support PSR15 🎉 https://t.co/1iKEBwRt6Y
— Mark Story (@mark_story) January 29, 2019
開発が進んでいく中で、2019年11月7日(木)〜11月10日(日)に開催された、CakeFest 2019にて、「Safer, More Helpful CakePHP」という発表がMark Storyさんにて行われて、具体的なCakePHP 4.0 についての説明があり、「もうすぐリリースか!」といった温度感を感じる内容となっていました。
CakePHP 4.0 の特徴
Safer, More Helpful CakePHPの発表内で、CakePHP 4.0 を説明する一文として、
EARLY FEEDBACK & SAFETY
という言葉を使っています。4.0 についての新機能や新たな非推奨は、4.0 Migration Guideにて確認することができます。
大まかな部分として、次のような特徴を持っています。
PHP7.2+
4.0 では、PHP 7.2以上をrequirementとしています。7.2以上とすることで、PHPにおける型機能がCakePHPの内部実装においても使えるようになっています。これは、GitHubのIssue、Raise minimum version of PHP to 7.2 for 4.0での投票にて決定しました。
そのため、CakePHPの 4.x ブランチにおける composer.json でも php 7.2.0以上を requireとして定義されています。
"require": {
"php": ">=7.2.0",
STRICTER TYPING
4.0 では、内部実装において基本的にすべてのPHPファイルで、declare(strict_types=1);
を定義し、厳密な型チェックを有効にしています。
試しに、Routeクラスをピックアップすると、次のように定義されていることがわかります。
<?php
declare(strict_types=1);
戻り値型宣言
PHP7.2以上としたことによって、スカラー型宣言を利用できるので、内部実装において、戻り値の型宣言を多く使用しています。また、array|bool
といったエラーハンドリングがされていたような実装は、nullable型を利用し型宣言をできるようしています。
例えば、Routeクラスのparse()というメソッドを見てみると、3.xの場合は、
public function parse($url, $method = '')
{
if (empty($this->_compiledRoute)) {
$this->compile();
}
list($url, $ext) = $this->_parseExtension($url);
if (!preg_match($this->_compiledRoute, urldecode($url), $route)) {
return false;
}
と失敗した場合はfalse
を返すような実装は、4.xにて次のようになりました。
public function parse(string $url, string $method): ?array
{
$compiledRoute = $this->compile();
[$url, $ext] = $this->_parseExtension($url);
if (!preg_match($compiledRoute, urldecode($url), $route)) {
return null;
}
PSR-15,16対応
すでに3.xでマージされているものもありますが、4.0 Roadmapにて、PSR-15やPSR-16対応がされていきました。
PSRとは、PHP Standards Recommendationsであり、各種物議を醸しつつも、コミュニティにて影響が大きい勧告です。
PSR-15は、Middlewareに関連するものですが、4.xに向けて対応がされマージされています。
PSR16はCacheに関するものですが、こちらも3.7の段階で対応が完了しています。
これらに関する説明について、2019年1月に自分がPHP勉強会で発表した「Steadily developing CakePHP 4.0」にて説明しているので、気になる方はこちらをご覧ください。
使用者として気がついたこと
これまで、CakePHPの内部にてどういうふうに変わったかという話をしていましたが、実際に使用者側としてどういうことを感じたかという点を、主観でピックアップしていきます。
templatesについて
templatesについてまずディレクトリ構成が変わり、src
以下から飛び出し、別途templates
ディレクトリができました。
src/
templates/
これは、CakeFest 2019にて、日本人コアコミッターである@chinpei215さんが解説されていましたが、セキュリティホールに対する対応とのことでした。
As I said in the dev channel, this change could be a security hole accidentally. If you call class_exists('App\Template\Users\index'), composer will include index.php. If we want to do that, we would also have to move the Template directory to the root directory like config or bin.
また、このissueのタイトル「RFC: Use .php extension by default for templates.」にもありますが、テンプレートファイルのデフォルトの拡張子が.ctp
から.php
に変更されました。
JSON viewを返却する際の変更
4.0 において、JsonView
の特殊なビュー変数である_serialize
や_jsonOptions
、_jsonp
が非推奨となりました。そのため、JSONを返すAPIを作る場合に次のようなコードを書くことになったようです。
public function view($slug = null)
{
$article = $this->Articles->findBySlug($slug)->firstOrFail();
$this->viewBuilder()
->setClassName(JsonView::class)
->setOption('serialize', 'response');
$this->set('response', ['article' => $article]);
}
4.0 へのアップデート
既存システムの4.0へのバージョンアップは、CakePHP3.8へアップグレードし、PHP7.2以上にバージョンアップしてから4.0にあげるのがベターなようです。
それにあたって、様々非推奨になったAPIが存在するので、非推奨機能の利用をすべて排除してから上げる必要があります。
実際、昨今の3.xのマイグレーションガイドでは、Deprecationsの告知が非常に多くなっています。
逆に言うと、非推奨機能の利用を取り除けば、3.xから4.0にバージョンアップできるということになります。
また、アップデートツールも用意されています。
現在サポート中のバージョン
2.xや3.xのバージョンのサポートに関しては次のスケジュールとなっています。
2.x
- Bug fixes for 12 months after the release of 4.0.0
- Security fixes for 18 months after the release of 4.0.0
3.x
- Security fixes for 36 months after 4.0.0 is released
最後に
2日目のCakePHP Advent Calendar 2019は、@nojimageさんの記事です。楽しみですね!ではまた!