CakePHP 3 で Deprecated エラーが表示されない!?を解決する2つの方法

はじめに

CakePHP 3 のバージョンアップ作業をしていると Deprecated エラーが出ることがよくあります。しかし今回、 XAMPP を使っていて Deprecated エラーメッセージが画面に表示されない現象がおきました。

もう少し詳しく状況を書くと、php.ini の error_reporting と app.php の erroLevel は E_ALL、app.php の debug は true で、logs/error.log には Deperecated エラーが出力されています。

今日は CakePHP 3 で Deprecated エラーが表示されない場合の解決方法を2つご紹介します。動作確認で使用したのは CakePHP 3.8.2 です。

目次
  1. 実行環境
  2. DebugKit で確認
  3. 画面に出力(DebugKit からは消える)
  4. おわりに

1. 実行環境

データベースに articles テーブルを追加し、コントローラ、モデル、テンプレートを Bake で作ります。そして Deprecated エラーを出すために、Articles モデルを下記のように変更しました。

/src/Model/Table/ArticlesTable.php
public function initialize(array $config)
{
  parent::initialize($config);

  // $this->setTable('articles'); ←コメントアウト or 削除
  $this->table('articles'); // ←追加
  ...
}

2. DebugKit で確認

一番お手軽なのが DebugKit で確認する方法でしょうか。画面右下に表示される CakePHP のロゴマークをクリックし、「Deprecations」をクリックしてください。

app.config の debug を true にしないと表示されないのでご注意ください

この方法は簡単ですが、いちいちメニュを開く必要があったり、画面表示することなくリダイレクトするケースなどで気づかない場合があります。そこで次に、Deprecation エラーを画面に表示する方法をご紹介します。

3. 画面に出力(DebugKit からは消える)

DebugKit で「Deprecations」を表示しない設定にすると、画面に Deprecated エラーが表示されるようになります。

app.php に下記を追記してください。

/config/app.php
return [
  ...
  'DebugKit' => [
    'panels' => [
      'DebugKit.Deprecations' => false
    ]
  ]
]

4. おわりに

Deprecated を画面に表示する方法は CakePHP 本体(DebugKit)のソースコードを、「Deprecated」や「error_reporting」などのキーワードで検索し、分析しながら試行錯誤でみつけました。

具体的には下記コードが参考になりました。

/vendor/cakephp/debug_kit/config/bootstrap.php
if (!empty($service->getConfig('panels')['DebugKit.Deprecations'])) {
  // 色々な処理
}

根本的な原因までは調べていないので、もしかしたらより良い解決方法があるのかもしれませんが、それが分かるまでは上記で対応しようと思います。