はじめに:環境のコンテキスト
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サーバ
でルータースクリプト
2にdev.php
を指定。コンテキスト値dev-html-app
がハードコードしてある。 - production ではWebサーバーで
prod.php
を設定。コンテキスト値prod-html-app
がハードコードしてある。
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
特徴
- ふだんよく使う開発フロー、環境切り替えにフィットしており、作業効率が良いように私は思っています。
- 別コンテキストを都度指定することは想定していません。柔軟な設定や、複雑な合成がしたい場合は、別途、デフォルトのやり方で普通に使えば良いと思います。私は両方のやり方を併用しています(前述のリポジトリ参照)。