如何使用 GET 方法将 GET 参数传递给 Laravel?
Posted
技术标签:
【中文标题】如何使用 GET 方法将 GET 参数传递给 Laravel?【英文标题】:How To Pass GET Parameters To Laravel From With GET Method ? 【发布时间】:2015-02-02 14:13:00 【问题描述】:我被困在这个非常基本的表单上,我无法完成,我想用一个文本输入和两个选择控件构建一个搜索表单,一个接受 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/id', ['as' => 'search', 'uses' => 'SearchController@search']);
控制器
class SearchController extends BaseController
public function search(Request $request)
$id= $request->id ; // or any params
...
【讨论】:
【参考方案2】:我也在为此苦苦挣扎,终于让它工作了。
routes.php
Route::get('people', 'PeopleController@index');
Route::get('people/lastName', 'PeopleController@show');
Route::get('people/lastName/firstName', 'PeopleController@show');
Route::post('people', 'PeopleController@processForm');
PeopleController.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] ) ;
人/show.blade.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) ;
【讨论】:
【参考方案3】:msturdy's solution 的替代方法是使用您可用的request helper method。
这以完全相同的方式工作,无需在控制器顶部导入 Input
命名空间 use Illuminate\Support\Facades\Input
。
例如:
class SearchController extends BaseController
public function search()
$category = request('category', 'default');
$term = request('term'); // no default defined
...
【讨论】:
【参考方案4】:或者,如果您想在动作签名中指定预期参数,但将它们作为任意GET
参数传递。使用过滤器,例如:
创建不带参数的路由:
$Route::get('/history', ['uses'=>'ExampleController@history']);
用两个参数指定动作并附加过滤器:
class ExampleController extends BaseController
public function __construct($browser)
$this->beforeFilter('filterDates', array(
'only' => array('history')
));
public function history($fromDate, $toDate)
/* ... */
将GET
转换为动作参数的过滤器:
Route::filter('filterDates', function($route, Request $request)
$notSpecified = '_';
$fromDate = $request->get('fromDate', $notSpecified);
$toDate = $request->get('toDate', $notSpecified);
$route->setParameter('fromDate', $fromDate);
$route->setParameter('toDate', $toDate);
);
【讨论】:
【参考方案5】:我有同样的问题。我需要显示搜索引擎的网址
我使用这样的两条路线
Route::get('buscar/nom', 'FrontController@buscarPrd');
Route::post('buscar', function()
$bsqd = Input::get('nom');
return Redirect::action('FrontController@buscarPrd', array('nom'=>$bsqd));
);
第一个用于显示我们想要的网址
表单使用第二个并重定向到第一个
【讨论】:
【参考方案6】:最简单的方法就是接受传入的请求,然后在Controller中取出你想要的变量:
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...
有用的是,您可以set defaults in Input::get()
以防万一您的控制器的操作没有传递任何内容。
As joe_archer says,没有必要将这些术语放入 URL,作为 POST 可能会更好(在这种情况下,您应该更新您对Form::open()
的调用以及您在 routes.php 中的搜索路线 - @ 987654328@保持不变)
【讨论】:
写Input
总是指定它所属的命名空间【参考方案7】:
所以您是在尝试将搜索词和类别添加到 URL 中?
我建议不要这样做,因为您将不得不处理多字搜索词等,并且最终可能会因不允许使用的字符而导致各种不愉快。
我建议发布数据,对其进行清理,然后返回结果页面。
Laravel 路由并非旨在接受来自表单的 GET 请求,它旨在使用 URL 段作为获取参数,并围绕该理念构建。
【讨论】:
以上是关于如何使用 GET 方法将 GET 参数传递给 Laravel?的主要内容,如果未能解决你的问题,请参考以下文章
如何将类型的对象作为参数传递给Web Api Get / Post方法
如何使用 GET 请求将参数传递给 AWS Lambda 函数?