インジェクターアップグレードガイド
変更点
BEAR.Package 1.10 では従来のAppInjector, Bootstrapは@deprecatedになり、統合されたInjectorになりました。
-AppInjector
-Bootstrap
+Injector
BEAR\Package\Injector::getInstance()ではコンテキストに応じたインジェクターが渡されます。
プロダクションでは従来のDIのスクリプトファイルを書き出すScriptInjector、開発用ではDIファイルを書き出さないRay\Di\Injectorが渡されます。
利用方法は変わりません。
$injector = Injector::getInstance($context);
$instance = $injector->getInstance($interface, name);
利点
-
ScriptInjectorは最初のリクエストでもファイル消去しなくなりより安全になります。 -
Ray\Di\Injectorはvar\tmpにDIファイルを出力しません。開発時のインジェクションが(特にDockerで)高速になります。 -
コンパイルと実行の環境が違うコンテナ環境にも最適化されました。
-
テストが高速になります。
従来のAppInjectorではインジェクターインスタンスの取得を毎回行っていましたが、新しいInjectorではシングルトンでテスト間で共用されます。
速度が劇的に改善され、テスト毎のDB接続で接続数が枯渇するような事がありません。
アプリケーションやコンテキストを超えたアクセスが同一メモリ空間で可能になるほど、実装がクリーンに改善されました。 Swooleなど(PHPのシェアドナッシングアーキテクチャではない)のランタイム環境でもより安全、高速に動作します。
アップグレード方法
Step 1
src/Injector.phpにアプリケーションのInjectorを配置します。Vendor\Packageを自分のプロジェクト名に変更してください。
<?php
namespace Vendor\Package;
use BEAR\Package\Injector as PackageInjector;
use Ray\Di\InjectorInterface;
final class Injector
{
private function __construct()
{
}
public static function getInstance(string $context) : InjectorInterface
{
return PackageInjector::getInstance(__NAMESPACE__, $context, dirname(__DIR__));
}
}
Step 2
bootstrap.phpを変更します。
-$app = (new Bootstrap)->getApp($name, $context, __DIR__);
+$app = Vendor\Package\Injector::getInstance($context)->getInstance(\BEAR\Sunday\Extension\Application\AppInterface::class);
Step 3
tests/で使用してるAppInjectorを変更します。
-new AppInjector('Vendor\Package', 'test-hal-api-app');
+\Vendor\Package\Injector::getInstance('test-hal-api-app');
複数アプリケーションのプロジェクトで、他のアプリケーションのインジェクターを取得する場合にはBEAR\PackageのInjectorを使います。
-new AppInjector('Vendor\Package', 'test-hal-api-app');
+\BEAR\Package\Injector::getInstance('Vendor\Package', 'test-hal-api-app', $appDir);
FCQN(完全修飾名)の長いクラス名はツールで変換するのが便利です。1
以上です。
互換性について
後方互換性は保たれます。@deprecateになったクラスも引き続き使用でき、廃止の予定もありません。
BEAR.Sundayはsemverを遵守します。