외관


Fa 보조 기능과 케이드 비교

  • 파사드 작동 원리
  • Real-time Facades
    • Facade 참조 클래스
  • Introduction
  • Facades 서비스 애플리케이션 컨테이너는 "정적" 인터페이스를 제공합니다. Laravel에는 대부분의 기능에 대한 액세스를 제공하는 많은 Facade가 포함되어 있습니다. Laravel Facades는 실제로 서비스 컨테이너의 기본 클래스에 대한 "정적 프록시"입니다. 전통적인 정적 방법과 비교하여 사용 시 더 유연하고, 테스트하기 쉽고, 더 우아한 구문을 제공할 수 있습니다. 모든 Laravel Facade는
  • 네임스페이스 아래에 정의됩니다. 따라서 우리는 Facade를 쉽게 사용할 수 있습니다:
  • use Illuminate\Support\Facades\Cache;
    Route::get('/cache', function () {  
      return Cache::get('key');
      });
    Laravel 문서에는 프레임워크의 다양한 기능을 보여주기 위해 Facade를 사용하는 많은 샘플 코드가 있습니다.

Facade를 사용하는 경우

Facade는 긴 클래스 이름을 수동으로 삽입하거나 구성할 필요가 없는 간단하고 기억하기 쉬운 구문을 제공합니다. 또한, PHP 정적 메소드에 대한 고유한 호출로 인해 테스트가 매우 쉬워집니다.

그러나 Facades를 사용할 때 특별한 주의가 필요한 곳이 있습니다. Facades를 사용할 때 가장 큰 위험은 클래스 범위의 확장입니다. Facade는 사용이 매우 간단하고 주입이 필요하지 않기 때문에 실수로 단일 클래스에서 많은 Facade를 사용하여 클래스가 점점 더 커지게 될 수 있습니다. 그러나 종속성 주입을 사용하는 경우 더 많은 클래스를 사용할수록 생성자가 길어집니다. 시각적으로 보면 이 클래스가 약간 부피가 크다는 것을 알 수 있습니다. 따라서 Facades를 사용할 때는 클래스의 범위를 짧게 유지하기 위해 클래스의 크기를 제어하는 ​​데 특별한 주의를 기울여야 합니다.

{tip} Laravel과 상호 작용하는 타사 확장 패키지를 개발할 때 Facades를 사용하는 대신 Laravel 계약을 삽입하는 것이 가장 좋습니다. 확장 기능은 Laravel 외부에 구축되었기 때문에 Laravel Facades를 사용하여 도우미 기능을 테스트할 수 없습니다.

종속성 주입에 대한 Facades

의존성 주입의 주요 이점 중 하나는 주입된 구현을 교체할 수 있다는 것입니다. 클래스. 모의 또는 스텁을 삽입하고 스텁에 다양한 메서드를 어설션할 수 있으므로 테스트할 때 매우 유용합니다.

일반적으로 진정한 정적 메서드는 모의 또는 스텁이 불가능합니다. 그러나 Facade는 동적 메소드를 사용하여 서비스 컨테이너에서 구문 분석된 객체 메소드의 호출을 프록시합니다. 주입된 클래스 인스턴스를 테스트하는 것처럼 Facade도 테스트할 수 있습니다. 예를 들어 다음 경로와 같습니다.

use Illuminate\Support\Facades\Cache;
Route::get('/cache', function () {  
  return Cache::get('key');
 });

Cache::get 메서드를 확인하기 위해 예상되는 매개변수를 사용하여 다음 테스트 코드를 작성할 수 있습니다.Cache::get 方法:

use Illuminate\Support\Facades\Cache;
/**
 * 一个基础功能的测试。
 *
 * @return void
 */
 public function testBasicExample(){ 
    Cache::shouldReceive('get')   
          ->with('key')     
          ->andReturn('value');  
    $this->visit('/cache')   
        ->see('value');
    }

Facades 相较于辅助函数

除了 Facades,Laravel 还包含各种 『辅助函数』 来实现这些常用功能,比如生成视图、触发事件、任务调度或者发送 HTTP 响应。许多辅助函数都有与之对应的 Facades 。例如,下面这个 Facades 和辅助函数的作用是一样的:

return View::make('profile');return view('profile');

Facade 和辅助函数之间没有实际的区别。当你使用辅助函数时,你可以像测试相应的 Facade 那样进行测试。例如,下面的路由:

Route::get('/cache', function () {    return cache('key');});

在底层实现,辅助函数 cache 实际是调用 Cache 这个 Facade 的 get

use Illuminate\Support\Facades\Cache;
/**
 * 一个基础功能的测试用例。
 *
 * @return void
 */
 public function testBasicExample(){ 
    Cache::shouldReceive('get')  
           ->with('key')    
           ->andReturn('value'); 
    $this->visit('/cache')  
        ->see('value');
     }

