📚

env()が定義されていないというエラーの解消方法

2024/08/01に公開

はじめに

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の中にあります。

おわりに

今回はエラー解消に加えて、中身についても学習しました。こういう機会に学習すると理解が深まっていいですね。誰かの助けになれば幸いです。

参考文献

https://discourse.cakephp.org/t/rector-to-upgrade-bootstrap/11790

Discussion