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をインストールした記録