Help us understand the problem. What is going on with this article?

来たるCakePHP 4.0 を知ろう

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の過去と現在と未来の話をされていました。

https://www.slideshare.net/markstory/cakephp-the-road-ahead

その中で、未来のCakePHPの話としてメジャーバージョン 4.0 のアイデアの紹介がされました。

その直後2017年6月23日に、「Upcoming CakePHP Roadmap & Releases」が公開され、CakePHP 4 のアナウンスがされました。

そして、2018年6月4日に、CakePHP 4 の開発開始が告知され、4.0のRoadmapが紹介されました。

https://github.com/cakephp/cakephp/wiki/4.0-Roadmap

CakePHP 4.0 の開発進捗は、その後コアデベロッパーのツイッターにて時々見受けられるようになり、例えば2019年1月29日には、CakePHP 4.0 がPSR-15のサポートをする実装ができたといったツイートがされるなど、進んでいっていました。

開発が進んでいく中で、2019年11月7日(木)〜11月10日(日)に開催された、CakeFest 2019にて、「Safer, More Helpful CakePHP」という発表がMark Storyさんにて行われて、具体的なCakePHP 4.0 についての説明があり、「もうすぐリリースか!」といった温度感を感じる内容となっていました。

https://www.slideshare.net/markstory/safer-more-helpful-cakephp

CakePHP 4.0 の特徴

Safer, More Helpful CakePHPの発表内で、CakePHP 4.0 を説明する一文として、

EARLY FEEDBACK & SAFETY

という言葉を使っています。4.0 についての新機能や新たな非推奨は、4.0 Migration Guideにて確認することができます。

https://book.cakephp.org/4/en/appendices/4-0-migration-guide.html

大まかな部分として、次のような特徴を持っています。

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での投票にて決定しました。

https://github.com/cakephp/cakephp/issues/13103

そのため、CakePHPの 4.x ブランチにおける composer.json でも php 7.2.0以上を requireとして定義されています。

    "require": {
        "php": ">=7.2.0",

https://github.com/cakephp/cakephp/blob/a0262efd1cc077842250e705f8cceadafda109de/composer.json#L31

STRICTER TYPING

4.0 では、内部実装において基本的にすべてのPHPファイルで、declare(strict_types=1);を定義し、厳密な型チェックを有効にしています。

https://www.php.net/manual/ja/functions.arguments.php#functions.arguments.type-declaration.strict

試しに、Routeクラスをピックアップすると、次のように定義されていることがわかります。

<?php
declare(strict_types=1);

https://github.com/cakephp/cakephp/blob/7a4c880bd63ce886dc75cc23f536781a16591f47/src/Routing/Route/Route.php#L2

戻り値型宣言

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;
        }

https://github.com/cakephp/cakephp/blob/0b1361564a8a497aa287fa8acc0357ef3f13197e/src/Routing/Route/Route.php#L426

と失敗した場合は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;
        }

https://github.com/cakephp/cakephp/blob/7a4c880bd63ce886dc75cc23f536781a16591f47/src/Routing/Route/Route.php#L422

PSR-15,16対応

すでに3.xでマージされているものもありますが、4.0 Roadmapにて、PSR-15やPSR-16対応がされていきました。

PSRとは、PHP Standards Recommendationsであり、各種物議を醸しつつも、コミュニティにて影響が大きい勧告です。

https://www.php-fig.org/psr/

PSR-15は、Middlewareに関連するものですが、4.xに向けて対応がされマージされています。

https://github.com/cakephp/cakephp/pull/12907

PSR16はCacheに関するものですが、こちらも3.7の段階で対応が完了しています。

https://github.com/cakephp/cakephp/pull/12907

これらに関する説明について、2019年1月に自分がPHP勉強会で発表した「Steadily developing CakePHP 4.0」にて説明しているので、気になる方はこちらをご覧ください。

使用者として気がついたこと

これまで、CakePHPの内部にてどういうふうに変わったかという話をしていましたが、実際に使用者側としてどういうことを感じたかという点を、主観でピックアップしていきます。

templatesについて

templatesについてまずディレクトリ構成が変わり、src以下から飛び出し、別途templatesディレクトリができました。

src/
templates/

https://github.com/cakephp/cakephp/tree/45becd398ac060c9d1f379c42627a6ba81158933/templates

これは、CakeFest 2019にて、日本人コアコミッターである@chinpei215さんが解説されていましたが、セキュリティホールに対する対応とのことでした。

https://github.com/cakephp/cakephp/issues/11760#issuecomment-368437105

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にバージョンアップできるということになります。

また、アップデートツールも用意されています。

https://github.com/cakephp/upgrade/tree/4.x

現在サポート中のバージョン

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さんの記事です。楽しみですね!ではまた!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした