【问题标题】:Post parameters through a form, to create a URL based on said parameters通过表单发布参数,以根据所述参数创建 URL
【发布时间】:2017-03-02 19:38:54
【问题描述】:

在表单中,用户可以在 2 个下拉菜单(例如城市和城镇)内进行搜索和选择。一旦他们提交表单,我希望它重定向到 URL 中带有所选下拉选项的 URL。

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

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

当前设置:

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

我要发布到 URL 的两个字段是:

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

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

我知道我必须发布后者的 ID,因此我必须在数据库中查找实际的 name 字段并将其返回以使用(无论如何我都必须生成 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 中使用这两个字段的值?我认为我的方法是错误的,但我想不出替代方案。

任何帮助将不胜感激!提前谢谢你。

【问题讨论】:

    标签: php laravel laravel-5 routes parameter-passing


    【解决方案1】:

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

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

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

    public function search($city, $town)
    

    【讨论】:

    • 不,我想在 URL 中使用这些变量。例如,如果他们在下拉列表中选择德克萨斯(城镇)和法国(城市),一旦提交表单,URL 将显示为 - www.domain.co.uk/france/texas。我希望这是有道理的。
    • 所以你的路线应该是一条路。
    【解决方案2】:

    我们采取另一种方法并使用没有表单的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>
    

    请注意,仍然可以使用表单外观创建输入/选择元素

    【讨论】:

      【解决方案3】:

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

      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);
      }
      

      【讨论】:

      • 完美运行。非常感谢 - 你让我免于一夜未眠。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-07
      • 1970-01-01
      • 2021-01-27
      • 1970-01-01
      • 2019-07-20
      • 2016-03-16
      相关资源
      最近更新 更多