You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 08:40:43