Những gì tôi đang viết trong bài viết này thực sự có thể được đọc trên tài liệu chính thức của Laravel về Service Container. Tuy nhiên, bằng cách nào đó, tôi phải mất một khoảng thời gian khá dài để hiểu những gì được trình bày trong đó. Vì vậy, tôi viết bài này để giúp bản thân hiểu nó theo cách đơn giản hơn - theo ý kiến của tôi. Nó hiệu quả với tôi, và tôi hy vọng nó cũng hiệu quả với bạn
Tiêm phụ thuộcVí dụ, giả sử rằng
- mã của bạn cần một đối tượng từ lớp
HelpSpotService
- để tạo một đối tượng từ lớp
HelpSpotService
, bạn cần truyền một đối tượng của lớpHelpSpot\API
vào hàm tạo của nó - để tạo một đối tượng từ lớp
HelpSpot\API
, bạn cần truyền một đối tượng của lớpfunction yourMethod[]
0 vào hàm tạo của nó
{
$helpSpotService = $app->make['HelpSpotService']; $helpSpotService->doSomething[];
}
Thông thường, nếu không có kỹ thuật tiêm phụ thuộc, bạn sẽ làm một cái gì đó như thế này
function yourMethod[]
{
$httpClient = new HttpClient[["timeout" => 50]];
$helpSpotAPI = new HelpSpot\API[$httpClient];
$helpSpotService = new HelpSpotService[$helpSpotAPI]; // do something with helpSpotService
$helpSpotService->doSomething[];
}
Nếu bạn tình cờ sử dụng đối tượng của lớp HelpSpotService
ở nhiều nơi, thì nó sẽ cung cấp cho bạn nhiều dòng mã thực sự không thuộc logic ứng dụng chính của bạn. Và đôi khi điều này có thể áp đảo khi chuỗi phụ thuộc dài. Đây là lúc tiêm phụ thuộc phát huy tác dụng
Với phép nội xạ phụ thuộc, thay vì bắt đầu tạo một phiên bản của
function yourMethod[]0chỉ để cuối cùng tạo phiên bản của
{
$helpSpotService = $app->make['HelpSpotService']; $helpSpotService->doSomething[];
}
HelpSpotService
, bạn sẽ chỉ cần nói “Tôi cần một phiên bản của lớp HelpSpotService
, vui lòng tạo một phiên bản cho tôi” vào khung, như saufunction yourMethod[]
{
$helpSpotService = $app->make['HelpSpotService']; $helpSpotService->doSomething[];
}
Sau đó, Laravel sẽ chăm sóc việc tạo đối tượng cho bạn một cách tự động
Bạn có thể hỏi, làm thế nào điều đó có thể xảy ra? . Chúng tôi mô tả cách giải quyết vấn đề phụ thuộc trong Vùng chứa dịch vụ
Bộ chứa dịch vụChúng tôi xác định cách giải quyết các phần phụ thuộc trong Vùng chứa dịch vụ của mình bằng cách 'đăng ký' cho từng phần phụ thuộc. Hãy xem đoạn mã sau, đây là một đoạn trích từ tài liệu của Laravel
$this->app->bind['HelpSpot\API', function [$app] {
return new HelpSpot\API[$app->make['HttpClient']];
}];
Bạn có thể viết mã đó bên trong phương thức
function yourMethod[]6 trong
{
$helpSpotService = $app->make['HelpSpotService']; $helpSpotService->doSomething[];
}
function yourMethod[]7. Bây giờ, bất cứ nơi nào bạn cần một đối tượng_______17_______ trong mã của mình, bạn có thể lấy nó bằng cách đơn giản gõ
{
$helpSpotService = $app->make['HelpSpotService']; $helpSpotService->doSomething[];
}
$api = $app->make['HelpSpot\API'];
Thấy rằng bạn không cần bận tâm về việc tạo một
function yourMethod[]0 để tạo đối tượng, Laravel xử lý nó cho bạn
{
$helpSpotService = $app->make['HelpSpotService']; $helpSpotService->doSomething[];
}
Bây giờ bạn có thể thắc mắc rằng
function yourMethod[]0 đó được giải quyết như thế nào? . Ví dụ, mã có thể trông như thế này
{
$helpSpotService = $app->make['HelpSpotService']; $helpSpotService->doSomething[];
}
$this->app->bind['HttpClient', function [$app] {
return new HttpClient[["timeout" => 50]];
}];
Vì vậy, để tạo một đối tượng là HelpSpot\API
, Laravel sẽ tự động tìm cách nó giải quyết và phát hiện ra rằng nó cần một đối tượng là
function yourMethod[]0 để được giải quyết trước. Laravel sau đó lặp lại quy trình tương tự để tìm cách giải quyết vấn đề
{
$helpSpotService = $app->make['HelpSpotService']; $helpSpotService->doSomething[];
}
function yourMethod[]0, trả đối tượng
{
$helpSpotService = $app->make['HelpSpotService']; $helpSpotService->doSomething[];
}
function yourMethod[]0 vào quá trình tạo đối tượng
{
$helpSpotService = $app->make['HelpSpotService']; $helpSpotService->doSomething[];
}
HelpSpot\API
, cuối cùng tạo đối tượng HelpSpot\API
và trả về mã của bạnQuay lại ví dụ đầu tiên. Để tiêm phụ thuộc cho HelpSpotService
, bạn cần xác định cách giải quyết HelpSpotService
như sau