ファサード


ファサードと補助関数の比較

ファサードを使用する場合

ファサードには多くの利点があり、長いクラス名を手動で挿入したり構成したりする必要がなくなる、シンプルで覚えやすい構文が提供されます。さらに、PHP 静的メソッドへの独自の呼び出しにより、テストが非常に簡単になります。

ただし、ファサードを使用する場合、特別な注意が必要な場所がいくつかあります。ファサードを使用する場合の主な危険は、クラスの範囲が拡大することです。ファサードの使用は非常に簡単で、注入の必要がないため、単一クラスで誤って多くのファサードを使用し、クラスがますます大きくなる可能性があります。ただし、依存関係注入を使用する場合、使用するクラスが増えるほど構築メソッドが長くなり、視覚的にはこのクラスが少し大きくなっていることがわかります。したがって、Facade を使用する場合は、クラスのスコープを短く保つためにクラスのサイズの制御に特に注意してください。

{ヒント} Laravel と対話するサードパーティの拡張機能パッケージを開発する場合、Facade を使用する代わりに Laravel コントラクトを挿入することが最善です。拡張パッケージは Laravel の外部で構築されるため、Laravel ファサードを使用してヘルパー関数をテストすることはできません

##ファサードと依存関係のインジェクションの比較

依存関係注入の主な利点の 1 つは、注入されたクラスの実装を交換できることです。モックまたはスタブを挿入し、スタブでさまざまなメソッドをアサートできるため、テスト時に非常に便利です。

通常、真の静的メソッドをモックしたりスタブしたりすることは不可能です。ただし、Facade は動的メソッドを使用して、サービス コンテナーで解析されたオブジェクト メソッドの呼び出しをプロキシします。注入されたクラス インスタンスをテストするのと同じように、Facade をテストすることもできます。たとえば、次のルートのように:

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 のキャッシュ システムが呼び出されます。このコードを参照すると、静的メソッド getCache クラスで呼び出されていると想定できます。

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\Auth\Passwords\PasswordBrokerキューIlluminate\Queue\QueueManagerキュー (インスタンス)Illuminate\Contracts\Queue\Queueキュー (基本クラス)Illuminate\Queue\QueueリダイレクトIlluminate\Routing\RedirectorRedisIlluminate\Redis\RedisManagerRedis (インスタンス)Illuminate\Redis\Connections\ConnectionRequest Illuminate\Http\Request
ファサードクラスサービス容器の決定
アプリIlluminate\Foundation\Applicationapp
ArtisanIlluminate\Contracts\Console\Kernelartisan
AuthIlluminate\Auth\AuthManagerauth
認証 (インスタンス)Illuminate\Contracts\Auth\Guardauth.driver
BladeIlluminate\View\Compilers\BladeCompilerblade.compiler
Broadcast Illuminate\Contracts\Broadcasting\Factory
Broadcast (インスタンス)Illuminate\Contracts\Broadcasting\Broadcaster
バスイルミネート\契約\バス\ディスパッチャー
キャッシュIlluminate\Cache\CacheManagercache
キャッシュ (インスタンス)Illuminate\Cache\Repository キャッシュ.ストア
ConfigIlluminate\Config\Repositoryconfig
Cookie Illuminate\Cookie\CookieJarcookie
CryptIlluminate\Encryption\Encrypterencrypter
DBIlluminate\Database\DatabaseManagerdb
##DB (インスタンス)Illuminate\Database\Connectiondb.connection
イベント Illuminate\Events\Dispatcherevents
FileIlluminate\Filesystem\Filesystemfiles
GateIlluminate\Contracts\Auth\Access\Gate
ハッシュIlluminate\Contracts\Hashing\Hasherハッシュ
Lang Illuminate\Translation\Translatortranslator
LogIlluminate\Log\LogManager## #ログ#########
メールイルミネート\メール\メーラーメーラー
通知 Illuminate\Notifications\ChannelManager
PasswordIlluminate\Auth\Passwords\PasswordBrokerManagerauth.password
auth.password.broker
キュー
queue.connection
リダイレクト
redis
redis.connection
request
ResponseIlluminate\Contracts\Routing\ResponseFactory
レスポンス (インスタンス)Illuminate\ Http\Response
RouteIlluminate\Routing\Routerrouter
スキーマIlluminate\Database\Schema\Builder
SessionIlluminate\Session \SessionManagersession
セッション (インスタンス)Illuminate\Session\Storesession.store
ストレージIlluminate\Filesystem\FilesystemManagerファイルシステム
ストレージ (インスタンス)Illuminate\Contracts\Filesystem\Filesystemfilesystem.disk
URLIlluminate\Routing\UrlGeneratorurl
ValidatorIlluminate\Validation\Factoryvalidator
Validator (インスタンス)Illuminate\Validation\Validator
ViewIlluminate\View\Factoryview
ビュー (インスタンス) Illuminate\View\View
この記事は、LearnKu.com Web サイトで初めて公開されました。