Tìm hiểu kiến trúc của Laravel – Phần 4. Facades.

Cho đến trước thời điểm viết bài này với nội dung về Facade, mình vẫn chưa thực sự biết và hiểu được Facade là cái gì và ta sẽ làm được gì với nó. Và vì thế mình đã đi tìm hiểu và đây là quá trình của mình.

Đọc document.

Từ khi biết được tầm quan trọng của việc đọc document chính chủ mình luôn lên trang chủ Laravel ngay để tìm kiếm và đọc về kiến thức mà mình muốn biết, và lần này mình lần mò vào Facades.

Đầu tiên mình thấy được lợi ích của việc dùng Facade đó là dễ dùng, dễ nhớ, dễ test.

Facades have many benefits. They provide a terse, memorable syntax that allows you to use Laravel’s features without remembering long class names that must be injected or configured manually. Furthermore, because of their unique usage of PHP’s dynamic methods, they are easy to test.

Tại sao lại dễ dùng, dễ nhớ? Hẳn các bạn đã từng dùng rất hiều Facade có sẵn của Laravel rồi. Này nhé ví dụ khi dùng Cache các bạn sẽ dùng như sau:

Cache

:

:

get

(

'key'

)

;

Hay khi thao tác với database:

DB

:

:

select

(

'SELECT * FROM users'

)

;

Ngoài ra còn rất nhiều Facade khác cũng hữu ích không kém khi xây dựng ứng dụng, các bạn có thể tham khảo thêm ở mục Facade Class Reference trong document. Sau khi mình đọc doc xong, còn một số kiến thức khác liên quan đến Facade nhưng không giúp mình hiểu hơn về Facade thì mình đã tiếp tục tìm kiếm trên Google bằng tiếng việt. 

Search Google.

laravel-facades-googling

Mình đã search và thấy một số kết quả rất hữu ích với bản thân mình. Đầu tiên là bài viết về Facade trong series Laravel Beauty. Nhờ bài viết này, mình biết được Facade hoạt động như thế nào? Khi viết một Facade extends cái gì, cần override hàm nào? Ưu và nhược điểm của Facade? Bài viết này nói riêng và cả series Laravel Beauty rất hữu ích với bản thân mình khi tìm hiểu về kiến trúc của Laravel.

Kế đến là một bài khá là đau não Đào sâu Facade. Nhờ bài này mà mình đã hiểu được bản chất thực sự của Facade trong Laravel. Quá một ví dụ truy lùng nguồn gốc của Facade:

DB

:

:

select

(

'SELECT * FROM users'

)

;

Qua đó mình đã hiểu được bản chất của việc dùng Facade chính là resolve instance được binding trong Service Container thông qua tên của instance được binding trong hàm getFacadeAccessor (cái hàm mà mình đã đề cập đến việc override nó).

Tiếp đến, mình thực hành code theo bạn này với bài viết về Laravel đơn giản, đẹp và hiệu quả hơn với Laravel Facade.

Tập code.

Tiếp tục với cái ví dụ củ chuối về Computer mình hay dùng ở những bài viết trước. Ở cuối bài Tìm hiểu kiến trúc của Laravel – Phần 3. Service Provider mình dùng đoạn code như sau để resolve instance Computer ra.

Selection_058

Hôm nay, sau khi đã hiểu về Facade mình sẽ dùng nó để che dấu đi việc resolve này đi.

Bước đầu tiên, mình viết ComputerFacade extends từ Illuminate\Support\Facades\Facade và override lại hàm getFacadeAccessor.

laravel-facades-extending

Sau đó, mình khai báo một alias cho class ComputerFacade này. Hoặc mình có thể bỏ qua bước này, mình thấy không cần thiết trong ví dụ này lắm, nhưng trong nhiều trường hợp thì nên viết alias cho class Facade để tránh việc dùng tên quá dài. Và bạn thao tác việc đó trong file config/app.php (Các bạn tự làm nhé).

Và bùm, mình che dấu được việc resolve Service Container trong code của mình như sau.

laravel-facades-extending-result

Lời kết.

Mình xin được tổng hợp lại loạt tài liệu mình đã tham khảo để tìm hiểu về Facades trong Laravel. Loạt tham khảo gồm có:

Qua đó ta thấy được một số lợi ích của việc sử dụng Facade trong code, tuy nhiên khi đọc bài “đào sâu” xong chắc hẳn các bạn sẽ thấy việc sử dụng che dấu việc binding và resolve Service Container thật phức tạp và loằng ngoằng, sẽ rất khó khăn trong việc maintain code hay tracking lại một đoạn code viết gì.

Cái gì cũng có hai mặt tốt và xấu, nên dùng Facade thế nào cho hiệu quả, các bạn hãy tìm tòi và trải nghiệm thực tế nhé.

Series bài viết về kiến trúc Laravel.

 

 

 

 

 

 

Chia sẻ: