post-image

Dependency Injection

2. Cơ bản về Laravel Framework

Dependency Injection (tiêm phụ thuộc) là một cơ chế để giúp dễ dàng sử dụng các đối tượng của một lớp bên trong một lớp khác. Dependency Injection là cơ chế được sử dụng rất phổ biến trong rất nhiều các framework hiện nay, bao gồm cả Laravel.

Giả sử bạn có hai thành phần, A và B, và A phụ thuộc vào B, bạn có thể nói A phụ thuộc vào B hoặc B là phụ thuộc của A. Giả sử A là một lớp có phương thức được gọi là importantMethod sử dụng B, như được định nghĩa trong đoạn mã sau:

class A {    

     public function importantMethod() {     

        $b = new B();        
        $b->usefulMethod();   
       //More code here    
    
    }
}

A phải chứa một thể hiện của B trước khi nó có thể sử dụng B. Chúng ta sẽ sử dụng toán tử “new” nếu B là một lớp cụ thể. Nếu B là một Interface với nhiều thể hiện(implementation), bạn sẽ phải chọn một thể hiện của B, và như vậy, khả năng sử dụng lại của A sẽ bị giảm bởi vì bạn không thể sử dụng A với thể hiện của B mà bạn không chọn.

Dependency Injection giải quyết tình huống này bằng cách tiếp nhận việc tạo đối tượng và tiêm (injecting) phụ thuộc (dependencies) vào một đối tượng cần chúng.

Để tiêm một phụ thuộc, bạn phải tạo một phương thức set hoặc một hàm tạo (constructor) đặc biệt trong lớp đích. Ví dụ, để tạo A với một thể hiện của B, bạn sẽ sửa đổi A như sau:

Chẳng hạn, để tiêm một đối tượng của UserRepository vào trong controller UserController thì chúng ta có thể làm như sau:

<?php

namespace App\Http\Controllers;

use App\Repositories\UserRepository;

class UserController extends Controller{ 

   /**    
   * The user repository instance.     
   */
     
    protected $users;

    /**     
    * Create a new controller instance.   
    *     
    * @param UserRepository $users     
    * @return void     
    */     

   public function __construct(UserRepository $users){       

          $this->users = $users; 
   
   }
}

Trong ví dụ trên, chúng ta đã sử dụng cách tiêm phụ thuộc vào constructor của lớp. Như vậy, chúng ta sẽ không còn phải tự tạo đối tượng UserRepository nữa mà thay vào đó đối tượng của lớp này sẽ được tự động tiêm vào trong UserController để chúng ta sử dụng.

Tiêm phụ thuộc sử dụng method

Ngoài việc triển khai Dependency Injection thông qua constructor, chúng ta cũng có thể triển khai thông qua cơ chế gợi ý kiểu dữ liệu của tham số của các phương thức.

Chẳng hạn, chúng ta có thể inject một đối tượng của lớp Request vào cho các action của controller bằng cách như sau:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller{   
   /**    
    * Store a new user.   
    *     
    * @param Request $request    
    * @return Response     
    */    

    public function store(Request $request)     {

        $name = $request->name;
         //     
   }
}

Leave a Reply

Your email address will not be published. Required fields are marked *