Laravel: Facade
- Giới thiệu
- Khi nào sử dụng mặt tiền
- Cách thức hoạt động của mặt tiền
- Mặt tiền thời gian thực
- Tham chiếu Lớp Mặt tiền
Giới thiệu
Trong suốt tài liệu Laravel, bạn sẽ thấy các ví dụ về mã tương tác với các tính năng của Laravel thông qua "mặt tiền". Mặt tiền cung cấp giao diện "tĩnh" cho các lớp có sẵn trong vùng chứa dịch vụ của ứng dụng . Laravel có nhiều mặt tiền cung cấp quyền truy cập vào hầu hết các tính năng của Laravel.
Các mặt tiền của Laravel đóng vai trò là "proxy tĩnh" đối với các lớp cơ bản trong vùng chứa dịch vụ, mang lại lợi ích của cú pháp ngắn gọn, biểu cảm trong khi vẫn duy trì khả năng kiểm tra và tính linh hoạt hơn so với các phương thức tĩnh truyền thống. Hoàn toàn ổn nếu bạn không hoàn toàn hiểu cách các mặt tiền hoạt động dưới mui xe - chỉ cần tiếp tục và tiếp tục tìm hiểu về Laravel.
Tất cả các mặt tiền của Laravel đều được xác định trong Illuminate\Support\Facades
không gian tên. Vì vậy, chúng ta có thể dễ dàng tiếp cận một mặt tiền như vậy:
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Route;
Route::get('/cache', function () {
return Cache::get('key');
});
Trong suốt tài liệu Laravel, nhiều ví dụ sẽ sử dụng các mặt trước để thể hiện các tính năng khác nhau của khung.
Chức năng của người trợ giúp
Để bổ sung cho các mặt, Laravel cung cấp nhiều "chức năng trợ giúp" toàn cầu giúp việc tương tác với các tính năng chung của Laravel trở nên dễ dàng hơn. Một số chức năng helper chung bạn có thể tương tác với những view
, response
, url
, config
, và nhiều hơn nữa. Mỗi chức năng trợ giúp do Laravel cung cấp đều được ghi lại với tính năng tương ứng của chúng; tuy nhiên, một danh sách đầy đủ có sẵn trong tài liệu trợ giúp chuyên dụng .
Ví dụ: thay vì sử dụng Illuminate\Support\Facades\Response
mặt tiền để tạo phản hồi JSON, chúng ta có thể chỉ cần sử dụng response
hàm. Vì các hàm trợ giúp có sẵn trên toàn cầu, bạn không cần nhập bất kỳ lớp nào để sử dụng chúng:
use Illuminate\Support\Facades\Response;
Route::get('/users', function () {
return Response::json([
// ...
]);
});
Route::get('/users', function () {
return response()->json([
// ...
]);
});
Khi nào sử dụng mặt tiền
Mặt tiền có nhiều lợi ích. Chúng cung cấp một cú pháp ngắn gọn, dễ nhớ cho phép bạn sử dụng các tính năng của Laravel mà không cần nhớ các tên lớp dài phải được chèn hoặc cấu hình theo cách thủ công. Hơn nữa, vì cách sử dụng độc đáo của các phương thức động của PHP, chúng rất dễ kiểm tra.
Tuy nhiên, cần phải lưu ý một số vấn đề khi sử dụng mặt dựng. Mối nguy hiểm chính của mặt tiền là lớp "phạm vi creep". Vì các mặt tiền rất dễ sử dụng và không cần tiêm, nên có thể dễ dàng để các lớp của bạn tiếp tục phát triển và sử dụng nhiều mặt tiền trong một lớp duy nhất. Sử dụng phương pháp tiêm phụ thuộc, tiềm năng này được giảm thiểu bởi phản hồi trực quan mà một hàm tạo lớn cung cấp cho bạn rằng lớp của bạn đang phát triển quá lớn. Vì vậy, khi sử dụng các mặt tiền, hãy đặc biệt chú ý đến quy mô lớp của bạn để phạm vi trách nhiệm của nó luôn thu hẹp. Nếu lớp học của bạn quá lớn, hãy xem xét việc chia nó thành nhiều lớp nhỏ hơn.
Mặt tiền Vs. Tiêm phụ thuộc
Một trong những lợi ích chính của việc tiêm phụ thuộc là khả năng hoán đổi việc triển khai của lớp được tiêm. Điều này hữu ích trong quá trình thử nghiệm vì bạn có thể chèn một mô hình hoặc sơ khai và khẳng định rằng nhiều phương pháp khác nhau đã được gọi trên sơ khai.
Thông thường, sẽ không thể giả lập hoặc khai báo một phương thức lớp tĩnh thực sự. Tuy nhiên, vì các mặt tiền sử dụng các phương thức động để gọi phương thức proxy tới các đối tượng được giải quyết từ vùng chứa dịch vụ, chúng ta thực sự có thể kiểm tra các mặt tiền giống như chúng ta kiểm tra một cá thể lớp được chèn vào. Ví dụ, với tuyến đường sau:
use Illuminate\Support\Facades\Cache;
Route::get('/cache', function () {
return Cache::get('key');
});
Sử dụng các phương pháp kiểm tra mặt tiền của Laravel, chúng tôi có thể viết kiểm tra sau để xác minh rằng Cache::get
phương thức đã được gọi với đối số mà chúng tôi mong đợi:
use Illuminate\Support\Facades\Cache;
/**
* A basic functional test example.
*
* @return void
*/
public function testBasicExample()
{
Cache::shouldReceive('get')
->with('key')
->andReturn('value');
$response = $this->get('/cache');
$response->assertSee('value');
}
Mặt tiền Vs. Chức năng của người trợ giúp
Ngoài các mặt tiền, Laravel bao gồm nhiều chức năng "trợ giúp" có thể thực hiện các tác vụ phổ biến như tạo chế độ xem, kích hoạt sự kiện, điều phối công việc hoặc gửi phản hồi HTTP. Nhiều trong số các hàm trợ giúp này thực hiện chức năng tương tự như một mặt tiền tương ứng. Ví dụ: cuộc gọi mặt tiền và cuộc gọi trợ giúp này tương đương nhau:
return Illuminate\Support\Facades\View::make('profile');
return view('profile');
Hoàn toàn không có sự khác biệt thực tế giữa mặt tiền và chức năng trợ giúp. Khi sử dụng các hàm trợ giúp, bạn vẫn có thể kiểm tra chúng chính xác như cách bạn làm với mặt tiền tương ứng. Ví dụ, với tuyến đường sau:
Route::get('/cache', function () {
return cache('key');
});
Dưới mui xe, trình cache
trợ giúp sẽ gọi get
phương thức trên lớp nằm bên dưới Cache
mặt tiền. Vì vậy, ngay cả khi chúng ta đang sử dụng hàm helper, chúng ta có thể viết bài kiểm tra sau để xác minh rằng phương thức đã được gọi với đối số mà chúng ta mong đợi:
use Illuminate\Support\Facades\Cache;
/**
* A basic functional test example.
*
* @return void
*/
public function testBasicExample()
{
Cache::shouldReceive('get')
->with('key')
->andReturn('value');
$response = $this->get('/cache');
$response->assertSee('value');
}
Cách thức hoạt động của mặt tiền
Trong một ứng dụng Laravel, một mặt tiền là một lớp cung cấp quyền truy cập vào một đối tượng từ vùng chứa. Máy móc thực hiện công việc này là trong Facade
lớp. Mặt tiền của Laravel và bất kỳ mặt tiền tùy chỉnh nào bạn tạo, sẽ mở rộng Illuminate\Support\Facades\Facade
lớp cơ sở .
Lớp Facade
cơ sở sử dụng __callStatic()
phương thức ma thuật để trì hoãn các cuộc gọi từ mặt tiền của bạn đến một đối tượng được phân giải từ vùng chứa. Trong ví dụ dưới đây, một lệnh gọi được thực hiện đến hệ thống bộ nhớ cache Laravel. Bằng cách nhìn lướt qua mã này, người ta có thể giả định rằng get
phương thức tĩnh đang được gọi trên Cache
lớp:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Cache;
class UserController extends Controller
{
/**
* Show the profile for the given user.
*
* @param int $id
* @return Response
*/
public function showProfile($id)
{
$user = Cache::get('user:'.$id);
return view('profile', ['user' => $user]);
}
}
Lưu ý rằng gần đầu tệp, chúng tôi đang "nhập" Cache
mặt tiền. Mặt tiền này đóng vai trò như một proxy để truy cập việc triển khai cơ bản của Illuminate\Contracts\Cache\Factory
giao diện. Bất kỳ lệnh gọi nào chúng tôi thực hiện bằng cách sử dụng mặt tiền sẽ được chuyển đến phiên bản cơ bản của dịch vụ bộ nhớ cache của Laravel.
Nếu chúng ta nhìn vào Illuminate\Support\Facades\Cache
lớp đó , bạn sẽ thấy rằng không có phương thức tĩnh get
:
class Cache extends Facade
{
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor() { return 'cache'; }
}
Thay vào đó, Cache
mặt tiền mở rộng Facade
lớp cơ sở và định nghĩa phương thức getFacadeAccessor()
. Công việc của phương thức này là trả về tên của ràng buộc vùng chứa dịch vụ. Khi người dùng tham chiếu đến bất kỳ phương thức tĩnh nào trên Cache
mặt tiền, Laravel sẽ giải quyết cache
ràng buộc từ vùng chứa dịch vụ và chạy phương thức được yêu cầu (trong trường hợp này là get
) đối với đối tượng đó.
Mặt tiền thời gian thực
Sử dụng các mặt tiền thời gian thực, bạn có thể coi bất kỳ lớp nào trong ứng dụng của mình như thể nó là một mặt tiền. Để minh họa cách sử dụng điều này, trước tiên chúng ta hãy kiểm tra một số mã không sử dụng mặt tiền thời gian thực. Ví dụ, giả sử Podcast
mô hình của chúng ta có một publish
phương thức. Tuy nhiên, để xuất bản podcast, chúng ta cần đưa vào một Publisher
phiên bản:
<?php
namespace App\Models;
use App\Contracts\Publisher;
use Illuminate\Database\Eloquent\Model;
class Podcast extends Model
{
/**
* Publish the podcast.
*
* @param Publisher $publisher
* @return void
*/
public function publish(Publisher $publisher)
{
$this->update(['publishing' => now()]);
$publisher->publish($this);
}
}
Việc đưa phương thức triển khai của nhà xuất bản vào cho phép chúng tôi dễ dàng kiểm tra phương pháp một cách riêng biệt vì chúng tôi có thể chế nhạo nhà xuất bản được đưa vào. Tuy nhiên, nó yêu cầu chúng tôi phải luôn chuyển một phiên bản nhà xuất bản mỗi khi chúng tôi gọi publish
phương thức. Sử dụng các mặt tiền thời gian thực, chúng tôi có thể duy trì khả năng kiểm tra giống nhau trong khi không bị yêu cầu phải vượt qua một Publisher
cá thể một cách rõ ràng . Để tạo một mặt tiền thời gian thực, hãy đặt tiền tố cho không gian tên của lớp đã nhập bằng Facades
:
<?php
namespace App\Models;
use Facades\App\Contracts\Publisher;
use Illuminate\Database\Eloquent\Model;
class Podcast extends Model
{
/**
* Publish the podcast.
*
* @return void
*/
public function publish()
{
$this->update(['publishing' => now()]);
Publisher::publish($this);
}
}
Khi giao diện thời gian thực được sử dụng, việc triển khai của nhà xuất bản sẽ được giải quyết ra khỏi vùng chứa dịch vụ bằng cách sử dụng phần giao diện hoặc tên lớp xuất hiện sau Facades
tiền tố. Khi kiểm tra, chúng tôi có thể sử dụng trình trợ giúp kiểm tra mặt tiền được tích hợp sẵn của Laravel để mô phỏng lệnh gọi phương thức này:
<?php
namespace Tests\Feature;
use App\Models\Podcast;
use Facades\App\Contracts\Publisher;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class PodcastTest extends TestCase
{
use RefreshDatabase;
/**
* A test example.
*
* @return void
*/
public function test_podcast_can_be_published()
{
$podcast = Podcast::factory()->create();
Publisher::shouldReceive('publish')->once()->with($podcast);
$podcast->publish();
}
}
Tham chiếu Lớp Mặt tiền
Dưới đây bạn sẽ tìm thấy mọi mặt tiền và lớp cơ bản của nó. Đây là một công cụ hữu ích để nhanh chóng đào sâu vào tài liệu API cho một gốc mặt tiền nhất định. Khóa liên kết vùng chứa dịch vụ cũng được bao gồm nếu có.