Facade là gì

Facade là gì?

Nếu bạn thích tò mò về Design Patterns, và đã từng có lần nhìn qua cuốn sách khét tiếng Design Patterns: Elements of Reusable Object-Oriented Software của "Gang of Four", thì bạn cũng có thể đã nghe biết Facade Pattern, nằm trong đội Structural.

You watching: Facade là gì

Tuy nhiên, có mang Facade trong Laravel ... hoàn toàn không tương quan gì cho Facade Pattern được đề cùa tới vào cuốn sách của Gang of Four nhé. =)) Giới thiệu vậy để các bạn đỡ nhầm lẫn sau này thôi. =))

Vậy Facade vào Laravel là gì?

Facade rất có thể dịch đơn giản sang giờ đồng hồ Việt là bề ngoài, khía cạnh ngoài. Nó cho phép bạn truy cập mang đến những hàm bên phía trong những service được knhì báo trong Service Container bằng phương pháp hotline các hàm static.

Giải ưa thích như bên trên thì nghe có vẻ như cạnh tranh phát âm, nhưng thực tiễn rất có thể các bạn vẫn đang thực hiện Facade những mà lại không xem xét đấy.

Hãy cùng xem qua file config/phầm mềm.php một ít nhé.

Nếu xem xét tại phần cuối của tệp tin config kia, bạn sẽ thấy Laravel đã knhì báo sẵn một loạt những class alias, để sau đây ta hoàn toàn có thể áp dụng trong project của mình bên dưới cái brand name nthêm gọn gàng, cố kỉnh vày nên viết không thiếu thốn namespace của bọn chúng. Tức là khi tất cả knhị báo "Auth" => IlluminateSupportFacadesAuth::class, thì lúc bọn họ sử dụng class Auth phía bên trong project của chính bản thân mình, chúng ta thực tiễn sẽ điện thoại tư vấn cho class IlluminateSupportFacadesAuth.

Tản mạn một chút ít, nếu như khách hàng thắc khoác vì sao Laravel rất có thể làm một câu hỏi tưởng như "thần thánh" điều đó thì thật ra cũng chả gồm gì đặc trưng đâu, vì bản thân PHP đã tư vấn mang lại chúng ta công dụng đó thông qua hàm class_alias rồi. Công vấn đề của chúng ta bên chỉ là knhị báo alias dưới dạng key-value vào vào tệp tin config/tiện ích.php, còn vấn đề register alias trải qua hàm class_alias sẽ được Laravel triển khai. Quý khách hàng có thể tham khảo class IlluminateFoundationAliasLoader để nắm rõ bản chất của quá trình này.

Quay trở lại sự việc register alias vào tệp tin config, nó bao gồm liên qua gì mang đến chủ đề Facade vậy?

Bạn tất cả chú ý thương hiệu không thiếu thốn của những class được register alias không? Vâng, bọn chúng đều phải có namespace là IlluminateSupportFacades. Hay có thể nói rằng những class được register alias tại chỗ này đầy đủ là những Facade. Và các Facade khoác định của Laravel gần như nằm trong tlỗi mục vendorlaravelframeworksrcIlluminateSupports.

Trong khi, đa số alias cơ mà chúng ta cũng có thể tuyệt cần sử dụng, ví dụ như App, Auth, DB, Route ... thì đa số là Facade cả đấy.

Chẳng hạn tựa như những chiếc code quen thuộc sau:

// routes.php fileRoute::get("/", function () return view("welcome"););// Controller fileif (Auth::check()) $user = Auth::user();Vâng, Việc các bạn điện thoại tư vấn những hàm Route::get(), tốt Auth::user() nlỗi trên hầu hết là đã sử dụng Facade. Và hãy chú ý lại phần có mang mà bản thân viết ở đoạn đầu nhé. Có và đúng là ai đang thực hiện những hàm static ko

Tuy nhiên, tiếng new là dịp vấn đề trlàm việc phải tinh vi này. Hãy demo vào coi câu chữ một file Facade ráng làm sao nhé.

Ví dụ nlỗi Auth Facade ví dụ điển hình. Đây là toàn bộ những gì các bạn thấy sống class IlluminateSupportFacadesAuth