Facades 도우미 기능과 비교
Facades 외에도 Laravel에는 이러한 공통 기능을 구현하기 위한 다양한 "도우미 기능"이 포함되어 있습니다. 예를 들어 보기 생성, 이벤트 트리거, 작업 예약 또는 HTTP 응답 전송 등이 있습니다. 많은 보조 기능에는 해당 Facade가 있습니다. 예를 들어, 다음 Facades와 도우미 함수는 동일한 작업을 수행합니다. 🎜
<?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]);  
          }
      }
🎜 Facades와 도우미 함수 사이에는 실질적인 차이가 없습니다. 도우미 기능을 사용하면 해당 Facade와 마찬가지로 테스트할 수 있습니다. 예를 들어, 다음 경로: 🎜
class Cache extends Facade{   
    /**
     * 获取组件的注册名称。
     *
     * @return string
     */  
       protected static function getFacadeAccessor() { 
            return 'cache'; 
        }
     }
🎜는 하단에 구현되어 있으며 보조 함수 cache는 실제로 Cacheget 메서드를 호출합니다. 정면. 따라서 도우미 함수를 사용하더라도 메소드를 검증할 것으로 예상되는 매개변수를 사용하여 다음 테스트 코드를 작성할 수 있습니다. 🎜
<?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);   
             }
        }
🎜🎜🎜🎜🎜🎜

Facade 작동 방식

Laravel 애플리케이션에서 Facade는 컨테이너의 객체에 액세스할 수 있는 클래스입니다. 핵심 구성요소는 Facade 클래스입니다. Laravel의 자체 Facades이든 사용자 정의 Facades이든 모두 IlluminateSupportFacadesFacade 클래스에서 상속됩니다. Facade 类。不管是 Laravel 自带的 Facades,还是自定义的 Facades,都继承自 IlluminateSupportFacadesFacade 类。

Facade 基类使用了__callStatic() 魔术方法,直到对象从容器中被解析出来后,才会进行调用。在下面的例子中,调用了 Laravel 的缓存系统。通过浏览这段代码,可以假定在 Cache 类中调用了静态方法 get

<?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);  
            }
       }

注意在上面这段代码中,我们『导入』了 Cache Facade。这个 Facade 作为访问 IlluminateContractsCacheFactory 接口底层实现的代理。我们使用 Facade 进行的任何调用都将传递给 Laravel 缓存服务的底层实例。

如果我们看一下 IlluminateSupportFacadesCache 这个类,你会发现类中根本没有 get 这个静态方法:

<?php
  namespace Tests\Feature;use App\Podcast;
  use Tests\TestCase;use Facades\App\Contracts\Publisher;
  use Illuminate\Foundation\Testing\RefreshDatabase;
  class PodcastTest extends TestCase{  
    use RefreshDatabase;   
    /**
     * 一个测试演示。
     *
     * @return void
     */  
       public function test_podcast_can_be_published()  
         {    
             $podcast = factory(Podcast::class)->create(); 
             Publisher::shouldReceive('publish')->once()->with($podcast);  
             $podcast->publish(); 
            }
      }

Cache Facade 继承了 Facade 类,并且定义了 getFacadeAccessor() 方法。这个方法的作用是返回服务容器绑定的名称。当用户调用 Cache Facade 中的任何静态方法时,Laravel 会从 服务容器 中解析 cache 绑定以及该对象运行所请求的方法(在这个例子中就是 get 方法)。

实时 Facades

使用实时 Facades,你可以将应用程序中的任何类视为 Facade。为了说明这是如何使用的,我们来看看另一种方法。例如,假设我们的 Podcast 模型有一个 publish 方法。然而,为了发布 Podcast,我们需要注入一个 Publisher 实例:

rrreee

将发布者的实现注入到该方法中,我们可以轻松地测试这种方法,因为我们可以模拟注入的发布者。但是,它要求我们每次调用 publish 方法时都要传递一个发布者实例。使用实时的 Facades,我们可以保持同样的可测试性,而不需要显式地通过 Publisher 实例。要生成实时 Facade,请在导入类的名称空间中加上 Facades:

rrreee

当使用实时 Facade 时,发布者实现将通过使用 Facades

Facade 기본 클래스는 객체가 컨테이너에서 구문 분석될 때까지 호출되지 않는 __callStatic() 매직 메서드를 사용합니다. 아래 예에서는 Laravel의 캐싱 시스템이 호출됩니다. 이 코드를 탐색하면 정적 메소드 getCache 클래스에서 호출된다고 가정할 수 있습니다.

rrreee위 코드에서 <를 "가져옵니다". 코드 >캐시 외관. 이 Facade는 IlluminateContractsCacheFactory 인터페이스의 기본 구현에 액세스하기 위한 프록시 역할을 합니다. Facade를 사용하여 수행하는 모든 호출은 Laravel 캐싱 서비스의 기본 인스턴스로 전달됩니다.

