内容へ移動
Ground Sunlight
Windowsで作る - PHPプログラミングの開発環境
ユーザ用ツール
ログイン
サイト用ツール
検索
ツール
文書の表示
以前のリビジョン
バックリンク
最近の変更
メディアマネージャー
サイトマップ
ログイン
>
最近の変更
メディアマネージャー
サイトマップ
トレース:
•
メインメニュー
•
Mroonga
•
WSL2 ディストリビューションの複製
apricot:usage:ja:provider
この文書は読取専用です。文書のソースを閲覧することは可能ですが、変更はできません。もし変更したい場合は管理者に連絡してください。
====== Apricot サービスプロバイダー ====== --- //[[http://www.y2sunlight.com|y2sunlight]] 2020-07-29// [[apricot:usage:ja|Apricot Document に戻る]] 目次 * [[apricot:usage:ja:features|Apricot 特徴と概要]] * [[apricot:usage:ja:config|Apricot 配置と構成]] * [[apricot:usage:ja:errors-logging|Apricot ログとエラー処理]] * [[apricot:usage:ja:http|Apricot リクエストとレスポンス]] * [[apricot:usage:ja:frontend|Apricot フロントエンド]] * [[apricot:usage:ja:database|Apricot データベース]] * [[apricot:usage:ja:model|Apricot モデルとサービス]] * [[apricot:usage:ja:middleware|Apricot ミドルウェア]] * [[apricot:usage:ja:controller|Apricot コントローラ]] * [[apricot:usage:ja:validation|Apricot バリデーション]] * Apricot サービスプロバイダー * [[apricot:usage:ja:authentication|Apricot ユーザ認証]] * [[apricot:usage:ja:utility|Apricot ユーティリティ]] ---- Apricotでは、DIコンテナーに [[https://github.com/thephpleague/container|League/Container]] を使用しています。Apricotのスケルトンでは、League/Container のサービスプロバイダー機能を利用して、サービス(またはモデルなどのクラスも含まれる)を登録することができます。サービスはアプリレーション全体で共有できます。即ちシングルトンとして利用できます。 \\ ===== DIコンテナ ===== DIコンテナを使用することで、サービスとその依存関係を登録しておいて後で取得することができます。例えば、サービスAがモデルBとモデルCを使用しているような場合、サービスコンテナにサービスAを要求すると、自動的にモデルBとCを生成し、それらをサービスAのコンストラクタに与えてサービスAを生成してくれます。これがDIコンテナです。 >ここでは、League/Container の慣例に従いDIコンテナと呼んでいますが、これはサービスコンテナと呼ばれることもあります。 \\ ===== Providerクラス ===== サービスプロバイターは、アプリケーション内の全てのDIコンテナを登録し整理する方法を提供してくれます。また、サービスプロバイダーではサービスが取得された時点で遅延登録されるため、アプリケーションのパフォーマンス向上にも寄与します。 Apricotのスケルトンではサービスプロバイターとして、League/Container が提供している基本サービスプロバイダークラス( ''AbstractServiceProvider'' )を拡張した ''App\Provider'' クラスを定義しています。このクラスは、''/your-project/app'' に配置されています。 以下にApricotのスケルトンで初期実装されているProviderクラスの抜粋を示します。 {{fa>folder-open-o}} ** /your-project/app ** <code php Provider.php> <?php namespace App; use League\Container\ServiceProvider\AbstractServiceProvider; /** * Provider class for service */ class Provider extends AbstractServiceProvider { /** * 提供される配列は、サービスがこのサービスプロバイダーによって提供されていることをコンテナーに知らせるための方法です。 * このサービスプロバイダーを介して登録されるすべてのサービスには、この配列にエイリアスが追加されている必要があります。 * そうでない場合は無視されます。 * * @var array */ protected $provides = [ // Sample 'SampleService', ]; /** * ここでマジックが起こります。メソッド内でコンテナーにアクセスして必要なものを登録または取得できますが、 * このメソッド内に登録されたすべてのエイリアスは '$provides' 配列で宣言する必要があります。 */ public function register() { // Sample $this->getContainer() ->add('SampleService', \App\Services\SampleService::class, true) ->addArgument('User') ; $this->getContainer()->add('User', \App\Models\User::class); } } </code> スケルトンでは[[apricot:usage:ja:model#サービス|サービスのサンプル]]として ''SampleService'' クラスを提供しています。このクラスはコンストラクタに''User'' モデルを与えて作ります。 ''SampleService'' クラスをサービスプロバイターに登録するには、コンテナの''add()'' メソッドを使用し、その引数は、エイリアス名、登録するクラス、そして共有フラグです。共有フラグがtrueの場合、このクラスはシングルトンとして動作します。''addArgument()'' メソッドは登録するクラスのコンストラクタに与える引数を定義します。この引数もまた''add()'' メソッドで登録しておく必要があります。 サービス(またはモデル)をサービスプロバイターに登録する場合は、上例に習って適宜追加して下さい。League/Container のサービスプロバイダーについての詳細は[[https://container.thephpleague.com/3.x/service-providers/|こちら]]をご覧ください。 \\ ===== Containerクラス ===== サービスプロバイダーで登録したサービス(またはモデル)を取得するには、''App\Foundation\Container'' クラスを使用します。このクラスは、''\League\Container\Container'' をシングルトンにしたもので、以下のメソッドがあります。これらのメソッドは [[https://www.php-fig.org/psr/psr-11/|PSR-11]] に準拠しています。 使用法: ** Container::{メソッド} ** ^メソッド^機能^ |mixed get(string $id)|識別子idでコンテナのエントリを検索して返します。| |bool has(string $id)|コンテナが指定された識別子idのエントリを返すことができる場合はtrueを返します。| \\ ===== 使用例 ===== スタブコントローラのindexアクションには、DIコンテナの使用例があります。 {{fa>folder-open-o}} ** /your-project/app/Controllers ** <code php StubController.php> public function index(int $no=null) { $title = "Stub {$no}"; /** * @var \App\Services\SampleService $service */ $service = Container::get('SampleService'); $count = $service->getUserCount(); $messages[] = "Number of registered users : {$count}"; return render('stub',['title'=>$title,'messages'=>$messages]); } </code> ''Container'' シングルトンの ''get()'' メソッドで、サービスプロバイダーでシングルトンとして登録した ''SampleService'' のインスタンスを取得します。このインスタンスはアプリケーション全体で共有されます。 \\
apricot/usage/ja/provider.txt
· 最終更新: 2020/09/03 13:46 by
y2sunlight
ページ用ツール
文書の表示
以前のリビジョン
バックリンク
文書の先頭へ