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

Laravel 8 如何实现多可选参数、顺序无关且无需控制器的路由

Laravel 8 多可选参数动态路由实现方案

实现思路

直接在路由文件中使用闭包处理逻辑,无需额外控制器。通过捕获路由/people后的所有动态分段,同时兼容分段键值、横杠拼接两种传参格式,参数顺序不影响解析结果。

完整实现代码

将以下代码写入routes/web.php文件即可:

<?php

use Illuminate\Support\Facades\Route;

Route::get('/people/{params?}', function ($params = null) {
    $filters = [];
    if ($params) {
        $segments = explode('/', $params);
        $index = 0;
        $segCount = count($segments);
        
        while ($index < $segCount) {
            $currentSeg = $segments[$index];
            // 匹配横杠拼接的参数格式
            if (str_contains($currentSeg, '-')) {
                list($key, $value) = explode('-', $currentSeg, 2);
                $filters[trim($key)] = trim($value);
                $index++;
            } 
            // 匹配分段键值的参数格式
            else {
                if (isset($segments[$index + 1])) {
                    $filters[trim($currentSeg)] = trim($segments[$index + 1]);
                    $index += 2;
                } else {
                    // 仅存在键无值的参数可按需处理,此处默认跳过
                    $index++;
                }
            }
        }
    }

    // 人员列表查询逻辑示例,可按需替换
    // $people = \App\Models\Person::when($filters, function ($query) use ($filters) {
    //     // 可加字段白名单校验,避免恶意传参
    //     $allowedFields = ['age', 'hair', 'status'];
    //     foreach ($filters as $key => $value) {
    //         if (in_array($key, $allowedFields)) {
    //             $query->where($key, $value);
    //         }
    //     }
    // })->get();
    // return $people;

    // 测试用:返回解析后的过滤参数,验证匹配效果
    return response()->json([
        'data' => '人员列表',
        'applied_filters' => $filters
    ]);
})->where('params', '.*');

兼容的路径示例

所有参数均为可选,顺序任意,两种格式还可混用:

  • /people:无过滤条件,返回全量人员列表
  • /people/age/24:分段键值格式,过滤年龄为24的人员
  • /people/hair/brown/age/30:多参数任意顺序,过滤发色为棕、年龄为30的人员
  • /people/status/4:分段键值格式,过滤状态为4的人员
  • /people/age-24:横杠拼接格式,过滤年龄为24的人员
  • /people/hair-brown/age-30:多参数横杠格式,过滤发色为棕、年龄为30的人员
  • /people/status-4:横杠拼接格式,过滤状态为4的人员
  • /people/age/24/status-1:两种格式混用,过滤年龄为24、状态为1的人员

注意事项

  • 若参数名或参数值本身包含横杠,可调整横杠拆分逻辑,代码中explode('-', $currentSeg, 2)已做仅拆分第一个横杠的处理,可适配大部分场景
  • 建议添加过滤字段白名单,避免用户传入未授权的字段触发安全风险
  • Laravel 8已原生支持str_contains辅助函数,若版本更低可替换为Str::contains,需提前引入Illuminate\Support\Str门面

内容的提问来源于stack exchange,提问作者Adam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 09:54:02