Skip to content

Latest commit

 

History

History
124 lines (83 loc) · 3.85 KB

README.ja.md

File metadata and controls

124 lines (83 loc) · 3.85 KB

Ray.Di for Laravel

DI+AOP, done the right way

English | Japanese

Laravelの依存解決をRay.Diが行います。依存オブジェクトのAOPも可能にします。

Ray.Diによる生成を行わない場合には、既存のLaravelのサービスコンテナがインスタンス生成して互換性を維持します。

インストール

composer require ray/ray-di-for-laravel

利用

束縛を記述するモジュール、コンテキスト、生成されるファイルを保存するディレクトリをコピーします。

cp -r vendor/ray/ray-di-for-laravel/RayDi app
cp -r vendor/ray/ray-di-for-laravel/storage/ storage

bootstrap/app.phpの以下の行を変更します。

+ $basePath = $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__);
+ $context = getenv('APP_ENV') ?: 'local';
- $app = new Illuminate\Foundation\Application(
-     $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
- );
+ $app = new Ray\RayDiForLaravel\Application(
+     $basePath,
+     App\RayDi\Context\ContextProvider::get($basePath, $context)
+ );

Ray\RayDiForLaravel\Attribute\InjectableアトリビュートをRay.Diによって解決したいクラス・インターフェースに付加します。

下記クラスはRay.Diによって解決されます。

<?php

namespace App\Http\Controllers;

use Ray\RayDiForLaravel\Attribute\Injectable;

#[Injectable]
class HelloController extends Controller
{

}

下記は既存のLaravelのサービスコンテナによって解決されます。

<?php

namespace App\Http\Controllers;

// アトリビュートなし
class HelloController extends Controller
{

}

コンテキスト

RayDi/Context/ContextProvider によって、アプリケーション実行時のコンテキストに応じたコンテキストクラスが生成されます。

コンテキストクラスでモジュールとキャッシュを指定し、コンテキストに応じたインジェクターが選択されます。

Ray.Di for Laravel では、組み込みコンテキストとして以下を提供しています。

  • RayDi/Context/ProductionContext
  • RayDi/Context/LocalContext
  • RayDi/Context/TestingContext

キャッシュ

RayDi/Context/ProductionContextでは、 apcu拡張が有効な場合インジェクターをキャッシュします。

カスタムコンテキスト

独自のコンテキストが必要になる場合もあります。 組み込みコンテキストを参考にカスタムコンテキストを実装し、RayDi/Context/ContextProviderで利用するようにします。

モジュールのオーバーライド

テストケースによって束縛を変更したい場合があります。 その場合は、Ray\RayDiForLaravel\Testing\OverrideModuleを利用し、テストクラスで$this->overrideModule を呼び出してください。

use Tests\TestCase;

final class HelloTest extends TestCase
{
    use Ray\RayDiForLaravel\Testing\OverrideModule;

    public function testStatusOk(): void
    {
        $this->overrideModule(new MyModule());
    
        $res = $this->get('/hello');

        $res->assertOk();
        $res->assertSeeText('Hello 1 * 2 = 2.');
    }
}

パフォーマンス

DiCompileModuleをインストールすることで、 最適化されたインジェクターが利用され、依存関係エラーは実行時ではなくコンパイル時に報告されます。

RayDi/Context/ProductionContextに対応するRayDi/ProductionModuleでは、DiCompileModuleは既にインストールされています。

デモ

hello-ray-di-for-laravel を確認してください。