IlluminateSupportFacadesCache 클래스를 살펴보면 클래스에 get 정적 메서드가 없다는 것을 알 수 있습니다:
rrreee
Cache Facade Facade 클래스를 상속하고 getFacadeAccessor() 메서드를 정의합니다. 이 메소드의 기능은 서비스 컨테이너 바인딩의 이름을 반환하는 것입니다. 사용자가 Cache Facade에서 정적 메서드를 호출하면 Laravel은 서비스 컨테이너에서 cache 바인딩을 확인하고 객체는 요청된 메서드(이 경우 get)를 실행합니다. 메소드). 🎜🎜🎜🎜
🎜🎜실시간 Facades🎜🎜실시간 Facades를 사용하면 어떤 수업이라도 추가할 수 있습니다 귀하의 응용 프로그램에서 외관으로 간주됩니다. 이것이 어떻게 사용되는지 설명하기 위해 다른 방법을 살펴보겠습니다. 예를 들어 Podcast 모델에 publish 메소드가 있다고 가정해 보겠습니다. 그러나 팟캐스트를 게시하려면 Publisher 인스턴스를 삽입해야 합니다. 🎜rrreee🎜 게시자 구현을 메서드에 삽입하면 삽입된 게시를 모의할 수 있으므로 이 접근 방식을 쉽게 테스트할 수 있습니다. 그러나 publish 메소드를 호출할 때마다 게시자 인스턴스를 전달해야 합니다. 라이브 Facade를 사용하면 Publisher 인스턴스를 명시적으로 전달하지 않고도 동일한 테스트 가능성을 유지할 수 있습니다. 라이브 Facade를 생성하려면 가져온 클래스의 네임스페이스에 Facades를 추가하세요: 🎜rrreee🎜 라이브 Facade를 사용할 때 게시자 구현은 Facades 접두사 부분을 사용하여 나타납니다. 서비스 컨테이너의 문제를 해결하기 위해 인터페이스 또는 클래스 이름을 변경합니다. 테스트할 때 Laravel에 내장된 Facade 테스트 도우미 함수를 사용하여 이 메소드 호출을 시뮬레이션할 수 있습니다: 🎜rrreee🎜🎜🎜🎜🎜🎜

Facade 클래스 참조

아래에서 각 Facade 클래스와 해당 기본 클래스를 찾을 수 있습니다. 이것은 특정 Facade 클래스에 대한 API 문서를 찾는 도구입니다. 서비스 컨테이너 바인딩에 대한 주요 정보도 포함되어 있습니다.

