ファサード
ファサードと補助関数の比較
- ファサードの動作原理
- はじめに
- ファサードは、アプリケーションのサービス コンテナに「静的」インターフェイスを提供します。 Laravel には、ほとんどの機能へのアクセスを提供する多くのファサードが付属しています。 Laravel Facade は実際には、サービス コンテナ内の基礎となるクラスの「静的プロキシ」であり、従来の静的メソッドと比較して、より柔軟で、テストが容易で、使用時により洗練された構文を提供できます。 すべての Laravel ファサードは、
- Illuminate\Support\Facades 名前空間で定義されます。したがって、Facade を簡単に使用できます。
use Illuminate\Support\Facades\Cache; Route::get('/cache', function () { return Cache::get('key'); });
Laravel ドキュメントには、Facade を使用してフレームワークのさまざまな機能を示すサンプル コードが多数あります。
ファサードを使用する場合
ファサードには多くの利点があり、長いクラス名を手動で挿入したり構成したりする必要がなくなる、シンプルで覚えやすい構文が提供されます。さらに、PHP 静的メソッドへの独自の呼び出しにより、テストが非常に簡単になります。
ただし、ファサードを使用する場合、特別な注意が必要な場所がいくつかあります。ファサードを使用する場合の主な危険は、クラスの範囲が拡大することです。ファサードの使用は非常に簡単で、注入の必要がないため、単一クラスで誤って多くのファサードを使用し、クラスがますます大きくなる可能性があります。ただし、依存関係注入を使用する場合、使用するクラスが増えるほど構築メソッドが長くなり、視覚的にはこのクラスが少し大きくなっていることがわかります。したがって、Facade を使用する場合は、クラスのスコープを短く保つためにクラスのサイズの制御に特に注意してください。
##ファサードと依存関係のインジェクションの比較依存関係注入の主な利点の 1 つは、注入されたクラスの実装を交換できることです。モックまたはスタブを挿入し、スタブでさまざまなメソッドをアサートできるため、テスト時に非常に便利です。 通常、真の静的メソッドをモックしたりスタブしたりすることは不可能です。ただし、Facade は動的メソッドを使用して、サービス コンテナーで解析されたオブジェクト メソッドの呼び出しをプロキシします。注入されたクラス インスタンスをテストするのと同じように、Facade をテストすることもできます。たとえば、次のルートのように:{ヒント} Laravel と対話するサードパーティの拡張機能パッケージを開発する場合、Facade を使用する代わりに Laravel コントラクトを挿入することが最善です。拡張パッケージは Laravel の外部で構築されるため、Laravel ファサードを使用してヘルパー関数をテストすることはできません
use Illuminate\Support\Facades\Cache; Route::get('/cache', function () { return Cache::get('key'); });検証するパラメータを使用して次のテスト コードを作成できます。
Cache::get メソッド:
use Illuminate\Support\Facades\Cache; /** * 一个基础功能的测试。 * * @return void */ public function testBasicExample(){ Cache::shouldReceive('get') ->with('key') ->andReturn('value'); $this->visit('/cache') ->see('value'); }ファサードと補助関数の比較ファサードに加えて、Laravel には、ビューの生成などの一般的な機能を実装するためのさまざまな「補助関数」も含まれています。 , イベントをトリガーしたり、タスクをスケジュールしたり、HTTP 応答を送信したりできます。多くの補助機能には、対応するファサードがあります。たとえば、次のファサードとヘルパー関数は同じ効果があります:
return View::make('profile');return view('profile');ファサードとヘルパー関数の間に実際の違いはありません。ヘルパー関数を使用すると、対応する Facade と同じようにテストできます。たとえば、次のルート:
Route::get('/cache', function () { return cache('key');});は最下層で実装され、補助関数
cache が実際に
Cache# の get
メソッドを呼び出します。 ## ファサード。したがって、ヘルパー関数を使用している場合でも、予期されるパラメーターを使用して次のテスト コードを作成することでメソッドを検証できます。 #
Facade の動作原理
Laravel アプリケーションでは、Facade はコンテナからオブジェクトにアクセスできるクラスです。コアコンポーネントは Facade
クラスです。 Laravel 独自のファサードであっても、カスタム ファサードであっても、それらはすべて Illuminate\Support\Facades\Facade
クラスから継承します。
Facade
基本クラスは __callStatic()
マジック メソッドを使用します。このメソッドはオブジェクトがコンテナから解析されるまで呼び出されません。以下の例では、Laravel のキャッシュ システムが呼び出されます。このコードを参照すると、静的メソッド get
が Cache
クラスで呼び出されていると想定できます。
use Illuminate\Support\Facades\Cache; /** * 一个基础功能的测试用例。 * * @return void */ public function testBasicExample(){ Cache::shouldReceive('get') ->with('key') ->andReturn('value'); $this->visit('/cache') ->see('value'); }
上記のコードでは、「インポート」していることに注意してください。 " キャッシュ
ファサード。このファサードは、Illuminate\Contracts\Cache\Factory
インターフェイスの基礎となる実装にアクセスするためのプロキシとして機能します。 Facade を使用して行う呼び出しはすべて、Laravel キャッシュ サービスの基礎となるインスタンスに渡されます。
Illuminate\Support\Facades\Cache
クラスを見ると、クラス内に get
静的メソッドがないことがわかります:
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Cache; class UserController extends Controller{ /** * 显示给定用户的信息。 * * @param int $id * @return Response */ public function showProfile($id) { $user = Cache::get('user:'.$id); return view('profile', ['user' => $user]); } }
Cache
Facade は Facade クラスを継承し、getFacadeAccessor()
メソッドを定義します。このメソッドの機能は、サービス コンテナ バインディングの名前を返すことです。ユーザーが Cache
ファサードの静的メソッドを呼び出すと、Laravel はサービスコンテナからの cache
バインディングを解決し、オブジェクトは要求されたメソッド (この場合は get です) を実行します。 ### 方法)。
Podcast モデルに
publish メソッドがあるとします。ただし、Podcast を公開するには、
Publisher インスタンスを注入する必要があります。
class Cache extends Facade{ /** * 获取组件的注册名称。 * * @return string */ protected static function getFacadeAccessor() { return 'cache'; } }パブリッシャーの実装をメソッドに注入すると、注入されたパブリッシャーをモックできるため、このメソッドを簡単にテストできます。 。ただし、
publish メソッドを呼び出すたびに、パブリッシャー インスタンスを渡す必要があります。ライブ ファサードを使用すると、
Publisher インスタンスを明示的に渡すことなく、同じテスト容易性を維持できます。リアルタイムの
Facade を生成するには、インポートされたクラスの名前空間にファサードを追加します。
<?php namespace App; use App\Contracts\Publisher; use Illuminate\Database\Eloquent\Model; class Podcast extends Model{ /** * 发布 Podcast。 * * @param Publisher $publisher * @return void */ public function publish(Publisher $publisher) { $this->update(['publishing' => now()]); $publisher->publish($this); } }リアルタイム ファサードを使用する場合、パブリッシャーの実装には ## を使用してプレフィックスが付けられます。 #Facades
サービス コンテナの問題を解決するために後で表示されるインターフェイスまたはクラス名の一部。テストする場合、Laravel の組み込みファサード テスト ヘルパー関数を使用して、このメソッド呼び出しをシミュレートできます: <?php
namespace App;
use Facades\App\Contracts\Publisher;
use Illuminate\Database\Eloquent\Model;
class Podcast extends Model{
/**
* 发布 Podcast。
*
* @return void
*/
public function publish()
{
$this->update(['publishing' => now()]);
Publisher::publish($this);
}
}
Facade クラス リファレンス
以下に、各 Facade クラスとそれに対応する基礎となるクラスを示します。これは、特定の Facade クラスの API ドキュメントを検索するツールです。サービス コンテナー バインディングの重要な情報も含まれます。
ファサード | クラス | サービス容器の決定 |
---|---|---|
アプリ | Illuminate\Foundation\Application | app |
Artisan | Illuminate\Contracts\Console\Kernel | artisan |
Auth | Illuminate\Auth\AuthManager | auth |
認証 (インスタンス) | Illuminate\Contracts\Auth\Guard | auth.driver |
Blade | Illuminate\View\Compilers\BladeCompiler | blade.compiler |
Broadcast | Illuminate\Contracts\Broadcasting\Factory | |
Broadcast (インスタンス) | Illuminate\Contracts\Broadcasting\Broadcaster | |
バス | イルミネート\契約\バス\ディスパッチャー | |
キャッシュ | Illuminate\Cache\CacheManager | cache |
キャッシュ (インスタンス) | Illuminate\Cache\Repository | キャッシュ.ストア |
Config | Illuminate\Config\Repository | config |
Cookie | Illuminate\Cookie\CookieJar | cookie |
Crypt | Illuminate\Encryption\Encrypter | encrypter |
DB | Illuminate\Database\DatabaseManager | db |
##DB (インスタンス) | Illuminate\Database\Connection | db.connection |
イベント | Illuminate\Events\Dispatcher | events |
File | Illuminate\Filesystem\Filesystem | files |
Gate | Illuminate\Contracts\Auth\Access\Gate | |
ハッシュ | Illuminate\Contracts\Hashing\Hasher | ハッシュ |
Lang | Illuminate\Translation\Translator | translator |
Log | Illuminate\Log\LogManager | ## #ログ######### |
メール | イルミネート\メール\メーラー | メーラー |
通知 | Illuminate\Notifications\ChannelManager | |
Password | Illuminate\Auth\Passwords\PasswordBrokerManager | auth.password |
Illuminate\Auth\Passwords\PasswordBroker | auth.password.broker
| |
Illuminate\Queue\QueueManager | キュー
| |
Illuminate\Contracts\Queue\Queue | queue.connection
| |
Illuminate\Queue\Queue | ||
Illuminate\Routing\Redirector | リダイレクト | |
Illuminate\Redis\RedisManager | redis
| |
Illuminate\Redis\Connections\Connection | redis.connection
| |
Illuminate\Http\Request | request
| |
Response | Illuminate\Contracts\Routing\ResponseFactory | |
レスポンス (インスタンス) | Illuminate\ Http\Response | |
Route | Illuminate\Routing\Router | router |
スキーマ | Illuminate\Database\Schema\Builder | |
Session | Illuminate\Session \SessionManager | session |
セッション (インスタンス) | Illuminate\Session\Store | session.store |
ストレージ | Illuminate\Filesystem\FilesystemManager | ファイルシステム |
ストレージ (インスタンス) | Illuminate\Contracts\Filesystem\Filesystem | filesystem.disk |
URL | Illuminate\Routing\UrlGenerator | url |
Validator | Illuminate\Validation\Factory | validator |
Validator (インスタンス) | Illuminate\Validation\Validator | |
View | Illuminate\View\Factory | view |
ビュー (インスタンス) | Illuminate\View\View |