Laravel Façade Là Gì?

Laravel Façade Là Gì?
Nếu bạn đã từng thực hiện dự án sử dụng Laravel để thiết kế website, thì bạn đã biết Façade. Còn nếu chưa từng, thì bạn nên đọc bài này.

Laravel Façade thường cung cấp một interface static cho các class sử dụng trong Laravel. Laravel có nhiều façade nhằm cung cấp các truy cập khả dụng cho đa số các tính năng của Laravel. Chúng ta có thể ví Laravel Façade như là static proxies cho các lass bên dưới (trong service container). Nó có thể mang đến các lợi ích trong việc sử dụng các cú pháp ngắn gọn trong khi vẫn duy trì khả năng kiểm tra các tính năng linh hoạt khác. Khi sử dụng Laravel Façade, các bạn đã cấp tiến hơn một bậc: không sử dụng các static method truyền thống nữa.

 

Sơ nét về Laravel Façade 

 

Laravel Façade cung cấp cách gọi static cho các class. Các class đó được khai báo trong service container. Nó cũng cho phép chúng ta sử dụng cú pháp ngắn gọn và dễ bảo trì hơn nếu sử dụng các phương thức static truyền thống. Nếu đã từng sử dụng các câu lệnh như Auth::check(); hay Log::infor(“Hello”) trong Laravel, thì nó chính là Façade. Việc gọi và sử dụng Façade đơn giản như khi các bạn gọi một hàm static.  

 

Khi nào thì nên sử dụng Façade? 

 

Façade trong Laravel có nhiều lợi ích. Trước hết, nó cung cấp một cú pháp ngắn gọn và dễ nhớ cho phép chúng ta sử dụng các tính năng của Laravel mà không cần nhớ tên dài của class (khi phải inject hoặc cấu hình thủ công). Do việc sử dụng các dynamic method của PHP độc đáo, chúng ta dễ dàng kiểm tra. 

 

Façade mang đến lợi ích nhưng các bạn phải cẩn thận khi sử dụng nó. Mối nguy hiểm lớn nhất của Laravel Façade là class scope creep. Vì dùng façade rất dễ và không đòi hỏi injection, nó có thể khiến cho class phát triển quá mức (phình to ra) và sử dụng nhiều façade trong một class đơn. Khi sử dụng dependency injection, việc phát triển các dòng code trong class ngày càng lớn. Do đó, các bạn nên lưu ý kích thước của mỗi class để nó nằm trong phạm vi cho phép hoặc an toàn. 

 

Façade hoạt động như thế nào?

 

Bây giờ, ta sẽ tiếp tục tìm hiểu kỹ lưỡng hơn về một class của Façade. Nếu bạn chú ý một chút, thì bạn sẽ thấy class Auth hoặc các class Façade khác đều có xuất phát điểm từ một abstract class là Illuminate\Support\Facades\Facade. Trong những class tương tự như vậy, chúng ta sẽ thấy có hàm getFacadeAccessor(). 

 

/**
 * Get the registered name of the component.
 *
 * @return  string
 *
 * @throws  \RuntimeException
 */
protected static function getFacadeAccessor()

{
    throw new RuntimeException('Facade does not implement getFacadeAccessor method.');
}

 

Khi khai báo method với một nội dung duy nhất là throw error như vậy thì class sẽ kế thừa. Do đó, bạn bắt buộc phải khai báo override với hàm getFacaeAccessor(). Nếu bạn không làm như vậy, thì sẽ có rắc rối xảy ra. Tất cả Façade đều sẽ có một static method là getFacadeAccessor(). May mắn là Laravel có tính năng tự động đảm nhiệm phần việc này cho các bạn. Nó có thể thực hiện chi tiết đến mức mỗi Façade chỉ cần một hàm là được.

 