🎜Artisan🎜🎜IlluminateContractsConsoleKernel🎜🎜artisan🎜🎜🎜🎜Auth🎜🎜IlluminateAuthAuthManager🎜🎜auth🎜🎜🎜🎜Auth(인스턴스)🎜🎜IlluminateContractsAuthGuard🎜🎜auth.driver🎜🎜🎜🎜Blade 🎜🎜 IlluminateViewCompilersBladeCompiler🎜🎜blade.compiler🎜🎜🎜🎜Broadcast🎜🎜IlluminateContractsBroadcastingFactory🎜🎜 🎜🎜🎜🎜Broadcast(인스턴스)🎜🎜IlluminateContractsBroadcastingBroadcaster 🎜🎜 🎜🎜🎜🎜Bus🎜🎜IlluminateContractsBusDispatcher🎜🎜 🎜🎜🎜🎜 Cache🎜🎜IlluminateCacheCacheManager🎜🎜캐시🎜🎜🎜🎜Cache(인스턴스)🎜🎜IlluminateCacheRepository🎜🎜cache.store🎜🎜🎜Cookie🎜🎜IlluminateCookieCookieJar🎜🎜쿠키🎜🎜🎜🎜Crypt🎜🎜IlluminateEn cryptionEncrypter🎜🎜암호화기🎜🎜🎜🎜DB🎜🎜IlluminateDatabaseDatabaseManager🎜🎜db🎜🎜🎜🎜DB(인스턴스)🎜🎜IlluminateDatabaseConnection🎜🎜db.connection🎜🎜🎜🎜Event🎜 🎜 IlluminateEventsDispatcher🎜🎜이벤트🎜🎜🎜🎜File🎜🎜IlluminateFilesystemFilesystem🎜🎜파일🎜🎜🎜🎜Gate🎜🎜IlluminateContractsAuthAccessGate🎜🎜 🎜 🎜🎜🎜Hash🎜🎜IlluminateContractsHashingHasher🎜🎜< code>hash🎜🎜🎜🎜Lang🎜🎜IlluminateTranslationTranslator🎜🎜번역기🎜🎜🎜🎜Log🎜🎜IlluminateLogLogManager🎜🎜로그🎜🎜🎜Notification🎜🎜IlluminateNotificationsChannelManager🎜🎜 🎜🎜🎜🎜Password🎜🎜IlluminateAuthPasswordsPassword BrokerManager🎜🎜auth.password🎜🎜🎜🎜 비밀번호(인스턴스)🎜🎜IlluminateAuthPasswordsPasswordBroker🎜🎜auth.password.broker🎜🎜🎜🎜Queue🎜🎜IlluminateQueueQueueManager🎜🎜queue🎜🎜🎜🎜Queue(인스턴스)🎜🎜IlluminateContract sQueueQueue 🎜🎜queue.connection🎜🎜🎜🎜Queue(기본 클래스)🎜🎜IlluminateQueueQueue🎜🎜 🎜🎜🎜🎜Redirect🎜🎜IlluminateRoutingRedirector🎜🎜redirect🎜🎜 🎜🎜Redis🎜 🎜IlluminateRedisRedisManager🎜🎜redis🎜🎜🎜🎜Redis(인스턴스)🎜🎜IlluminateRedisConnectionsConnection🎜🎜redis.connection🎜🎜🎜🎜Request🎜🎜IlluminateHttpRequest🎜🎜요청< /코드>🎜🎜SchemaIlluminateDatabaseSchemaBuilder 🎜Session🎜🎜IlluminateSessionSessionManager🎜🎜session🎜🎜🎜🎜Session(인스턴스)🎜🎜IlluminateSessionStore🎜🎜session.store🎜🎜🎜🎜Storage 🎜🎜IlluminateFilesystemFilesystemManager🎜🎜 파일 시스템🎜🎜🎜🎜스토리지(인스턴스)🎜🎜IlluminateContractsFilesystemFilesystem🎜🎜filesystem.disk🎜🎜🎜🎜URL🎜🎜IlluminateRoutingUrlGenerator🎜🎜url🎜 🎜🎜🎜Validator🎜🎜IlluminateValidationFactory🎜🎜validator🎜🎜🎜🎜Validator(인스턴스)🎜🎜IlluminateValidationValidator🎜🎜 🎜🎜
FacadeClass服务容器绑定
AppIlluminateFoundationApplicationappapp
ArtisanIlluminateContractsConsoleKernelartisan
AuthIlluminateAuthAuthManagerauth
Auth (Instance)IlluminateContractsAuthGuardauth.driver
BladeIlluminateViewCompilersBladeCompilerblade.compiler
BroadcastIlluminateContractsBroadcastingFactory 
Broadcast (Instance)IlluminateContractsBroadcastingBroadcaster 
BusIlluminateContractsBusDispatcher 
CacheIlluminateCacheCacheManagercache
Cache (Instance)IlluminateCacheRepositorycache.store
ConfigIlluminateConfigRepositoryconfigconfig
CookieIlluminateCookieCookieJarcookie
CryptIlluminateEncryptionEncrypterencrypter
DBIlluminateDatabaseDatabaseManagerdb
DB (Instance)IlluminateDatabaseConnectiondb.connection
EventIlluminateEventsDispatcherevents
FileIlluminateFilesystemFilesystemfiles
GateIlluminateContractsAuthAccessGate 
HashIlluminateContractsHashingHasherhash
LangIlluminateTranslationTranslatortranslator
LogIlluminateLogLogManagerlog
MailIlluminateMailMailer메일러mailer
NotificationIlluminateNotificationsChannelManager 
PasswordIlluminateAuthPasswordsPasswordBrokerManagerauth.password
Password (Instance)IlluminateAuthPasswordsPasswordBrokerauth.password.broker
QueueIlluminateQueueQueueManagerqueue
Queue (Instance)IlluminateContractsQueueQueuequeue.connection
Queue (Base Class)IlluminateQueueQueue 
RedirectIlluminateRoutingRedirectorredirect
RedisIlluminateRedisRedisManagerredis
Redis (Instance)IlluminateRedisConnectionsConnectionredis.connection
RequestIlluminateHttpRequestrequest
ResponseIlluminateContractsRoutingResponseFactory 
Response(인스턴스)IlluminateHttpResponse 
RouteIlluminateRoutingRouter 코드>라우터router
SchemaIlluminateDatabaseSchemaBuilder 
SessionIlluminateSessionSessionManagersession
Session (Instance)IlluminateSessionStoresession.store
StorageIlluminateFilesystemFilesystemManagerfilesystem
Storage (Instance)IlluminateContractsFilesystemFilesystemfilesystem.disk
URLIlluminateRoutingUrlGeneratorurl
ValidatorIlluminateValidationFactoryvalidator
ViewIlluminateViewFactoryview
View(인스턴스)IlluminateViewView
이 기사는 LearnKu.com에 처음 게시되었습니다.