このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン 次のリビジョン 両方とも次のリビジョン | ||
apricot:usage:ja:provider [2020/08/28 19:25] y2sunlight [Providerクラス] |
apricot:usage:ja:provider [2020/08/29 20:38] y2sunlight [Providerクラス] |
||
---|---|---|---|
行 1: | 行 1: | ||
- | > 編集中 | ||
- | |||
- | ---- | ||
- | |||
====== Apricot サービスプロバイダー ====== | ====== Apricot サービスプロバイダー ====== | ||
--- // | --- // | ||
行 25: | 行 21: | ||
---- | ---- | ||
- | Apricotでは、DIコンテナーに [[https:// | + | Apricotでは、DIコンテナーに [[https:// |
- | + | ||
- | Apricotのスケルトンでは、サービスプロバイターの簡単な例題を提供しています。 | + | |
\\ | \\ | ||
行 43: | 行 37: | ||
サービスプロバイターは、アプリケーション内の全てのDIコンテナを登録し整理する方法を提供してくれます。また、サービスプロバイダーではサービスが取得された時点で遅延登録されるため、アプリケーションのパフォーマンス向上にも寄与します。 | サービスプロバイターは、アプリケーション内の全てのDIコンテナを登録し整理する方法を提供してくれます。また、サービスプロバイダーではサービスが取得された時点で遅延登録されるため、アプリケーションのパフォーマンス向上にも寄与します。 | ||
- | このサービスプロバイターを作るには、League/ | + | Apricotのスケルトンではサービスプロバイターとして、League/ |
+ | |||
+ | 以下にApricotのスケルトンで初期実装されているProviderクラスの抜粋を示します。 | ||
{{fa> | {{fa> | ||
行 51: | 行 47: | ||
use League\Container\ServiceProvider\AbstractServiceProvider; | use League\Container\ServiceProvider\AbstractServiceProvider; | ||
- | use League\Container\ServiceProvider\BootableServiceProviderInterface; | ||
/** | /** | ||
* Provider class for service | * Provider class for service | ||
*/ | */ | ||
- | class Provider extends AbstractServiceProvider | + | class Provider extends AbstractServiceProvider |
{ | { | ||
/** | /** | ||
- | * 提供される配列は、サービスがこのサービスプロバイダーによって | + | * 提供される配列は、サービスがこのサービスプロバイダーによって提供されていることをコンテナーに知らせるための方法です。 |
- | | + | * このサービスプロバイダーを介して登録されるすべてのサービスには、この配列にエイリアスが追加されている必要があります。 |
- | * このサービスプロバイダーを介して登録されるすべてのサービスには、 | + | |
- | | + | |
* そうでない場合は無視されます。 | * そうでない場合は無視されます。 | ||
* | * | ||
行 73: | 行 66: | ||
/** | /** | ||
- | * ほぼ同じ方法で、このメソッドはコンテナー自体にアクセスでき、コンテナーと | + | * ここでマジックが起こります。メソッド内でコンテナーにアクセスして必要なものを登録または取得できますが、 |
- | * 対話できますが、違いは、コンテナーにサービスプロバイダーを登録するとすぐに | + | |
- | * bootメソッドが呼び出されるということです。つまり、このメソッドのすべてが | + | |
- | * 積極的に読み込まれます。 | + | |
- | * | + | |
- | * インフレクターを適用するか、このサービスプロバイダーからさらにサービス | + | |
- | * プロバイダーを登録する場合は、このような起動可能なサービスプロバイダー | + | |
- | * からのものである必要があります。それ以外の場合は無視されます。 | + | |
- | */ | + | |
- | public function boot() | + | |
- | { | + | |
- | } | + | |
- | + | ||
- | /** | + | |
- | * ここでマジックが起こります。メソッド内でコンテナーにアクセスして | + | |
- | | + | |
- | | + | |
*/ | */ | ||
| | ||
行 95: | 行 73: | ||
// Sample | // Sample | ||
$this-> | $this-> | ||
- | | + | -> |
- | -> | + | |
; | ; | ||
- | |||
$this-> | $this-> | ||
} | } | ||
行 104: | 行 81: | ||
</ | </ | ||
- | このクラスは、名前空間Appの直下に存在し、アプリケーションのモデル及びサービスのマップを提供します。現版のApricotでは、モデルはユーザモデル( User )だけで、サービスについては存在しません。モデルやサービスを追加する場合は、上例に習って適宜追加して下さい。 | + | スケルトンでは[[apricot: |
- | 現版のApricotでは、サービスは存在しませんが、サービス用として以下のフォルダが予約されています。 | + | '' |
- | < | + | サービス(またはモデル)をサービスプロバイターに登録する場合は、上例に習って適宜追加して下さい。League/ |
- | / | + | |
- | </ | + | |
- | + | ||
- | 尚、League/ | + | |
\\ | \\ | ||
- | ===== App\Foundation\Containerクラス ===== | + | ===== Containerクラス ===== |
- | + | ||
- | App\Foundation\Containerクラスは、\League\Container\Container クラスを生成し、Apricotのサービスプロバイダー(Provider)を登録したクラスで、シングルトンとして動作します。 | + | |
- | サービスの使用者は、'' | + | サービスプロバイダーで登録したサービス(またはモデル)を取得するには、'' |
使用法: ** Container:: | 使用法: ** Container:: | ||
行 127: | 行 98: | ||
|mixed get(string $id)|識別子idでコンテナのエントリを検索して返します。| | |mixed get(string $id)|識別子idでコンテナのエントリを検索して返します。| | ||
|bool has(string $id)|コンテナが指定された識別子idのエントリを返すことができる場合はtrueを返します。| | |bool has(string $id)|コンテナが指定された識別子idのエントリを返すことができる場合はtrueを返します。| | ||
- | |||
- | {{fa> | ||
- | <code php Container.php> | ||
- | <?php | ||
- | namespace App\Foundation; | ||
- | |||
- | use Apricot\Foundation\Singleton; | ||
- | use App\Provider; | ||
- | |||
- | /** | ||
- | * Container class for service | ||
- | * | ||
- | * @method static Container getInstance() Gets the Container instance. | ||
- | * @method static mixed get(string $id) Finds an entry of the container by its identifier and returns it. | ||
- | * @method static bool has(string $id) Returns true if the container can return an entry for the given identifier. | ||
- | */ | ||
- | class Container extends Singleton | ||
- | { | ||
- | /** | ||
- | * Create Container instance. | ||
- | * @return \League\Container\Container | ||
- | */ | ||
- | protected static function createInstance() | ||
- | { | ||
- | $container = new \League\Container\Container; | ||
- | $container-> | ||
- | return $container; | ||
- | } | ||
- | } | ||
- | </ | ||
\\ | \\ | ||
- | ===== DIコンテナの使用例 ===== | + | ===== 使用例 ===== |
- | === スタブコントローラ === | + | > TODO |
DIコンテナをテストするために、スタブコントローラを以下のように修正します。 | DIコンテナをテストするために、スタブコントローラを以下のように修正します。 | ||
行 168: | 行 109: | ||
{{fa> | {{fa> | ||
<code php StubController.php> | <code php StubController.php> | ||
- | <?php | + | public function index(int $no=null) |
- | namespace App\Controllers; | + | { |
+ | $title = "Stub {$no}"; | ||
- | use App\Foundation\Container; | ||
- | use App\Foundation\Controller; | ||
- | |||
- | /** | ||
- | * Stub Controller | ||
- | */ | ||
- | class StubController extends Controller | ||
- | { | ||
/** | /** | ||
- | * Index Page for this controller. | + | * @var \App\Services\SampleService $service |
- | * | + | |
- | * @return | + | |
*/ | */ | ||
- | | + | $service |
- | { | + | $count = $service->getUserCount(); |
- | $title = "Stub {$no}"; | + | $messages[] = " |
- | + | ||
- | /* | + | |
- | * Example for Container | + | |
- | * @var \App\Models\User $user | + | |
- | */ | + | |
- | | + | |
- | $userCount | + | |
- | $messages[] = " | + | |
- | | + | |
- | } | + | |
} | } | ||
</ | </ | ||
* '' | * '' | ||
- | * ユーザモデルの '' | ||
* ユーザ数を表示するために、テンプレート変数 '' | * ユーザ数を表示するために、テンプレート変数 '' | ||