5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

BEAR.SundayAdvent Calendar 2019

Day 22

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

Last updated at Posted at 2019-12-22

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

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

特徴

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

参考記事

  1. BEAR公式マニュアル:アプリケーション

  2. PHP: ビルトインウェブサーバー - Manual

5
2
0

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
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?