Bạn nên đọc kỹ nội dung abstract class Façade thì sẽ thấy nội dung mà method getFacadeAccessor() trả về thường sẽ sử dụng tạo ra Façade Instance. Instance đó được resolve từ Application Instance $app. Nó cũng chính là Service Container. Các bạn thấy đó, làm việc với Auth Façade chính là bạn đang làm việc với service auth trong Service Container. Gọi các hàm static của Auth sẽ được giải quyết trong magic method_callStatic trong thực tế. Sau đó, bạn chuyển qua gọi hàm bình thường từ một instance đã được resolve từ trong Service Container. 

 

Auth::check();

// Bản chất của lời gọi hàm static qua Facade có thể được tóm tắt lại thành

$auth = app('auth');

$auth->check();

 

Những điểm thuận lợi và chưa tốt của Façade 

 

Façade là một trong các khái niệm hoặc tính năng chưa được ngã ngũ của Laravel. Một số bạn thì cho rằng Laravel Façade không có gì tốt đẹp, một số khác thì vẫn thích dùng hàng ngày. Dù được đánh giá ra sao, Façade trong Laravel vẫn đang là một phần không thể thiếu. Façade được ví như một cây cầu để các anh em lập trình có thể tiếp cận với Service dễ hơn. Chúng ta sử dụng nó nhiều trong các dự án lập trình và không phải mất công khởi tạo và resolve các instance từ trong Service Container. Về bản chất mà nói, Façade cũng không phải là một class có chứa các static method. Vì vậy, nó không chiếm nhiều dung lượng bộ nhớ như các class khác tương tự. 

 

Tuy nhiên, để có tính tiện lợi khi sử dụng mà các bạn cần rất nhiều các phép thuật được giải quyết ngầm. Với một bạn lập trình mới vào nghề, việc tìm hiểu và sử dụng Laravel sẽ giúp bạn đó biết cách sử dụng thông qua gọi hàm Auth::user(). Tuy nhiên, bạn sẽ không hiểu nổi bản chất của hàm đó từ đâu mà có. Khi gặp một vấn đề nào đó và cần vào bên trong của Framework để kiểm tra, bạn cũng khó tìm ra nguồn gốc của nó ở đâu. 

 

Việc quá tiện lợi của Façade trong Laravel cũng sẽ là con dao hai lưỡi. Bạn có thể khiến việc coding trở nên phức tạp và khó đoán định. Ví dụ muốn kiểm tra một class hoạt động dựa vào các dependency nào đó, bạn thường phải coi trong constructor của nó. Trong Laravel có support method injection thì các bạn cũng phải xem qua và thậm chí là trong phần khai báo method. Tuy nhiên, việc gọi Façade ở bên trong hàm giống như che đi hàm hoặc class đó và bạn cần một service dependency – thay vì inject vào thì bạn phải chờ được resolve ra (thông qua Façade). 

 

Facades và Dependency Injection

 

Một trong các lợi ích chính của dependency injection là khả năng hoán vị implementations của injected class. Nó càng hữu dụng hơn trong quá trình kiểm tra vì bạn có thể inject một mock hoặc stub và xác định các phương thức khác cũng được gọi trong stub. Thông thường, Façade không thể mock hoặc stub một static class method. Nhưng vì Façade sử dụng dynamic method để gọi phương thức proxy đến các object để giải quyết từ service container, các bạn có thể kiểm tra Façade và một injected class instance.

 

Facades và Helper Functions

 

Ngoài các Façade, Laravel còn có một số hàm hữu dụng khác nhằm thực hiện các task khác như tạo ra views, firing events, dispatching jobs hoặc sending HTTP responses. Nhìn chung, có nhiều hàm hữu ích và có chức năng tương tự Façade. Khi sử dụng các hàm hữu ích, bạn vẫn có thể kiểm tra tính chính xác của chúng không khác gì với Façade tương ứng. 

Hồ Hữu Hiền

Mình là developer nên đôi khi viết bài không hay lắm mong các bạn thông cảm. Nếu muốn biết thêm thông tin về mình thì vui lòng vào website này để biết. https://huuhienqt.dev/

Bình luận (0)