Laravel: Facade


Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viê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\Facadeskhô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 viewresponseurlconfig, 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\Responsemặt tiền để tạo phản hồi JSON, chúng ta có thể chỉ cần sử dụng responsehà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::getphươ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 cachetrợ giúp sẽ gọi getphương thức trên lớp nằm bên dưới Cachemặ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 Facadelớ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\Facadelớp cơ sở .

Lớp Facadecơ 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 getphương thức tĩnh đang được gọi trên Cachelớ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" Cachemặ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\Factorygiao 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\Cachelớ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 đó, Cachemặt tiền mở rộng Facadelớ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 Cachemặt tiền, Laravel sẽ giải quyết cacherà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ử Podcastmô hình của chúng ta có một publishphương thức. Tuy nhiên, để xuất bản podcast, chúng ta cần đưa vào một Publisherphiê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 publishphươ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 Publishercá 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 Facadestiề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ó.

Mặt tiền Lớp Ràng buộc vùng chứa dịch vụ
Ứng dụng Illuminate \ Foundation \ Application app
Nghệ nhân Chiếu sáng \ Hợp đồng \ Bảng điều khiển \ Kernel artisan
Auth Chiếu sáng \ Auth \ AuthManager auth
Auth (Phiên bản) Chiếu sáng \ Hợp đồng \ Xác thực \ Bảo vệ auth.driver
Lưỡi Illuminate \ View \ Compilers \ BladeCompiler blade.compiler
Phát tin Chiếu sáng \ Hợp đồng \ Phát thanh truyền hình \ Nhà máy  
Truyền phát (Phiên bản) Illuminate \ Contracts \ Broadcasting \ Broadcaster  
Xe buýt Chiếu sáng \ Hợp đồng \ Xe buýt \ Điều phối viên  
Bộ nhớ đệm Illuminate \ Cache \ CacheManager cache
Bộ nhớ đệm (Phiên bản) Chiếu sáng \ Cache \ Kho lưu trữ cache.store
Cấu hình Chiếu sáng \ Cấu hình \ Kho lưu trữ config
Bánh quy Chiếu sáng \ Cookie \ CookieJar cookie
Crypt Illuminate \ Encryption \ Encrypter encrypter
Ngày Illuminate \ Support \ DateFactory date
DB Illuminate \ Database \ DatabaseManager db
DB (Phiên bản) Chiếu sáng \ Cơ sở dữ liệu \ Kết nối db.connection
Biến cố Chiếu sáng \ Sự kiện \ Điều phối viên events
Tập tin Chiếu sáng \ Hệ thống tập tin \ Hệ thống tập tin files
Cánh cổng Chiếu sáng \ Hợp đồng \ Xác thực \ Truy cập \ Cổng  
Băm Chiếu sáng \ Hợp đồng \ Hashing \ Hasher hash
Http Chiếu sáng \ Http \ Khách hàng \ Nhà máy  
Lang Chiếu sáng \ Bản dịch \ Trình dịch translator
Nhật ký Illuminate \ Log \ LogManager log
Thư Chiếu sáng \ Mail \ Mailer mailer
Thông báo Chiếu sáng \ Thông báo \ Người quản lý kênh  
Mật khẩu Illuminate \ Auth \ Passwords \ PasswordBrokerManager auth.password
Mật khẩu (Phiên bản) Illuminate \ Auth \ Passwords \ PasswordBroker auth.password.broker
Xếp hàng Illuminate \ Queue \ QueueManager queue
Hàng đợi (Phiên bản) Chiếu sáng \ Hợp đồng \ Hàng đợi \ Hàng đợi queue.connection
Hàng đợi (Lớp cơ sở) Chiếu sáng \ Hàng đợi \ Hàng đợi  
Chuyển hướng Illuminate \ Routing \ Redirector redirect
Redis Chiếu sáng \ Redis \ RedisManager redis
Redis (Phiên bản) Chiếu sáng \ Redis \ Kết nối \ Kết nối redis.connection
Lời yêu cầu Chiếu sáng \ Http \ Yêu cầu request
Phản ứng Illuminate \ Contracts \ Routing \ ResponseFactory  
Phản hồi (Phiên bản) Chiếu sáng \ Http \ Đáp ứng  
Tuyến đường Chiếu sáng \ Định tuyến \ Bộ định tuyến router
Lược đồ Illuminate \ Database \ Schema \ Builder  
Phiên họp Illuminate \ Session \ SessionManager session
Phiên (Phiên bản) Chiếu sáng \ Phiên \ Cửa hàng session.store
Kho Illuminate \ Filesystem \ FilesystemManager filesystem
Bộ nhớ (Phiên bản) Chiếu sáng \ Hợp đồng \ Hệ thống tập tin \ Hệ thống tập tin filesystem.disk
URL Chiếu sáng \ Định tuyến \ UrlGenerator url
Trình xác thực Chiếu sáng \ Xác thực \ Nhà máy validator
Trình xác thực (Phiên bản) Chiếu sáng \ Xác thực \ Trình xác thực  
Quan điểm Chiếu sáng \ Xem \ Nhà máy view
Xem (Phiên bản) Chiếu sáng \ Xem \ Xem  
» Tiếp: Route (Định tuyến)
« Trước: Nhà cung cấp dịch vụ (Service Providers)
Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên
Copied !!!