14. Dependency injection & Controller

Lấy lại ví dụ tại phần single action controller, các bạn có để ý một sự khác biệt là hàm __invoke được inject dependency Illuminate\Http\Request class. $request này sẽ nhận tất cả các giá trị dữ liệu từ tham số trên URI mà không cần phải khai báo tại method __invoke. Để hiểu hơn thì chúng ta sẽ tùy chỉnh đoạn code trên một chút. Tại route, chúng ta truyền thêm tham số page vào trên URI như thế này:

Route::get('/dashboard/{page}', 'ShowDashboard');

Phương thức __invoke trong ShowDashboard controller ta sẽ lấy tham số page như sau:

public function __invoke(Request $request)
{
    return 'Dashboard page ' . $request->page;
}

Cách lấy tham số URI thông qua $request này hoàn toàn giống với tập Middleware. Không chỉ hạn chế ở method __invoke, ta có thể sử dụng cách này cho toàn bộ method trong controller class nếu có quá nhiều tham số được truyền đến.

Ngoài ra bạn vẫn có thể vừa inject dependency class, vừa có thể khai báo biến nhận dữ liệu của tham số như sau:

public function __invoke(Request $request, $page = 1)
{
    return 'Dashboard page ' . $page;
}
Route::get('/dashboard/{page?}', 'ShowDashboard');

Cách này thông thường sử dụng khi bạn cần sử dụng tham số tùy chọn, chứ không ai rảnh mà đi khai báo lại biến nhận dữ liệu khi $request đã có mọi thứ phải không nào.

Lưu ý: Bạn có thể inject bất kỳ dependency class nào bạn cần cho controller class.

Last updated