namespace IlluminateSupportFacades;/** *
see IlluminateContractsAuthStatefulGuard */class Auth extends Facade /** * Get the registered name of the component. * *
return string */ protected static function getFacadeAccessor() return "auth"; Chỉ tất cả tuyệt nhất 1 method vào class kia, tên là getFacadeAccessor, ngoài ra hoàn toàn không tồn tại một static method nào khác cả. Vậy thì những hàm Auth::check(), Auth::user(), xuất xắc Auth::id() chui từ đâu ra?

Facade chuyển động như thế nào?

Giờ ta sẽ tiếp tục mày mò ngọn nguồn của một class Facade. Hãy để ý một chút ít, ta thấy class Auth, giỏi các class Facade không giống, đều thừa kế từ 1 abstract class là IlluminateSupportFacadesFacade. Và trong class này ta vẫn thấy tất cả hàm getFacadeAccessor()

/** * Get the registered name of the component. * *
throws RuntimeException */protected static function getFacadeAccessor() throw new RuntimeException("Facade does not implement getFacadeAccessor method.");Việc knhì báo method với nội dung duy nhất là throw error như thế này thì class kế thừa của doanh nghiệp sẽ phải khai báo override hàm getFacadeAccessor() (bằng ko sẽ có error). Do kia toàn bộ những Facade hầu như sẽ có được một static method là getFacadeAccessor() (và thiệt suôn sẻ, Laravel có tác dụng hết gần như lắp thêm cho chúng ta, có tác dụng tận răng đến hơn cả từng Facade chỉ cần có một hàm sẽ là đủ).

Đọc kỹ nội dung abstract class Facade các bạn sẽ thấy được rằng ngôn từ mà lại method getFacadeAccessor() trả về sẽ được áp dụng nhằm tạo ra Facade Instance, cơ mà instance này được resolve sầu ra trường đoản cú Application Instance $app, tuyệt nói cách khác đó là Service Container.

See more: Temper Là Gì Trong Tiếng Việt? Vietgle Tra Từ

do đó thao tác cùng với Auth Facade thực tiễn là thao tác với service auth vào Service Container. Việc Gọi các hàm static của Auth thực tế sẽ được giải pháp xử lý vào magic method __callStatic (chúng ta cũng có thể tò mò về magic method này sống đây), rồi chuyển sang lời Gọi hàm bình thường xuất phát từ một instance đã có được resolve sầu ra từ trong Service Container.

vì thế thì ta hoàn toàn có thể thấy những phương pháp call sau đang là tương đương:

Auth::check();// Bản chất của lời call hàm static qua Facade rất có thể được bắt tắt lại thành$auth = app("auth");$auth->check();Facade - the Good & the BadFacade có thể nói rằng là 1 trong trong những tư tưởng xuất xắc thiên tài gây bất đồng quan điểm nhiều độc nhất của Laravel. Bạn rất có thể google ra cả gò nội dung bài viết, chủ kiến nhận định rằng Facade là 1 "Bad design", hay "Anti-pattern". Nhưng cũng có tương đối nhiều fan vẫn mếm mộ cùng sử dụng Facade mỗi ngày. Nó sẽ cùng vẫn vẫn là một phần của Laravel.

Facade thuận tiện. Facade dễ dàng sử dụng. Facade giúp cho bạn viết code vô cùng nđính gọn lập cập. Trên document của Laravel, Facade được mô tả với không ít ưu thế như "providing the benefit of a terse, expressive syntax while maintaining more testability và flexibility than traditional static methods".

Facade được thiết kế theo phong cách nlỗi một cây cầu để người lập trình sẵn tiếp cận với "Service" một bí quyết thuận tiện. Quý Khách rất có thể thực hiện Facade gần như là đông đảo lúc đều khu vực nhưng chưa phải mất công khởi tạo, resolve những instance từ bỏ vào Service Container. Facade về thực chất cũng không phải là một trong class chứa đầy đông đảo static method, cho nên nó ko nặng trĩu nề hà chiếm phần bộ nhớ lưu trữ giống như những class như thế.

