---
description: https://viblo.asia/p/tap-14-controller-laravel-Ljy5VXOkZra
---

# 4. Controller middleware (ok)



Thông thường khi đăng ký middleware trong file route, ta làm như sau:

```
Route::get('profile', 'UserController@show')->middleware('auth');
```

Tuy nhiên sẽ thuận tiện hơn khi bạn đăng ký middleware trong hàm khởi tạo của controller. Sử dụng phương thức `middleware` trong `__construct` của class controller để đăng ký.

```
class UserController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
    }
}
```

Laravel cung cấp cho chúng ta hai method `except` và `only` để mở rộng tính linh hoạt cho controller middleware.

Với method `except` thì middleware đã đăng ký ở trước sẽ áp dụng trên tất cả các method có trong controller đó "ngoại trừ" method đã tham chiếu trong `except`.

```
class UserController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth')->except('logout');
    }
}
```

Trong trường này tất cả các method có trong `UserController` đều được đăng ký middleware `auth` ngoại trừ `logout`.

Còn với method `only` thì nó sẽ "chỉ" áp dụng lên method mà ta đã tham chiếu.

```
class UserController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth')->only('show');
    }
}
```

Trong trường này chỉ có method `show` trong `UserController` được đăng ký middleware `auth`.

Ngoài ra, bạn có thể tự định nghĩa một middleware trong controller với dạng Closure object.

```
$this->middleware(function ($request, $next) {
    // ...

    return $next($request);
});
```

Với cách này giúp chúng ta code nhanh chóng khi cần xử lý một số logic nhỏ.

> **Lưu ý:** Trong trường hợp có quá nhiều nhóm method được đăng ký các middleware khác nhau trong một controller thì bạn nên nghĩ đến việc phân chia controller đó thành nhiều controller nhỏ để dễ quản lý. Không nên xử lý logic quá nhiều để đăng ký middleware trong hàm khởi tạo của controller class.
