#動的にBase URLを設定したいってことありますよね?
1つのサイトの実装で、複数のホスト名(www.foo.comとfoo.comや、www.hoo.comとwww.bar.comなど)を運用したいことってよくありますよね?CodeIgniter3(以下CI3)の頃はconfig/config.php
の中の$config['base_url']
を$_SERVER['HTTP_HOST']
でも$_SERVER['SERVER_NAME']
でも自由に書き換えて使うことが可能でした。
中身はただのPHPファイルなので条件分岐をしたり何でもアリです。
CodeIgniter4(以下CI4)でも同じように自由に設定することができるのでしょうか?
##CI4ではCI3と違って直接$baseURL
に$_SERVER
変数は書けません。
CI4ではホストの初期設定に用いるConfig/App.php
の$baseURL
は、CI3と違ってBaseConfig Class
を継承したクラスのメンバ変数として定義されているので、直接$_SERVERを利用したり式の形での記述はできません。
そこで次の2種類のアプローチで式を利用できるようにしたいと思います。
##その1:Config/Constants.php
で定数定義しておきそれを利用する
Config/Constants.php
ファイルはCI4のシステムの上でかなり早期に呼ばれるファイルです。
どれぐらい早期かと言うと、CI4のブートストラップファイルで最初に呼ばれるくらいには早く読み込まれるファイルです。
当然Config\App Class
が呼ばれるより早く読み込まれるので、これを利用して$baseURL
を定数で定義することが可能になります。
ここはクラス定義ではなく、ただのphpのファイルなので条件分岐でも何でも書けます。
以下の例では独自にMyBaseURL
という定数を事前に定義して、それをConfig/App.php
で利用してます。
$s=isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 's' : '';
defined('MyBaseURL') || define('MyBaseURL',"http{$s}://{$_SERVER['SERVER_NAME']}/");
2020-12-21追記:上記の方法ではCLIコマンドでFatal errorが発生してしまうので、次のように$_SERVER['SERVER_NAME']の変数セットを確認して適宜値をするようにすることをおすすめします。
$s=isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 's' : '';
$host = isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : getHostByName(getHostName());
defined('MyBaseURL') || define('MyBaseURL',"http{$s}://{$host}/");
$s=isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 's' : '';
$host = isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : 'localhost' );
defined('MyBaseURL') || define('MyBaseURL',"http{$s}://{$host}/");
そしてConfig/App.php
では次のように記述します。
public $baseURL = MyBaseURL;
##その2:Config\App Class
のコンストラクタで定義
$baseURLはConfig\App Class
のメンバ変数なので、コンストラクタで再定義することも可能です。
<?php namespace Config;
use CodeIgniter\Config\BaseConfig;
class App extends BaseConfig
{
.
.
.
ーー SNIP ーー
.
.
public $baseURL = 'localhost:8080';
.
.
ーー SNIP ーー
.
.
.
// コンストラクタを追記
public function __construct(){
parent::__construct(); // 親のコンストラクタを呼ぶのを忘れずに!
$s=isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 's' : '';
$this->baseURL = "http{$s}://{$_SERVER['SERVER_NAME']}/";
}
}
使用者の実装の仕方の好みなどもあると思いますので、お好みの方法で利用していていただければと思います。