如何在 CodeIgniter 4 中基于 ENVIRONMENT 定义 baseURL

从 CodeIgniter 3 升级到 CodeIgniter 4,一开始我发现了一个我无法解决的问题。在 CI3 中,我有一个 switch 语句application/config/config.php来设置$config['base_url']. 就像是


$localFolder = "localfolder";


switch (ENVIRONMENT) {

    case 'development':

        $config['base_url'] = "http://$localFolder.loc";

        break;


    default:

        $config['base_url'] = "http://testserver.com/$localFolder";

        break;

}

但是在 CI4 中,app/Config/App.php现在是一个类,我还没有弄清楚如何public $baseURL = "samplefolder";根据ENVIRONMENT变量定义。


立即调用函数不起作用:


public $baseURL = (function(){

        switch (ENVIRONMENT) {

            case 'development':

                $this->baseURL = "http://$localFolder.loc";

                break;


            default:

                $this->baseURL = "http://testserver.com/$localFolder";

                break;

        }

    })();

错误:


Fatal error: Constant expression contains invalid operations

此外,在声明 with 后调用该函数$this->会产生错误:


public $baseURL = "";


public function baseURL($localFolder)

    {

        switch (ENVIRONMENT) {

            case 'development':

                $this->baseURL = "http://$localFolder.loc";

                break;


            default:

                $this->baseURL = "http://testserver.com/$localFolder";

                break;

        }

    }


$this->baseURL("localfolder");

错误:


Parse error: syntax error, unexpected '$this' (T_VARIABLE), expecting function (T_FUNCTION) or const (T_CONST)

我将不胜感激任何帮助!


呼如林
浏览 102回答 3
3回答

莫回无

更好的做法是为每个环境创建一个唯一的 .env 文件。然后将您的 conf 设置到那些 .env 文件中。例如,你可以有一个像这样的 .env 文件:#--------------------------------------------------------------------# ENVIRONMENT#--------------------------------------------------------------------CI_ENVIRONMENT = development#--------------------------------------------------------------------# APP#--------------------------------------------------------------------app.baseURL = 'http://localfolder.loc'另一个与app.baseURL = 'http://testserver.com/localfolder'.去检查关于它的 CI4 文档:https ://codeigniter.com/user_guide/general/configuration.html#handling-different-environments

守着一只汪

好问题,因为我还没有考虑为我自己的网站做类似的事情,现在是时候研究这个了......这不是最好的解决方案,但需要考虑。您可以将以下内容添加(附加)到您的 App.php 以包含...    protected $localFolder = 'localfolder';    public function __construct() {        parent::__construct();        $this->setBaseUrl(); // Set the Base URL    }    protected function setBaseUrl() {        switch ($_ENV['CI_ENVIRONMENT']) {            case 'development':                $this->baseURL = "http://$this->localFolder.loc";                break;            default:                $this->baseURL = "http://testserver.com/$this->localFolder";                break;        }    }} // End of APP Class因此,更改 .env 文件中的 CI_ENVIRONMENT 值将切换 $baseURL。更好的方法您最好将 $localFolder 设置为 ENV 值,这样您就可以从一个位置进行控制。LOCAL_FOLDER = '本地文件夹'在你的 .env 文件中#--------------------------------------------------------------------# ENVIRONMENT#--------------------------------------------------------------------# CI_ENVIRONMENT = productionCI_ENVIRONMENT = developmentLOCAL_FOLDER = 'localfolder'然后 setBaseUrl 方法将变为protected function setBaseUrl() {    switch ($_ENV['CI_ENVIRONMENT']) {        case 'development':            $this->baseURL = "http://{$_ENV['LOCAL_FOLDER']}.loc";                break;        default:            $this->baseURL = "http://testserver.com/{$_ENV['LOCAL_FOLDER']}";                break;    }}希望这能给你一些想法。

杨__羊羊

另一种方法是通过注册商这种方法的好处是您可以在一个地方覆盖任何配置。您只需创建一个 Config/Registrar.php 文件,然后像这样覆盖配置:namespace Config;class Registrar{    public static function App(): array {        return [            'production' => ['baseURL' => 'https://example.com'],            'development' => ['baseURL' => 'https://dev.example.com']        ][$_ENV['CI_ENVIRONMENT']];    }}
打开App,查看更多内容
随时随地看视频慕课网APP