【问题标题】:How to define baseURL based on ENVIRONMENT in CodeIgniter 4如何在 CodeIgniter 4 中基于 ENVIRONMENT 定义 baseURL
【发布时间】:2020-04-14 14:38:05
【问题描述】:

从 CodeIgniter 3 升级到 CodeIgniter 4,一开始我发现了一个我无法解决的问题。 在 CI3 中,我在 application/config/config.php 中有一个 switch 语句来设置 $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 现在是一个类,我还没有弄清楚如何根据 ENVIRONMENT 变量定义 public $baseURL = "samplefolder";

立即调用函数不起作用:

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

另外,用$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)

我将不胜感激!

【问题讨论】:

    标签: php codeigniter codeigniter-4


    【解决方案1】:

    更好的做法是为每个环境创建一个唯一的 .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

    【讨论】:

    • 是的,可能对于较大的项目,这也是我的选择,但很多时候我每天都有小项目,我需要一个尽可能灵活的基本 CI4 基本模板来加快速度这些小项目
    • 这到底是如何工作的?如果我有一个项目,但有多个环境(dev 和 prod),并且我在环境之间移动项目,我希望项目无需额外修改即可工作。假设我在项目文件夹中只能有一个 .env 文件,这将无济于事。 Environments in CI3 更有活力。我可以在 config 文件夹中创建一个自定义文件夹,并将特定于环境的设置存储在那里。我正在尝试在 CI4 中做同样的事情。
    【解决方案2】:

    好问题,因为我还没有考虑为我自己的网站做类似的事情,现在是时候研究这个了......

    这不是最好的解决方案,但需要考虑。

    您可以在 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 = production
    CI_ENVIRONMENT = development
    LOCAL_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;
        }
    }
    

    希望这能给你一些想法。

    【讨论】:

      【解决方案3】:

      另一种方法是通过Registrars

      这种方法的好处是您可以在一个地方覆盖任何配置。您只需创建一个 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']];
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2016-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-25
        • 1970-01-01
        • 2012-07-26
        • 2014-09-14
        • 2020-06-09
        相关资源
        最近更新 更多