Help us understand the problem. What is going on with this article?

アプリケーションコンテキスト値の環境切り替え

はじめに:環境のコンテキスト

BEARでは コンテキスト に応じてアプリケーションオブジェクトの構成が変わり、振る舞いが変更されます1 。実務でBEARを使う場合、環境 を切り替えるためにはコンテキストを利用することになります。たとえば、「開発環境ではカスタムコンテキストの dev 、production 環境では prod を付して、DBサーバーの接続先等を切り替える」というような使い方をすることが多いでしょう。

boot ファイルとコンテキスト

標準インストールした状態だと boot ファイル は下記のようになっています(執筆時点現在)。

  • /bootstrap.php FWブートの return 文が一つあるだけのスクリプト。
// ...
return function (string $context, string $name = 'MyVendor\MyProject') : int {
    $app = (new Bootstrap)->getApp($name, $context, __DIR__);
    // ・・・(説明用のため省略)・・・
    $request = $app->router->match($GLOBALS, $_SERVER);
    // (省略)
    $response = $app->resource->{$request->method}->uri($request->path)($request-        
    // (省略)
};
  • public/index.php Webサーバー向けエントリーポイント。上記にコンテキストを与えて呼び出す役割。
require dirname(__DIR__) . '/autoload.php';
exit((require dirname(__DIR__) . '/bootstrap.php')(PHP_SAPI === 'cli-server' ? 'hal-app' : 'prod-hal-app'));

Webアプリでよくある使われ方

Webアプリでよくある使われ方の一つは下記ではないでしょうか。

  • 開発環境ではエントリーポイントでコンテキスト値 dev-html-app をデフォルトとしてハードコード
  • production に出すときは prod-html-app 固定でハードコード

環境毎にコンテキスト値を書き換えるわけです。これはどう管理するのが良いでしょうか?

環境切り替えの実装例

以上が前置きでした。ここから本題で、私がふだん使っているエントリーポイントでの環境切り替えの実装を以下に紹介します。bootファイル系の変更だけなので、どのアプリケーションでも簡単に試せる内容です。

1. Webサーバーのエントリーファイルを環境のコンテキストのファイル名で配置

  • 開発環境では ビルトインWebサーバルータースクリプト2dev.php を指定。コンテキスト値 dev-html-app がハードコードしてある。
  • production ではWebサーバーで prod.php を設定。コンテキスト値 prod-html-app がハードコードしてある。

   スクリーンショット_2019-12-22_10_40_12.png

2. production 環境のWebサーバー設定のイメージ

Nginx の場合

    server {
        listen       8082;
        server_name  www.dummy-foo.com;

        set $host_path "/path/to/FormalBearsDemo";
        set $bear_bootstrap "prod.php";
        root $host_path/public;

        location / {
            try_files $uri /$bear_bootstrap$is_args$args;
        }

        # pass the PHP scripts to FastCGI server
        set $port "9073";
        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:$port;
            fastcgi_split_path_info ^(.+\.php)(/.*)$;
            include        fastcgi_params;
            fastcgi_param  SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
            fastcgi_param  DOCUMENT_ROOT $realpath_root;
            internal;
        }
    }

実装リポジトリ

こちらに置きました。FormalBearsDemo

特徴

  • ふだんよく使う開発フロー、環境切り替えにフィットしており、作業効率が良いように私は思っています。
  • 別コンテキストを都度指定することは想定していません。柔軟な設定や、複雑な合成がしたい場合は、別途、デフォルトのやり方で普通に使えば良いと思います。私は両方のやり方を併用しています(前述のリポジトリ参照)。

参考記事

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした