thinkphp 5メンツ(Facade)

4674 ワード

ファサード(Facade)
ゲートはコンテナ内のクラスに静的呼び出しインタフェースを提供し、従来の静的メソッド呼び出しよりもテスト性と拡張性が向上し、任意の非静的クラスライブラリにfacadeクラスを定義できます.
システムはすでにほとんどのコアクラスライブラリにFacadeを定義しているので、Facadeを通じてこれらのシステムクラスにアクセスすることができます.もちろん、アプリケーションクラスライブラリに静的エージェントを追加することもできます.
次の例では、app\common\Testクラスを定義すると、helloダイナミックメソッドが含まれます.

helloメソッドを呼び出すコードは、次のようになります.
$test = new \app\common\Test;
echo $test->hello('thinkphp'); //    hello,thinkphp

次に、このクラスに静的エージェントクラスapp\facade\Testを定義します(このクラス名は必ずしもTestクラスと一致する必要はありませんが、通常は管理を容易にするために、名前の統一を維持することをお勧めします).

このクラスライブラリがthink\Facadeを継承する限り、動的クラスapp\common\Testの動的メソッドを静的に呼び出すことができ、例えば、上記のコードを変更することができる.
//                    hello
echo \app\facade\Test::hello('thinkphp');

結果はhello,thinkphpも出力されます.
率直に言って、Facade機能はクラスをインスタンス化せずに静的に呼び出すことができます.getFacadeClassメソッドで静的エージェントを指定するクラスが明示的に指定されていない場合は、呼び出し時に動的にバインドできます.
use app\facade\Test;
use think\Facade;

Facade::bind('app\facade\Test', 'app\common\Test');
echo Test::hello('thinkphp');
bindメソッドは、バッチ・バインディングをサポートするため、適用される共通関数ファイルでバインディング操作を統一できます.たとえば、次のようにします.
Facade::bind([
	'app\facade\Test' => 'app\common\Test',
    'app\facade\Info' => 'app\common\Info',
]);

コアFacadeクラスライブラリ
システムは内蔵の共通クラスライブラリにFacadeクラスライブラリを定義し、以下を含む.
クラスライブラリ
Facadeクラス
think\App
think\facade\App
think\Build
think\facade\Build
think\Cache
think\facade\Cache
think\Config
think\facade\Config
think\Cookie
think\facade\Cookie
think\Debug
think\facade\Debug
think\Env
think\facade\Env
think\Hook
think\facade\Hook
think\Lang
think\facade\Lang
think\Log
think\facade\Log
think\Middleware
think\facade\Middleware
think\Request
think\facade\Request
think\Response
think\facade\Response
think\Route
think\facade\Route
think\Session
think\facade\Session
think\Url
think\facade\Url
think\Validate
think\facade\Validate
think\View
think\facade\View
インスタンス化する必要がなく、メソッド呼び出しを容易に行うことができます.たとえば、次のようになります.
use think\facade\Cache;

Cache::set('name','value');
echo Cache::get('name');
think\Dbクラスの実装は本来Facadeメカニズムに類似しているので,静的エージェントを行う必要がなく静的メソッド呼び出しを用いることができる(正確にはDbクラスはメソッドがなく,いずれも呼び出しのQueryクラスのメソッドである).
依存注入を行う場合は、タイプコンストレイントとしてFacadeクラスを使用しないで、元のダイナミッククラスを使用することをお勧めします.次は誤った使い方です.

次の方法を使用します.

システムクラスライブラリをより容易に使用するために、システムはまた、これらの一般的なコアクラスライブラリのFacadeクラスにクラスライブラリ別名を登録し、静的呼び出しを行うときに簡略化された別名を直接使用して呼び出すことができる.
別名クラス
対応するFacadeクラス
App
think\facade\App
Build
think\facade\Build
Cache
think\facade\Cache
Config
think\facade\Config
Cookie
think\facade\Cookie
Db
think\Db
Debug
think\facade\Debug
Env
think\facade\Env
Hook
think\facade\Hook
Lang
think\facade\Lang
Log
think\facade\Log
Middleware
think\facade\Middleware
Request
think\facade\Request
Response
think\facade\Response
Route
think\facade\Route
Session
think\facade\Session
Url
think\facade\Url
Validate
think\facade\Validate
View
think\facade\View
したがって、前のコードは
\Cache::set('name','value');
echo \Cache::get('name');

Facadeクラスはインスタンス化されたinstanceメソッドを定義し、クラスにも定義があれば失効します.