Trang chủTác giảLiên hệ

Lang thang trong RouteProvider của Laravel 8

By Cao Văn Thành
Published in Laravel
July 22, 2021
4 min read

Xin chào mọi người. Hôm nay mình muốn giới thiệu cho mọi người 1 chút về RouteProvider của Laravel, hy vọng có thể cung cấp một vài thông tin gì đó hữu ích cho không chỉ các dự án Laravel mà cả các dự án/framework khác nữa.

Số là, hôm bữa, mình có gặp 1 vấn đề liên quan đến route và route cache. Và các bạn biết vấn đề gì sẽ xảy ra rồi đúng không ? Đó là các bạn Register 1 chiếc Route mới mà không thấy chạy vào function đó, thậm chí là chạy vào Route khác. Thực ra thì vấn đề nó cũng nằm ở nhiều chỗ chứ không chỉ có route cache. Mình sẽ giới thiệu qua cho mọi người cùng tham khảo luôn.

1. Khai báo route gộp.

Bản thân mình là một người theo chiều hướng bán explicit, nên mình thích những thứ gì nhìn phát là hiểu luôn, và có thể hiểu chi tiết nữa thì càng tốt. Tuy nhiên có một số dev lại thích theo chiều hướng implicit, vận dụng tất cả những gì framework cung cấp để giúp công việc của mình được đơn giản và nhẹ nhàng hơn. Do đó họ thường hay sử dụng route gộp giúp cho khai báo router dễ đọc, dễ hình dung hơn cho những công việc lặp đi lặp lại.

Trước tiên, chắc hẳn ai từng làm qua Laravel đều biết route trong Laravel được khai báo như sau:

Cá nhân mình thấy, đây là kiểu đơn giản, dễ nhìn, dễ hiểu, nếu không có gì đặc biệt thì nên áp dụng thế này cho gọn. Nhưng nếu Route của chúng ta, có tính lặp đi lặp lại nhiều, thì Laravel cũng cung cấp sẵn cho chúng ta một số câu lệnh gộp:

Đây là những Route chuẩn theo Restful API. Tất nhiên ở mức độ cao cấp thì trông cũng khá là cool ngầu, tiết kiệm được tương đối nhiều dòng code. Nhưng nó cũng có điểm nhược điểm là chúng ta không nhìn thấy chính xác là route nào đang được map vào hàm nào để xử lý. Mọi người có thể dùng câu lệnh:

để hiển thị hết các route ra xử lý.

Mọi chuyện sẽ bắt đầu phức tạp hơn khi chúng ta bắt đầu sử dụng đến nested resource:

Những hàm gộp kiểu này thường được sử dụng cho các dự án “tiêu chuẩn”, khi chúng ta đã khai báo các thành phần như product và subproduct quan hệ thế nào rồi. Nhìn chung thì cũng là một cái hay khi làm việc với nó. Tuy nhiên những chức năng gộp nhỏ lẻ kiểu này có khả năng cao sẽ cần thay đổi trong tương lai. Mà bây giờ mỗi khi sửa hàm này, chúng ta lại cần đọc hiểu xem nó quan hệ thế nào, nó đang “ngầm” thế nào thì rất mất thời gian. Nên cần hạn chế overuse tính năng này.

2. Cache route

Trong document của Laravel 8 chỉ nhắc tới 2 câu lệnh:

Chúng ta có thể hiểu php artisan route:cache dùng để cache lại những khai báo route của chúng ta. Để khi thay đổi bất cứ dòng lệnh PHP nào, chúng ta không cần register lại các route nữa (vì nhìn chung là Route cũng ít thay đổi, chủ yếu là thay đổi Controller thôi). Do đó, nếu cache lại route thì tốc độ lúc hot-reload sẽ rất nhanh.

Nhưng làm thế này có một điểm trừ, đó là hệ thống của chúng ta Cache lại Route, và khi chúng ta thay đổi thông tin trong route, sẽ không thấy server nhận ra cái route đó. Và chúng ta có một vài thắc mắc kiểu như:

  • “Ủa rõ ràng có route ở đây, trỏ tới Controller rõ ràng mà hệ thống lại báo là không tìm được route”.
  • “Ủa, rõ ràng route đã được update sang route mới rồi mà hệ thống lại nhận route ở đẩu đâu”
  • “Ủa sao route nó lại chạy vào hàm mà không ghi ở đây”.

Để tránh tình trạng đó, khi nào cần update 1 vài route, chúng ta thực hiện lệnh:

Để clear cache của route.

3. Route Provider

Đi sâu hơn 1 chút về Route, chúng ta có thể mò vào file Providers/RouteServiceProvider.php. Đây là nơi khi khởi động project (có thể là khi chạy php artisan serve) thì những file Service Provider sẽ được chạy. Và RouteServiceProvider là 1 ví dụ. Ở trong RouteServiceProvider thì không làm gì nhiều, nhưng chúng ta để ý tới

Phần đầu tiên configureRateLimiting() thì đúng như tên gọi của nó, dùng để đặt giới hạn cho IP hoặc 1 user cụ thể nào đó, mỗi phút chỉ được truy xuất bao nhiêu request. Nếu quá số lượng cho phép sẽ bị tính là spam, và bị cancel, trả về HTTP 429 Too Many Request. Nếu như mọi người muốn chọc chạch gì vào phần này, thì có thể “nghịch” ở đây. Hàm này được viết ngay phía dưới, và chỉ có 1 vài parameter có thể nhìn thấy để sửa nên cũng khá là dễ sửa.

Phần thứ 2 prefix cái gì đó, ở đây, thực ra Laravel giúp chúng ta register namespace để tránh trường hợp file routes/web.php của chúng ta bị quá nhiều thứ không cần thiết:

Thực ra thì như đã chia sẻ phía trên, mình theo hơi hướng bán explicit, nên việc nhìn thấy use 1 đống thế này, mình cũng không thấy có gì khó chịu lắm. Các IDE hiện đại, đã giúp chúng ta ẩn luôn phần này rồi, đồng thời việc thêm các Controller sử dụng thế này đều được thêm tự động, chứ không phải viết lại, nên cũng không phải là vấn đề gì quá to tát.

Việc thêm prefix cho Route sẽ hữu dụng cho những bạn nào quen viết kiểu:

Còn với cá nhân mình thích kiểu

Vì chúng ta có thể Shift Click vào FirstController để nhảy ra Controller ngay (trên VS Code).

Ok, vậy là hôm nay nói qua cho mọi người chút về Route và một số bí ẩn mà mình lò mò lọ mọ trong series học laravel. Hy vọng giúp mọi người giắt túi 1 vài kiến thức hữu ích.


Cao Văn Thành

Mình đã làm việc với web được 1 thời gian và mình thích chia sẻ về công nghệ. Hy vọng chúng ta sẽ xây dựng được một cộng đồng vững mạnh cho thế hệ Dev GenZ tại Việt Nam.

Related Posts

Laravel
Sử dụng Laradock để build môi trường DEV cho Laravel.
June 13, 2021
1 min
© 2021, All Rights Reserved.

Quick Links

Liên hệ quảng cáoThông tinLiên hệ

Social Media