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

Laravel表单提交:自定义路由参数的URL结构实现

Laravel表单提交URL改为路径参数格式的实现方案

你需要修改三个核心部分:表单提交逻辑、路由约束、控制器参数获取方式,具体操作如下:

1. 调整表单提交逻辑(添加JS拦截)

原生GET表单会自动将输入转为查询参数,因此需要用JavaScript拦截提交事件,手动构造路径参数格式的URL并跳转:

<form class="d-flex" method="GET" action="{{ route('client.info.get') }}" id="infoForm">
    <div class="btn-group ipchi-searchbox" role="group" aria-label="">
        <input type="text" name="input" class="form-control form-control-lg custom-rounded-input" placeholder="جستجوی آی پی یا دامین" aria-label="Enter IP address" aria-describedby="search-btn" value="">
        <button class="btn btn-primary btn-lg btn-block" type="submit" id="search-btn-ip">
            <i class="fa-solid fa-magnifying-glass"></i>
        </button>
    </div>
</form>

<script>
document.getElementById('infoForm').addEventListener('submit', function(e) {
    e.preventDefault(); // 阻止默认表单提交行为
    const inputValue = this.querySelector('input[name="input"]').value.trim();
    if (!inputValue) return; // 空输入不执行跳转
    
    // 构造目标URL:基础路由地址 + 编码后的输入值
    const targetUrl = "{{ route('client.info.get') }}/" + encodeURIComponent(inputValue);
    window.location.href = targetUrl;
});
</script>

2. 优化路由(添加参数正则约束)

为了让路由精准匹配IP或域名格式,给input参数添加正则约束,避免和其他路由冲突:

Route::group(['as' => 'client.'], function(){
    Route::group(['as' => 'info.', 'prefix' => 'info'], function(){
        // 正则约束匹配IP(v4/v6)或标准域名格式
        Route::get('/{input}', [IpInfoController::class, 'getInfo'])
            ->name('get')
            ->where('input', '^([0-9a-fA-F:.]+|([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,})$');
    });
});

注:如果需要保留空参数访问初始页面,可以将{input}改为{input?},但需确保提交时输入不为空。

3. 修改控制器参数获取方式

原来从查询参数input取值,现在改为直接从路由参数获取:

public function getInfo(Request $request, $input)
{
    // 直接使用路由注入的$input参数
    $validator = Validator::make(['input' => $input], [
        'input' => 'required|string',
    ]);

    if ($validator->fails()) {
        return response()->json(['error' => 'Invalid input.'], 400);
    }

    if (filter_var($input, FILTER_VALIDATE_IP)) {
        $data = $this->getIpInfo($input);
    } else {
        $data = $this->getDomainInfo($input);
    }

    return response()->json($data);
}

也可以通过$request->route('input')获取路由参数,效果一致。

额外注意

  • 使用encodeURIComponent处理输入值,确保含特殊字符的IP/域名能正确传递;
  • 路由正则约束可根据实际需求调整,比如允许包含更多特殊符号的自定义域名格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 13:16:07