[Laravel Architecture] Service container

trieu.dev.da

Nguyễn Thanh Triều
Theo Laravel docs mô tả:
The Laravel service container is a powerful tool for managing class dependencies and performing dependency injection.
Tạm dịch là:
Laravel service container là một tool mạnh mẽ để quản lý các class dependencies(class phục thuộc) và triển khai dependency injection
.

Thế trong đầu lại hiện lên câu hỏi, thế "class dependencies" và "dependency injection" là gì?. Thật là rắc rồi phải không nào😅😅😅 Thế mình sẽ đi qua "class dependencies" và "dependency injection" trước đã nhé, nắm bắt được các khái niệm này thì sẽ giúp ta dễ hiểu hơn rất nhiều.
II. Class dependencies
Khi một Class A sử dụng một số function của Class B thì người ta nói rằng: Class A có quan hệ phụ thuộc(dependency) với Class B

Code minh họa
1678694163834.png

Ta thấy rằng trong function crawl() của class Crawler dùng tới function get() của class Http.
III. Dependency injection
Dependency injection(DI) là một kĩ thuật lập trình bla bla ... nếu đọc thấy sẽ hơi khó hiểu. Chúng ta hiểu đơn giản ntn. DI là một kĩ thuật giúp ta triển khai bằng cách "tiêm" class phụ thuộc vào class chính. Về tiêm thì chúng ta có 3 cách:
1. Constructor Injection
Tiêm thông qua hàm khởi tạo (function __contstructor)

2. Setter Injection
Tiêm thông qua hàm setter/gettter

3. Interface Injection
Tiêm thông qua interface
Trong Php thì chúng ta hay gặp trường hợp thứ nhất tức là Constructor Injection. Nên các vị dụ của chúng ta sẽ sử dụng cách triển khai tiêm qua contructor. Đây là một ví dụ code php thuần:
1678694180250.png

Như ta thấy để triển khai DI ta cần làm 3 điều:
  1. Khai báo 1 property $http
  2. Trong hàm khởi tạo(constructor) của class Crawler ta triển khai tiêm instance của class Http vào property $http
  3. Khi dùng function của Http trong class Crawler thì chỉ cần gọi $this->http->get()
Đây là code trong Laravel:

1678694196154.png

IV. Quay lại Service Container
Giờ chúng ta đã nắm được 2 khái niệm "class dependencies" và "dependency injection" rồi, hãy trở về Laravel nhé! Nhắc lại khái niệm đã nêu ở đầu bài.
Laravel service container là một tool mạnh mẽ để quản lý các class dependencies(class phục thuộc) và triển khai dependency injection.
Luận giải: Laravel cung cấp một cái gọi là "Service container" rất là mạnh mẽ. Chốc bằng code mình sẽ cho các bạn nhìn thấy cái tool mạnh mẽ của laravel này. Cái tool này sinh ra để nhằm mục đích là triển khai DI tức là nó sẽ tiếp nhận các class phụ thuộc và có cách thức lôi các class phụ thuộc này ra dùng. Như vậy Service container là nơi chứa và triển khai các class phụ thuộc. Tại sao nó lại quan trọng trong thiết kế của Laravel Architecture, bởi vì đây là nơi quản lý mọi class lớn nhỏ trong Laravel. Nó vô cùng quan trọng.
Bài toán triển khai thực tế dưới dạng kịch bản:

Coder: Ê Laravel, tao có vài function của class này này muốn dùng trong Laravel, mày có cách nào ko?
Laravel Architecture: Có chứ mày, mày vứt class đó vào Service container đi, để nó quản lý, lúc nào mày cần dùng thì nó có phương thức để mày lôi ra dùng thôi.
Coder: Ok mày, tao hiểu rồi. Thế triển khai coding như thế nào?
Laravel Architecture: Đây, đọc đi, dễ hiểu mà
1678694293988.png

Giải thích xíu nhé:
  1. Khởi tạo 1 service container, cái mà gọi là 1 tool mạnh mẽ đấy
  2. Binding 1 class FirstClass vào service container và đặt tên nó là "class1"
  3. Resolve hay gọi cách khác lôi instance của class đó ra
  4. Sử dụng các hàm của "class1"
Và đây là kết quả
1678694316963.png
 
Bên trên