외관
- 파사드 작동 원리
- Real-time Facades
- 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'); }
Laravel 애플리케이션에서 Facade는 컨테이너의 객체에 액세스할 수 있는 클래스입니다. 핵심 구성요소는 注意在上面这段代码中,我们『导入』了 如果我们看一下 使用实时 Facades,你可以将应用程序中的任何类视为 Facade。为了说明这是如何使用的,我们来看看另一种方法。例如,假设我们的 将发布者的实现注入到该方法中,我们可以轻松地测试这种方法,因为我们可以模拟注入的发布者。但是,它要求我们每次调用 当使用实时 Facade 时,发布者实现将通过使用 아래에서 각 Facade 클래스와 해당 기본 클래스를 찾을 수 있습니다. 이것은 특정 Facade 클래스에 대한 API 문서를 찾는 도구입니다. 서비스 컨테이너 바인딩에 대한 주요 정보도 포함되어 있습니다. <?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
는 실제로 Cache
의 get
메서드를 호출합니다. 정면. 따라서 도우미 함수를 사용하더라도 메소드를 검증할 것으로 예상되는 매개변수를 사용하여 다음 테스트 코드를 작성할 수 있습니다. 🎜<?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 작동 방식
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
Podcast
模型有一个 publish
方法。然而,为了发布 Podcast,我们需要注入一个 Publisher
实例:publish
方法时都要传递一个发布者实例。使用实时的 Facades,我们可以保持同样的可测试性,而不需要显式地通过 Publisher
实例。要生成实时 Facade
,请在导入类的名称空间中加上 Facades:Facades
Facade
기본 클래스는 객체가 컨테이너에서 구문 분석될 때까지 호출되지 않는 __callStatic()
매직 메서드를 사용합니다. 아래 예에서는 Laravel의 캐싱 시스템이 호출됩니다. 이 코드를 탐색하면 정적 메소드 get
가 Cache
클래스에서 호출된다고 가정할 수 있습니다. IlluminateSupportFacadesCache
클래스를 살펴보면 클래스에 get
정적 메서드가 없다는 것을 알 수 있습니다: Cache
Facade Facade 클래스를 상속하고 getFacadeAccessor()
메서드를 정의합니다. 이 메소드의 기능은 서비스 컨테이너 바인딩의 이름을 반환하는 것입니다. 사용자가 Cache
Facade에서 정적 메서드를 호출하면 Laravel은 서비스 컨테이너에서 cache
바인딩을 확인하고 객체는 요청된 메서드(이 경우 get)를 실행합니다.
메소드). 🎜🎜🎜🎜Podcast
모델에 publish
메소드가 있다고 가정해 보겠습니다. 그러나 팟캐스트를 게시하려면 Publisher
인스턴스를 삽입해야 합니다. 🎜rrreee🎜 게시자 구현을 메서드에 삽입하면 삽입된 게시를 모의할 수 있으므로 이 접근 방식을 쉽게 테스트할 수 있습니다. 그러나 publish
메소드를 호출할 때마다 게시자 인스턴스를 전달해야 합니다. 라이브 Facade를 사용하면 Publisher
인스턴스를 명시적으로 전달하지 않고도 동일한 테스트 가능성을 유지할 수 있습니다. 라이브 Facade
를 생성하려면 가져온 클래스의 네임스페이스에 Facades를 추가하세요: 🎜rrreee🎜 라이브 Facade를 사용할 때 게시자 구현은 Facades
접두사 부분을 사용하여 나타납니다. 서비스 컨테이너의 문제를 해결하기 위해 인터페이스 또는 클래스 이름을 변경합니다. 테스트할 때 Laravel에 내장된 Facade 테스트 도우미 함수를 사용하여 이 메소드 호출을 시뮬레이션할 수 있습니다: 🎜rrreee🎜🎜🎜🎜🎜🎜Facade 클래스 참조
Facade Class 服务容器绑定 App IlluminateFoundationApplication app
app
Artisan IlluminateContractsConsoleKernel artisan
Auth IlluminateAuthAuthManager auth
Auth (Instance) IlluminateContractsAuthGuard auth.driver
Blade IlluminateViewCompilersBladeCompiler blade.compiler
Broadcast IlluminateContractsBroadcastingFactory Broadcast (Instance) IlluminateContractsBroadcastingBroadcaster Bus IlluminateContractsBusDispatcher Cache IlluminateCacheCacheManager cache
🎜Artisan🎜🎜IlluminateContractsConsoleKernel🎜🎜Cache (Instance) IlluminateCacheRepository cache.store
artisan code>🎜🎜🎜🎜Auth🎜🎜IlluminateAuthAuthManager🎜🎜
auth
🎜🎜🎜🎜Auth(인스턴스)🎜🎜IlluminateContractsAuthGuard🎜🎜auth.driver
🎜🎜🎜🎜Blade 🎜🎜 IlluminateViewCompilersBladeCompiler🎜🎜blade.compiler
🎜🎜🎜🎜Broadcast🎜🎜IlluminateContractsBroadcastingFactory🎜🎜 🎜🎜🎜🎜Broadcast(인스턴스)🎜🎜IlluminateContractsBroadcastingBroadcaster 🎜🎜 🎜🎜🎜🎜Bus🎜🎜IlluminateContractsBusDispatcher🎜🎜 🎜🎜🎜🎜 Cache🎜🎜IlluminateCacheCacheManager🎜🎜캐시
🎜🎜🎜🎜Cache(인스턴스)🎜🎜IlluminateCacheRepository🎜🎜cache.store
🎜🎜Config IlluminateConfigRepository config
config
Cookie IlluminateCookieCookieJar cookie
Crypt IlluminateEncryptionEncrypter encrypter
DB IlluminateDatabaseDatabaseManager db
DB (Instance) IlluminateDatabaseConnection db.connection
Event IlluminateEventsDispatcher events
File IlluminateFilesystemFilesystem files
Gate IlluminateContractsAuthAccessGate Hash IlluminateContractsHashingHasher hash
Lang IlluminateTranslationTranslator translator
🎜Cookie🎜🎜IlluminateCookieCookieJar🎜🎜Log IlluminateLogLogManager log
쿠키
🎜🎜🎜🎜Crypt🎜🎜IlluminateEn cryptionEncrypter🎜🎜암호화기 code>🎜🎜🎜🎜DB🎜🎜IlluminateDatabaseDatabaseManager🎜🎜
🎜🎜🎜🎜Lang🎜🎜IlluminateTranslationTranslator🎜🎜db
🎜🎜🎜🎜DB(인스턴스)🎜🎜IlluminateDatabaseConnection🎜🎜db.connection
🎜🎜🎜🎜Event🎜 🎜 IlluminateEventsDispatcher🎜🎜이벤트
🎜🎜🎜🎜File🎜🎜IlluminateFilesystemFilesystem🎜🎜파일
🎜🎜🎜🎜Gate🎜🎜IlluminateContractsAuthAccessGate🎜🎜 🎜 🎜🎜🎜Hash🎜🎜IlluminateContractsHashingHasher🎜🎜< code>hash번역기
🎜🎜🎜🎜Log🎜🎜IlluminateLogLogManager🎜🎜로그
🎜🎜Mail IlluminateMailMailer 메일러
mailer
Notification IlluminateNotificationsChannelManager Password IlluminateAuthPasswordsPasswordBrokerManager auth.password
Password (Instance) IlluminateAuthPasswordsPasswordBroker auth.password.broker
Queue IlluminateQueueQueueManager queue
Queue (Instance) IlluminateContractsQueueQueue queue.connection
Queue (Base Class) IlluminateQueueQueue Redirect IlluminateRoutingRedirector redirect
Redis IlluminateRedisRedisManager redis
Redis (Instance) IlluminateRedisConnectionsConnection redis.connection
🎜Notification🎜🎜IlluminateNotificationsChannelManager🎜🎜 🎜🎜🎜🎜Password🎜🎜IlluminateAuthPasswordsPassword BrokerManager🎜🎜Request IlluminateHttpRequest request
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🎜🎜요청< /코드>🎜🎜
Response IlluminateContractsRoutingResponseFactory Response(인스턴스) IlluminateHttpResponse Route IlluminateRoutingRouter 코드>라우터 router
Schema IlluminateDatabaseSchemaBuilder Session IlluminateSessionSessionManager session
Session (Instance) IlluminateSessionStore session.store
Storage IlluminateFilesystemFilesystemManager filesystem
Storage (Instance) IlluminateContractsFilesystemFilesystem filesystem.disk
URL IlluminateRoutingUrlGenerator url
Validator IlluminateValidationFactory validator
Schema 🎜Session🎜🎜IlluminateSessionSessionManager🎜🎜IlluminateDatabaseSchemaBuilder session
🎜🎜🎜🎜Session(인스턴스)🎜🎜IlluminateSessionStore🎜🎜session.store
🎜🎜🎜🎜Storage 🎜🎜IlluminateFilesystemFilesystemManager🎜🎜 파일 시스템
🎜🎜🎜🎜스토리지(인스턴스)🎜🎜IlluminateContractsFilesystemFilesystem🎜🎜filesystem.disk
🎜🎜🎜🎜URL🎜🎜IlluminateRoutingUrlGenerator🎜🎜url
🎜 🎜🎜🎜Validator🎜🎜IlluminateValidationFactory🎜🎜validator
🎜🎜🎜🎜Validator(인스턴스)🎜🎜IlluminateValidationValidator🎜🎜 🎜🎜View IlluminateViewFactory view
View(인스턴스) IlluminateViewView