env()が定義されていないというエラーの解消方法
はじめに
CakePHPのバージョンを5系にアップした後にbin/cake cache clear_all
コマンドを実行するとエラーが発生しました。解消方法を調べるのに少し時間がかかってしまったので、他に苦戦している人の助けになればと思い、この記事を書くことにしました。
エラー内容
PHP Fatal error: Uncaught Error: Call to undefined function env()
env()が定義されていないというエラーです。
解消方法
以下の記述をconfig/bootstrap.phpに追加すればいいです。
require CAKE . 'functions.php';
解説
以下ではなぜ解消されるかについて解説します。
定数CAKE
定数CAKEはconfig/paths.phpに定義されています。
define('CAKE', CORE_PATH . 'src' . DS);
これからCAKEはCORE_PATH . 'src' . DSであることがわかります。
CORE_PATHとDSの確認
次にCORE_PATHとDSが何かを確認していきます。これもconfig/paths.phpに記述があります。
if (!defined('DS')) {
define('DS', DIRECTORY_SEPARATOR);
}
define('CORE_PATH', CAKE_CORE_INCLUDE_PATH . DS);
- DIRECTORY_SEPARATORとはLinuxだと/、Windowsの場合だと\です。
- CORE_PATHはCAKE_CORE_INCLUDE_PATH . DSだとわかります。
これによりCAKEがCAKE_CORE_INCLUDE_PATH/src/だということがわかります。
CAKE_CORE_INCLUDE_PATHの確認
次にCAKE_CORE_INCLUDE_PATHを確認します。これもconfig/paths.phpに記述があります。
define('CAKE_CORE_INCLUDE_PATH', ROOT . DS . 'vendor' . DS . 'cakephp' . DS . 'cakephp');
定数ROOTはルートディレクトへのパスをあらわすので、最終的にCAKEはyourproject/vendor/cakephp/cakephp/src/ということになります。
まとめ
以上の説明をもとに、以下のコードが何をしているのか再確認します。
require CAKE . 'functions.php';
これによりyourproject/vendor/cakephp/cakephp/src/functions.phpを読み込んでいることになります。実際に中身を見てみましょう。
functions.phpの中身確認
ファイルの中身をみると以下のようになっています。
require __DIR__ . '/Collection/functions_global.php';
require __DIR__ . '/Core/functions_global.php';
require __DIR__ . '/Error/functions_global.php';
require __DIR__ . '/I18n/functions_global.php';
require __DIR__ . '/Routing/functions_global.php';
これらによってグローバル関数が使用可能になります。env()はCore/functions_global.phpの中にあります。
おわりに
今回はエラー解消に加えて、中身についても学習しました。こういう機会に学習すると理解が深まっていいですね。誰かの助けになれば幸いです。
参考文献
Discussion