38
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

CakePHPAdvent Calendar 2019

Day 1

来たるCakePHP 4.0 を知ろう

Last updated at Posted at 2019-11-30

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 のアイデアの紹介がされました。

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

そして、2018年6月4日に、CakePHP 4 の開発開始が告知され、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 についての説明があり、「もうすぐリリースか!」といった温度感を感じる内容となっていました。

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

38
30
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
38
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?