如何使用GET方法将GET参数传递给Laravel?

2022-08-30 12:37:36

我被困在这个非常基本的形式上,我无法完成,我想用一个文本输入和两个选择控件构建一个搜索表单,其中包含一个接受3个参数的路线,问题是当我提交表单时,它会用问号映射参数,而不是Laravel方式,

标记

{{ Form::open(['route' => 'search', 'method' => 'GET'])}}
    <input type="text" name="term"/>
    <select name="category" id="">
        <option value="auto">Auto</option>
        <option value="moto">Moto</option>
    </select>
    {{ Form::submit('Send') }}
{{ Form::close() }}

路线

    Route::get('/search/{category}/{term}', ['as' => 'search', 'uses' => 'SearchController@search']);

当我提交表格时,它会将我重定向到

search/%7Bcategory%7D/%7Bterm%7D?term=asdasd&category=auto

我怎么能用Laravel的方式将这些参数传递到我的路线上,而没有Javascript!:D


答案 1

最简单的方法是接受传入的请求,并在控制器中提取所需的变量:

Route::get('search', ['as' => 'search', 'uses' => 'SearchController@search']);

然后在:SearchController@search

class SearchController extends BaseController {

    public function search()
    {
        $category = Input::get('category', 'default category');
        $term = Input::get('term', false);

        // do things with them...
    }
}

有用的是,您可以在 Input::get() 中设置默认值,以防没有任何内容传递给控制器的操作。

正如joe_archer所说,没有必要将这些术语放入URL中,并且作为POST可能会更好(在这种情况下,您应该更新您的呼叫以及路由中的搜索路由.php - 保持不变)Form::open()Input::get()


答案 2

我也在为此苦苦挣扎,终于让它工作了。

路线.php

Route::get('people', 'PeopleController@index');
Route::get('people/{lastName}', 'PeopleController@show');
Route::get('people/{lastName}/{firstName}', 'PeopleController@show');
Route::post('people', 'PeopleController@processForm');

人事控制者.php

namespace App\Http\Controllers ;
use DB ;
use Illuminate\Http\Request ;
use App\Http\Requests ;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Redirect;

    public function processForm() {
        $lastName  = Input::get('lastName') ;
        $firstName = Input::get('firstName') ;
        return Redirect::to('people/'.$lastName.'/'.$firstName) ;
    }
    public function show($lastName,$firstName) {
        $qry = 'SELECT * FROM tableFoo WHERE LastName LIKE "'.$lastName.'" AND GivenNames LIKE "'.$firstName.'%" ' ;
        $ppl = DB::select($qry);
        return view('people.show', ['ppl' => $ppl] ) ;
    }

人物/显示.刀片.php

<form method="post" action="/people">
    <input type="text" name="firstName" placeholder="First name">
    <input type="text" name="lastName" placeholder="Last name">
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
    <input type="submit" value="Search">
</form>

注意:
我需要将两个输入字段传递到 URI 中。
我还没有使用Eloquent,如果你是,请相应地调整数据库逻辑。
而且我还没有完成保护用户输入的数据,所以冷静下来。
注意“_token”隐藏表单字段和所有“使用”包括,它们是必需的。

PS:这是另一种似乎有效的语法,并且不需要

use Illuminate\Support\Facades\Input;

.

public function processForm(Request $request) {
    $lastName  = addslashes($request->lastName) ;
    $firstName = addslashes($request->firstName) ;
    //add more logic to validate and secure user entered data before turning it loose in a query
    return Redirect::to('people/'.$lastName.'/'.$firstName) ;
}

推荐