Tiêm phụ thuộc PHP Laravel

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ộc

Ví 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ớp HelpSpot\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ớp
    function yourMethod()
    {
    $helpSpotService = $app->make('HelpSpotService');
    $helpSpotService->doSomething();
    }
    0 vào hàm tạo của nó

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()
{
$helpSpotService = $app->make('HelpSpotService');
$helpSpotService->doSomething();
}
0chỉ để cuối cùng tạo phiên bản của 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ư sau

function 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()
{
$helpSpotService = $app->make('HelpSpotService');
$helpSpotService->doSomething();
}
6 trong
function yourMethod()
{
$helpSpotService = $app->make('HelpSpotService');
$helpSpotService->doSomething();
}
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õ

$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()
{
$helpSpotService = $app->make('HelpSpotService');
$helpSpotService->doSomething();
}
0 để tạo đối tượng, Laravel xử lý nó cho bạn

Bây giờ bạn có thể thắc mắc rằng

function yourMethod()
{
$helpSpotService = $app->make('HelpSpotService');
$helpSpotService->doSomething();
}
0 đó được giải quyết như thế nào? . Ví dụ, mã có thể trông như thế này

$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()
{
$helpSpotService = $app->make('HelpSpotService');
$helpSpotService->doSomething();
}
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 đề
function yourMethod()
{
$helpSpotService = $app->make('HelpSpotService');
$helpSpotService->doSomething();
}
0, trả đối tượng
function yourMethod()
{
$helpSpotService = $app->make('HelpSpotService');
$helpSpotService->doSomething();
}
0 vào quá trình tạo đối tượng HelpSpot\API, cuối cùng tạo đối tượng HelpSpot\API và trả về mã của bạn

Quay 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

Laravel có tiêm phụ thuộc không?

Bộ chứa dịch vụ Laravel là một công cụ mạnh mẽ để quản lý các lớp phụ thuộc và thực hiện phép nội xạ phụ thuộc . Tiêm phụ thuộc là một cụm từ ưa thích về cơ bản có nghĩa là điều này. các phụ thuộc lớp được "đưa" vào lớp thông qua hàm tạo hoặc, trong một số trường hợp, các phương thức "setter".

Nội xạ phụ thuộc trong PHP là gì?

Nội dung phụ thuộc là quy trình trong đó một đối tượng cung cấp các phụ thuộc của đối tượng khác . Dependency Injection là một phương pháp thiết kế phần mềm cho phép tránh các phụ thuộc mã hóa cứng và cho phép thay đổi các phụ thuộc cả trong thời gian chạy và thời gian biên dịch.

Phụ thuộc lớp trong Laravel là gì?

Phần phụ thuộc chỉ là một đối tượng khác mà lớp của bạn cần để hoạt động , vì vậy nếu bạn có một lớp mô hình lấy dữ liệu từ một đối tượng cơ sở dữ liệu .

Lợi ích của Laravel IoC container là gì?

Laravel inversion of control container là công cụ mạnh mẽ để quản lý các phụ thuộc lớp . Dependency injection là một phương pháp loại bỏ các phụ thuộc lớp được mã hóa cứng. Thay vào đó, các phần phụ thuộc được đưa vào trong thời gian chạy, cho phép linh hoạt hơn vì việc triển khai phần phụ thuộc có thể được hoán đổi dễ dàng.