# 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](https://viblo.asia/p/tap-11-middleware-laravel-maGK74e9Zj2). 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.
