Quay lại

Grouping routes by controllers trong Laravel Chuyên mục PHP và Laravel    2024-01-04    30 Lượt xem    12 Lượt thích    comment-3 Created with Sketch Beta. 0 Bình luận

Grouping routes by controllers trong Laravel

Hiện tại có nhiều cách để nhóm các route trong Laravel. Ví dụ, sử dụng middlewares, subdomains, prefixes để kể một số.

Nhưng còn một kịch bản nữa, có thể được bao phủ, đó là thiếu sót.
Hãy xem xét nhóm các route sau đây:

use Illuminate\Support\Facades\Route;

Route::get('/', [BookController::class, 'index']);
Route::get('/books/{id}', [BookController::class, 'show']);
Route::get('/books/search/{search}', [BookController::class, 'search']);
Route::post('/book', [BookController::class, 'store']);

Như bạn có thể thấy, chúng ta có bốn route để quản lý sách và nếu bạn để ý, tất cả các route này có một điểm chung. Đó là BookController.

Nhưng nếu chúng ta có thể chỉ cần nhóm các route này theo controller? Các route sẽ trở nên dễ quản lý và gọn gàng hơn, phải không?

Vâng, một đề xuất mới cho Laravel 8.x cố gắng giải quyết vấn đề này.

Group by Controller

Theo đề xuất này, framework hiện tại đi kèm với một phương thức controller (bạn có thể gọi nó trên facade Illuminate\Support\Facades\Route), từ đó bạn có thể nhóm các route sử dụng cùng một controller.

Vì vậy, nếu chúng ta muốn viết lại ví dụ trước bằng cách sử dụng cách tiếp cận này, dưới đây là cách chúng ta có thể thực hiện.

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\BookController;

Route::controller(BookController::class)->group(function () {
    Route::get('/', 'index');
    Route::get('/books/{id}', 'show');
    Route::get('/books/search/{search}', 'search');
    Route::post('/book', 'store');
});

Như bạn có thể thấy, bằng cách sử dụng cách tiếp cận này, bạn có tất cả các route, sử dụng cùng một controller, được đặt trong cùng một nhóm. Bây giờ, bạn chỉ cần cung cấp phương thức controller mà chúng đang gọi.

Falling back

Bây giờ, nếu bạn đang nhóm các route theo controllers bằng cách sử dụng cách tiếp cận ở trên và nếu bạn chỉ định controller cho route một lần nữa, nó sẽ ghi đè lên controller của nhóm.

Hãy xem ví dụ sau đây.

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\BookController;

Route::controller(BookController::class)->group(function () {
    Route::get('/books/{id}', 'EbookController@show');
});

Như bạn có thể thấy, chúng ta đã chỉ định EbookController trong định nghĩa route một lần nữa. Vì vậy, điều này sẽ có ưu tiên hơn BookController trong trường hợp này.

Điều này cũng áp dụng cho các cú pháp khác để chỉ định controllers như một mảng, cú pháp closure và controllers có thể gọi được.

Bình luận (0)

Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough

Bài viết liên quan

Learning English Everyday