Как определить baseURL на основе ОКРУЖАЮЩЕЙ СРЕДЫ в CodeIgniter 4 - PullRequest
0 голосов
/ 14 апреля 2020

Обновлен с 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

Кроме того, вызов функции после объявления с помощью $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)

Буду признателен за любую помощь!

Ответы [ 2 ]

2 голосов
/ 15 апреля 2020

Лучше всего иметь один уникальный файл .env для каждой среды. Затем установите ваш conf в эти .env файлы. Например, у вас может быть файл .env, подобный этому:

#--------------------------------------------------------------------
# ENVIRONMENT
#--------------------------------------------------------------------

CI_ENVIRONMENT = development

#--------------------------------------------------------------------
# APP
#--------------------------------------------------------------------

app.baseURL = 'http://localfolder.loc'

, а другой файл с app.baseURL = 'http://testserver.com/localfolder'.

Go проверьте документацию CI4 по этому поводу: https://codeigniter.com/user_guide/general/configuration.html#handling -Разные-среда

1 голос
/ 15 апреля 2020

Хороший вопрос, и, поскольку я еще не задумывался над тем, чтобы сделать что-то похожее для своих сайтов, сейчас самое время взглянуть на это ...

Это не самое большое из решения, но кое-что стоит рассмотреть.

Вы можете добавить (добавить) следующее в свое приложение. 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

Таким образом, изменив значение CI_ENVIRONMENT в вашем .env file переключит ваш $ baseURL.

A Better way

Возможно, вам лучше установить $ localFolder в качестве значения ENV, чтобы вы могли управлять этим из одного места .

LOCAL_FOLDER = 'localfolder'

В вашем файле .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;
    }
}

К счастью, это дает вам несколько идей.

...