Laravel 9中如何验证路由请求参数?
Laravel路由参数slug验证方案
一、推荐方案:使用FormRequest分离验证逻辑
这是Laravel官方推荐的最佳实践,能让控制器专注于业务逻辑,验证规则独立维护,代码结构更清晰。
步骤1:创建自定义FormRequest类
执行Artisan命令生成请求类:
php artisan make:request ShowBookRequest
编辑生成的app/Http/Requests/ShowBookRequest.php文件:
namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class ShowBookRequest extends FormRequest { /** * 权限验证(无需权限限制则返回true) */ public function authorize() { return true; } /** * 定义验证规则 */ public function rules() { return [ 'library' => ['required', 'alpha_dash'], 'media' => ['required', 'alpha_dash'], 'genre' => ['required', 'alpha_dash'], 'title' => ['required', 'alpha_dash'], // 若需更严格的slug规则(仅允许小写字母、数字、连字符),替换为正则: // 'library' => ['required', 'regex:/^[a-z0-9-]+$/'], ]; } /** * 自定义错误消息(可选) */ public function messages() { return [ 'library.alpha_dash' => '图书馆标识必须是有效的slug格式', 'media.alpha_dash' => '媒体类型必须是有效的slug格式', 'genre.alpha_dash' => '分类标识必须是有效的slug格式', 'title.alpha_dash' => '书籍标题slug格式无效', ]; } }
步骤2:修改控制器方法
将原Request替换为自定义的ShowBookRequest,Laravel会自动完成参数验证:
namespace App\Http\Controllers; use App\Http\Requests\ShowBookRequest; use App\Models\Book; class BookController extends Controller { public function showBook(ShowBookRequest $request, $library, $media, $genre, $title) { // 参数已通过验证,可安全执行Eloquent查询 $book = Book::where('library_slug', $library) ->where('media_slug', $media) ->where('genre_slug', $genre) ->where('title_slug', $title) ->firstOrFail(); return view('books.show', compact('book')); } }
二、替代方案:控制器内直接验证
如果不想创建单独的请求类,也可以在控制器方法内完成验证:
namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\Book; class BookController extends Controller { public function showBook(Request $request, $library, $media, $genre, $title) { // 验证路由参数 $validated = $request->validate([ 'library' => ['required', 'alpha_dash'], 'media' => ['required', 'alpha_dash'], 'genre' => ['required', 'alpha_dash'], 'title' => ['required', 'alpha_dash'], ], [ // 自定义错误消息(可选) 'library.alpha_dash' => '图书馆标识必须是有效的slug格式', // ...其他字段的错误消息 ]); // 使用验证后的参数执行查询 $book = Book::where('library_slug', $validated['library']) ->where('media_slug', $validated['media']) ->where('genre_slug', $validated['genre']) ->where('title_slug', $validated['title']) ->firstOrFail(); return view('books.show', compact('book')); } }
关键说明
- 验证规则选择:
alpha_dash是Laravel内置规则,允许字母、数字、连字符和下划线,完全符合slug的常见格式;若需要更严格的限制(比如禁止下划线),可以使用正则规则regex:/^[a-z0-9-]+$/。 - 验证失败处理:无论使用哪种方式,Laravel在验证失败时都会自动返回422状态码和错误信息(API场景返回JSON,Web场景返回带错误提示的页面)。
- 安全性:验证通过后,参数格式符合预期,结合Eloquent的参数绑定机制,可有效避免SQL注入风险,同时避免无效的数据库查询。
内容的提问来源于stack exchange,提问作者bart
相关产品推荐
相关产品推荐

