Facades – dịch nôm na là bề ngoài, mặt tiền. Đúng như tên gọi, facades cung cấp khả năng gọi tới các services nằm trong Service Container bằng cách gọi tới các hàm static. Facades cung cấp khả năng truy cập tới các hàm một cách nhanh chóng, tiện lợi mà bạn không cần quá quan tâm bên dưới nó hoạt động như thế nào.

Các facades mặc định của laravel nằm trong thư mục vendor/laravel/framework/src/Illuminate/Support/Facades

Ví dụ facacde \Illuminate\Support\Facades\Route

<?php

use Illuminate\Support\Facades\Route;

// Bạn đang định nghĩa một route "/" với phương thức GET, mà không cần quan tâm laravel hoạt động bên dưới như thế nào.

Route::get('/', function () {
    return view('welcome');
});

Nguyên tắc hoạt động

Về cơ bản thì facade đơn giản là cung cấp khả năng truy cập tới các hàm của Service Container thông qua các hàm static. Ví dụ như này

Laravel có routing provider \Illuminate\Routing\RoutingServiceProvider

trong này Laravel bind vào Container – dưới alias name là “router”

protected function registerRouter()
{
    $this->app->singleton('router', function ($app) {
        return new Router($app['events'], $app);
    });
}

Trông closure function return instance của \Illuminate\Routing\Router

Khi này nếu bạn muốn gọi tới hàm get của \Illuminate\Routing\Router. Bạn có thể gọi như sau

$router = $this->app->make('router'); // Hoặc $router = app('router');
$router->get($uri);

Mọi chuyện trở nên đơn giản hơn khi Laravel cung cấp công cụ “facades” cho chúng ta. Hãy nhìn \Illuminate\Support\Facades\Route

Với việc sử return alias name “router” ở hàm getFacadeAccessor, giờ đây bạn có thể truy cập tới các hàm của Service Router một cách tiện lợi hơn

protected static function getFacadeAccessor()
{
    return 'router';
}

Ví dụ dưới đây, các bạn chỉ cần use class Illuminate\Support\Facades\Route, và gọi tới hàm get như một hàm static.

<?php

use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider and all of them will
| be assigned to the "web" middleware group. Make something great!
|
*/

Route::get('/', function () {
    return view('welcome');
});

Lợi ích và hạn chế của facades

  • Facades cung cấp một cú pháp ngắn gọn, dễ nhớ. Đặc biệt nó hữu dụng khi build các steps test functional.
  • Tuy nhiên điều này vô tình che đi các logic bên dưới. Đôi khi bạn cần hiểu cặn kẽ hoặc hệ thống có vấn đề mà cần hiểu sâu hơn để giải quyết thì việc dùng facades sẽ đôi phần cản trở quá trình.
  • Về cơ bản facades và dependence injection – về mặt nhiệm vụ có thể nói là tương đương. Việc sử dụng cái nào trong quá trình phát triển còn phụ thuộc vào thiết kế hệ thống, kinh nghiệm … của bạn nữa.

Ví dụ về việc sử dụng facades và dependences injection

/*
* Ví dụ từ nguồn: https://viblo.asia/p/laravel-beauty-tim-hieu-ve-facade-znVGLYLbvZOe
*/

// Facade Style
function sendMail()
{
    // Sending mail
    Mail::send($view, $data);
}

// Dependency Injection Style
class Something
{
    protected $mailer;

    public function __construct(Illuminate\Contracts\Mail\Mailer $mailer)
    {
        $this->mailer = $mailer;
    }

    public function sendMail()
    {
        // Sending mail
        $this->mailer->send($view, $data);
    }
}

Các facades default của Laravel

Các bạn tham khảo ở đây nhé

https://laravel.com/docs/10.x/facades#facade-class-reference

Như vậy chúng ta đã đi qua những phần lý thuyết nền tảng nhất – quan trọng nhất của Laravel. Các bài tiếp theo chúng ta sẽ đi tìm hiểu về lý thuyết coding basic trong Laravel nhé.

Chúc các bạn một ngày tốt lành 🙂

By HNK

Leave a Reply

Your email address will not be published. Required fields are marked *