LoginSignup
0
1

More than 3 years have passed since last update.

CodeIgniter4でBase URLを動的に設定する。

Last updated at Posted at 2020-11-02

動的に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で利用してます。

Config/Constants.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']の変数セットを確認して適宜値をするようにすることをおすすめします。
Config/Constants.phpの末尾に追記(修正版1、PHPの関数を利用して実行ホストのIPを求める)
$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}/");
Config/Constants.phpの末尾に追記(修正版2、CLIの場合はlocalhost決め打ち)
$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では次のように記述します。

Config/App.php
    public $baseURL = MyBaseURL;

その2:Config\App Classのコンストラクタで定義

$baseURLはConfig\App Classのメンバ変数なので、コンストラクタで再定義することも可能です。

Config/App.php
<?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']}/";
    }
}

使用者の実装の仕方の好みなどもあると思いますので、お好みの方法で利用していていただければと思います。

0
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1