/ / Laravel Framework / Comment (0)

Laravel Framework – Dependency Injection Design Pattern

Nếu như các bạn đã tìm hiểu những PHP framework thì chắc chắn đã rất hay gặp Dependency Injection Design Pattern, trong bài này chúng ta sẽ đi tìm hiểu về mẫu Design Pattern này là gì ưu và nhược điểm khi sử dụng và nó được sử dụng trong Laravel Framework như thế nào.

Dependency Injection là gì?

– Dependency Injection là một design pattern được sử dụng rất nhiều trong các PHP Framework.Nó có thể đưa các dependency vào class thông qua constructor hoặc setter, không khỏi tạo trực tiếp bên trong class.
Ví dụ : nếu một Class A hoạt động phụ thuộc vào một vài Class B, như bình thường thì ta hay khởi tạo các instance của các Class B bên trong Class A nhưng với cách này chúng ta đang hardcoded dependency. Nếu chúng ta thiết kế theo dạng Dependency Injection thì ta sẽ inject những instance đó vào thông qua constructor hay setter. Instance của Class BClass A cần để hoạt động đó được gọi là dependency.Chúng ta hãy cùng xem ví dụ cụ thể phía dưới:
+ Ví dụ khởi tạo instance trong 1 class theo cách hardcoded dependency:

<?php 
class Animal { 
    public function run()
    {
    	echo __CLASS__ . ' run';
    }
}

class Dog { 
    public $animal = '';
    public function __construct() {
        $this->animal = new Animal();
    }
    public function run()
    {
    	$this->animal->run();
    }
}

?>

+ Ví dụ với inject trong constructor :

<?php 
class Animal { 
    public  function run()
    {
    	echo __CLASS__ . ' run';
    }
}

class Dog { 
    public $animal = '';
    public function __construct(Animal $animal) {
        $this->animal = $animal;
    }
    public  function run()
    {
    	$this->animal->run();
    }
}
?>

Ở trên, tôi inject dependencies Animal được yêu cầu vào method constructor của class Dog , hơn là hardcode chúng trực tiếp vào trong class.
+ Ví dụ với Setter Injection:

<?php 
class Animal { 
    public  function run()
    {
    	echo __CLASS__ . ' run';
    }
}

class Dog { 
    public $animal = '';
    public function __construct() {
        $this->set_animal();
    }

    public function set_animal(){
        $this->animal = new Animal();
    }

    public  function run() {
    	$this->animal->run();
    }

}
?>

Với cách trên class Dog không còn phụ thuộc vào bất kỳ connection nào cụ thể. Kỹ thuật này cũng làm cho class dễ test hơn một cách đáng kể.
– Với các ví dụ trên thì các bạn chắc cũng đã nhận ra đã sử dụng nhiều tới Dependency Injection rồi mà không nhận ra phải không nào.

Ưu điểm và nhược điểm khi sử dụng Dependency Injection

Ưu điểm:
+ Code dễ bảo trì, dễ thay thế module
+ Dễ test và viết Unit Test
+ Dễ dàng thấy quan hệ giữa các module (Vì các dependecy đều được inject vào constructor)
Nhược điểm:
+ Khái niệm khó tiếp cận.
+ Các object được khởi tạo toàn bộ ngay từ đầu, có thể làm giảm performance
+ Làm tăng độ phức tạp của code

Dependency Injection sử dụng trong Laravel Framework

– Kỹ thuật Dependency Injection này được sử dụng rất nhiều trong Laravel Framework, như trong bài viết nói về Repository Design Pattern thì chúng ta đã cũng áp dụng kỹ thuật Inject 1 Repository vào trong controller:

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Repositories\PostRepository;
class PostController extends Controller
{
    protected $postRepository  = '';
    public function __construct(PostRepository $PostRepository)
    {
          $this->postRepository = $PostRepository;
    }
 
     /**
     * Lấy danh sách post
     */
    function all()
    {
         $list = $this->postRepository->all();
         return $list; 
    }
}

– Inject Request trong Laravel,ví dụ:

<?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->input('name');
        //
    }
}

– Ngoài ra kỹ thuật này còn được sử dụng rất nhiều trong Laravel Framework.

Tổng kết

– Qua bài này chắc các bạn cũng đã thấy được Dependency Injection là gì và cách sử dụng, hãy tận dụng và sử dụng sao cho hợp lý trong từng trường hợp.



05/03/2017
Written by nobitacnt

Trong bài viết không tránh khỏi những câu từ chưa chính xác,mong nhận được sự góp ý để website hoàn thiện hơn.Nếu thấy bài viết có ích với bạn hãy like và share để ủng hộ nhé :D.

Bài viết chùng chuyên mục

Gửi bình luận

Giới thiệu

Mình tạo ra blog này với mong muốn chia sẻ và học hỏi kinh nghiệm trong quá trình thiết kế website. Website đang trong quá trình phát triển chân thành cảm ơn mọi sự góp ý của các bạn để làm cho website ngày càng hoàn thiên.

DMCA.com Protection Status
Theo dõi qua Email

Tổng hợp các bài viết về

Hoc php - CodeIgniter Framework - Laravel Framework - PHP va MYSQL