Post参数通过一个表单,根据所述参数创建一个URL

Post parameters through a form, to create a URL based on said parameters

在一个表单中,用户可以在 2 个下拉列表(例如城市和城镇)中进行搜索和 select。他们提交表单后,我希望将其重定向到 URL,并在 URL.

中选择下拉选项

因此,在提交表单后,他们将被重定向到 www.domain.co.uk/city/town.

我正在努力掌握 URL 参数的概念,以及如何将它们传递给路由!

当前设置:

{!! Form::open(['route' => ['search'], 'method' => 'POST', 'id' => 'search']) !!}

我要 post 到 URL 的两个字段是:

<input type="hidden" name="town" id="town">

{!! Form::select('city', $city, null, 
    ['class' => 'form-control', 'id' => 'city', 'required']) 
!!}

我知道我必须 post 后者的 ID,所以我必须查找数据库中的实际 name 字段和 return 使用它(无论如何我都必须生成 slug)。

路线:

Route::post('{city}/{town}', ['uses' => 'Controller@search',
        'city' => Input::get('city'), 'town' => Input::get('town')]
)->name('search');

控制器:

public function search(Request $request)
{
    return view('location.search');
}

重定向时,如何在 URL 中使用这两个字段的值?我想我的做法是错误的,但我想不出替代方案。

非常感谢任何帮助!提前谢谢你。

如果您希望您的数据在 url 中可用,您的 Route 应该用于 get 请求。不是 post.

Route::get('{city}/{town}', 'Controller@search');

然后,在您的控制器中,您只需将它们添加到参数列表中即可获取它们:

public function search($city, $town)

我们采用另一种方法并在没有表格的情况下使用 javascript 怎么样?示例如下:

<input type="hidden" name="town" id="town" value="town">

<select name="city" id="city">
    <option value=""></option>
    <option value="City1">City 1</option>
    <option value="City2">City 2</option>
    <option value="City3">City 3</option>
    <option value="City4">City 4</option>
</select>
<button type="button" onclick="redirect()">Redirect</button>
<script>
    function redirect(){
        var city = document.querySelector('#city').value;
        var town = document.querySelector('#town').value;
        if(city != '' && town != ''){
            window.location = 'http://mydomain.co.ke/'+city+'/'+town;
            //or
            window.location = '/'+city+'/'+town;
        }
        else{
            alert('Select a city');
        }
    }
</script>

请注意,input/select 元素仍然可以使用 Form Facade

创建

您可以将路由结构更改为:

Route::post('search', 'Controller@search')->name('search');
Route::get('{city}/{town}', 'Controller@show')->name('location.show');

在你的控制器中:

public function show(Request $request, $city, $town) {
    // Do something with $city & $town
    return view('location.show');
}

public function search(Request $request) {
    $input = $request->only('city', 'town');
    // TODO: validate the input
    return redirect()->route('location.show', $input);
}