【CakePHP】 3.8 と 2.x の違いについて

CakePHP4がすでにリリースされました。CakePHP4 の移行ガイドを見てみると以下のように書かれています。

CakePHP 4.0 には、重大な変更が含まれており、3.x リリースとの後方互換性はありません。 4.0 にアップグレードする前に、最初に 3.8 にアップグレードし、すべての非推奨警告を解消してください。

そのため、今回はCakePHP3.8を試してみて、CakePHP2.xとの違いを見ていきます。

CakePHP3.8のインストール

CakePHP3.xからは php の intl拡張モジュールが必要になります。
以下のコマンドでインストール済かどうかを確認できます。特に何も表示されなかった場合はインストールが必要になります。

php -i | grep intl


PHPをソースからインストールする際には、PHPのコンパイル時 ./Configure に --enable-intl オプションを付けます。

$ wget https://www.php.net/distributions/php-7.2.27.tar.gz
$ tar xzf php-7.2.27.tar.gz
$ cd php-7.2.27
$ ./configure --enable-intl
$ make
$ sudo make install

また、すでにPHPをインストールしていればこちらでインストールができます。

$ sudo yum -y install php-intl.x86_64

intl インストール後、php.ini に次の記述を追加します。

[php.ini]
extension=php_intl.dll

今回使用した環境では、remiリポジトリを追加してPHPをインストールしていたので、yum list で該当のモジュール名を検索してから、インストールしました。

$ yum list | grep intl  /* intl を検索 */
intltool.noarch                          0.50.2-7.el7             @base         
perl-libintl.x86_64                      1.20-12.el7              @base         
php-intl.x86_64                          5.4.16-46.el7            base          
php70-php-intl.x86_64                    7.0.33-13.el7.remi       remi-safe     
php71-php-intl.x86_64                    7.1.32-1.el7.remi        remi-safe     
php72-php-intl.x86_64                    7.2.23-1.el7.remi        remi-safe     
php73-php-intl.x86_64                    7.3.10-1.el7.remi        remi-safe     
php74-php-intl.x86_64                    7.4.0~rc3-23.el7.remi    remi-safe
$ sudo yum -y install --enablerepo=remi,7.2.23-1.el7.remi php72-php-intl.x86_64

また、php.ini に設定する extension も remi リポジトリでインストールしたものに変更が必要です。

$ find -name intl.so -type f 
/opt/remi/php72/root/usr/lib64/php/modules/intl.so
[php.ini]
extension=/opt/remi/php72/root/usr/lib64/php/modules/intl.so

CakePHPをインストールしていきます。
CakePHP3.xからはComposerでインストールするようになりました。

まずこちらからComposerをインストールしてきます。

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'e0012edf3e80b6978849f5eff0d4b4e4c79ff1609dd1e613307e16318854d24ae64f26d17af3ef0bf7cfb710ca74755a') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

Composerのインストールができたら以下のコマンドでCakePHP3.8のプロジェクトを作成します。

php composer.phar create-project --prefer-dist cakephp/app:^3.8 project-name

これでCakePHP3.8のインストールができました。


CakePHP 3.x で変わったところ

デバッグ

2.x ではデバッグレベル(0~2)を指定できましたが、3.x からはデバッグを使用するか、しないかの bool 値をとるようになりました。

Configure::write('debug', $bool)

ヘルパーの読み込み

$helpers 、 $components プロパティーは、AppController を継承したクラスに設定されているプロパティとマージされるようになりました。

class AppController extends Controller {
    protected $helper = ['Html']
    public function index() {
   ));
}


class MyController extends AppController {
    protected $helper = ['From']
    public function index() {
        /* FormヘルパーもHtmlヘルパーも使用できる */
   ));
}

また、ヘルパーの読み込みには次のメソッドの使用が推奨されています。

if ($this->request->getParam('hoge') === 'hoge') {
    $this->loadHelper('MyHelper'); /* ヘルパーの読み込み */
}

セッション

request オブジェクトを介して アクセスするようになりました。

$this->request->session()->read('User.name');

beforeFilter

beforeFilterを使う際にControllerに定義が必要です。

use Cake\Event\Event;
class MyController extends AppController {
    protected $helper = ['From']
    public function beforeFilter(Event $event) {
        parent::beforeFilter($event);
    }

リダイレクト

redirect() を使用すると 2.x ではそこで処理が終わりましたが、3.x ではそのあとの処理が完了してからメソッドを抜けるときにリダイレクトされます。

public function index() {
    echo 'start';
    $this->redirect($url);  /* 2.x ではここで処理が終わる */
    echo 'end';  /* 3.x ではここまで表示される */
}

 

参考

php.net intl インストール手順
CakePHP3でintl導入時につまずいた事
CakePHP 3.0 移行ガイド
CakePHP3をインストールした記録

知識・ノウハウ共有
56件

関連記事