Tuy nhiên cũng chính vì để sở hữu được hầu hết sự thuận tiện như vậy nhưng mà ta bắt buộc một đống những "phxay thuật" được giải pháp xử lý ngầm "behind the scene". Với một bạn mới bắt đầu tò mò cùng áp dụng Laravel, hoàn toàn có thể họ đã dễ ợt biết đến với áp dụng cách Gọi Auth::user(), dẫu vậy họ sẽ không còn thể phát âm được thực chất của hàm kia từ bỏ đâu ra. Hay Khi chạm chán vụ việc cùng bắt buộc vào vào code của Framework để khám nghiệm thì cũng thiệt cực nhọc để các bạn kiếm tìm thấy được bắt đầu của chúng.

Hơn nuốm nữa, cùng với vấn đề vượt tiện nghi của Facade, còn nếu không cảnh giác bạn sẽ hoàn toàn có thể làm cho code trnghỉ ngơi buộc phải phức tạp và khó khăn đân oán biết hơn. lấy ví dụ nhỏng mình thích đánh giá một class vận động nhờ vào những dependencies nào thì bản thân thường xuyên vẫn coi ngơi nghỉ trong constructor của chính nó. Hay trong Laravel bao gồm support method injection thì mình cũng xem qua cả trong knhì báo method nữa. Thế tuy thế, với vấn đề Hotline Facade sinh hoạt bên trong hàm thì ta vẫn vô hình dung bình thường bít đi vấn đề hàm, xuất xắc class, kia yêu cầu một service dependency, sản phẩm công nghệ cơ mà núm vày ta buộc phải inject vào thì nay được resolve sầu ra thông qua Facade.

Lời kết

Trong kích thước câu chữ bài viết này, mình xin đứng bên cạnh cuộc về việc bất đồng quan điểm coi nên hay không nên sử dụng Facade. Nó là 1 trong những tài năng tiện nghi với không phải bỗng nhiên nhưng mà Taylor Otwell, thân phụ đẻ của Laravel, còn cất giữ nó mang đến ngày lúc này.

Bài viết này chỉ hy vọng rất có thể giúp các chúng ta cũng có thể gọi hơn về những gì xảy ra phía sau đa số hàm static mà ta vẫn tốt call trải qua Facade.

Còn cùng với câu hỏi "Nếu ko dùng Facade thì hoàn toàn có thể sử dụng cái gì để nỗ lực thế?", thì bản thân xin vấn đáp là mình vẫn tuyệt dùng Dependency Injection.

Hãy dành chút thời hạn tham khảo về phần Facade Class Reference bên trên document của Laravel. Bạn đã thấy được thực chất của một Facade là áp dụng instance của class nào, và nếu khi nào có sự việc gì rất cần phải coi code của Framework thì cũng biết được ở đâu nhằm nhưng search. Chẳng hạn nhỏng để khám phá về những hàm của Facade Request thì bạn nên tìm đến class IlluminateHttpRequest, cùng với Auth vậy nên IlluminateAuthAuthManager tuyệt Mail do đó IlluminateMailMailer.

See more: " Per Se Là Gì ? Nghĩa Của Từ Per Se Nghĩa Của Từ Per Se

Và những điều đó thì ta rất có thể thay thế sửa chữa bài toán sử dụng Facade Mail bằng phương pháp injectIlluminateMailMailer vào class thông qua constructor injection hay method injection.

Có một chú ý sống đó là nhỏng mình cũng đã tất cả nhắc sinh sống những bài trước, một class tránh việc để dựa vào vào trong 1 class không giống nhưng nên làm nhờ vào vào abstraction (xuất xắc interface). Do đó, nạm bởi vì typehint IlluminateMailMailer ta đã typehint contract của nó là IlluminateContractsMailMailer

// Facade Stylefunction sendMail() // Sending mail Mail::send($view, $data);// Dependency Injection Styleclass Something protected $mailer; public function __construct(IlluminateContractsMailMailer $mailer) $this->mailer = $mailer; public function sendMail() // Sending mail $this->mailer->send($view, $data); Hy vọng qua bài viết này đều tín đồ hoàn toàn có thể phát âm thêm về một tuấn kiệt vốn vô cùng thân thuộc của Laravel. Và xin hứa hẹn gặp mặt lại vào nội dung bài viết tới, với đều đào sâu không giống về Framework thông dụng này

*


Chuyên mục: Giải Đáp