我坚持这种非常基本的形式,我无法完成,我想建立一个带有文本输入的搜索表单,以及两个选择控件,一个接受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
答案 0 :(得分:32)
最简单的方法是接受传入的请求,并在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...
}
}
有用的话,如果没有任何内容传递给你的Controller,你可以set defaults in Input::get()
。
As joe_archer says,没有必要将这些字词放入网址,而且它可能更适合作为POST(在这种情况下,您应该更新您对Form::open()
的通话以及路线中的搜索路线.php - Input::get()
保持不变)
答案 1 :(得分:17)
我也在努力解决这个问题,最后让它发挥作用。
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,如果你是的话,相应地调整数据库逻辑
并且我没有完成保护用户输入的数据,所以冷静
注意&#34; _token&#34;隐藏的表单字段和所有&#34;使用&#34;包括,他们是必要的。
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) ;
}
答案 2 :(得分:7)
我有同样的问题。我需要显示搜索引擎的网址
我使用这样的两条路线
Route::get('buscar/{nom}', 'FrontController@buscarPrd');
Route::post('buscar', function(){
$bsqd = Input::get('nom');
return Redirect::action('FrontController@buscarPrd', array('nom'=>$bsqd));
});
第一个用于显示我们想要的网址
第二个由表单使用并重定向到第一个
答案 3 :(得分:5)
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 :(得分:4)
您是否尝试将搜索字词和类别放入网址?
我会反对这一点,因为你必须处理多字搜索术语等,并且最终可能会因不允许的字符而出现各种不愉快。
我建议发布数据,清理数据然后返回结果页面。
Laravel路由不是为接受来自表单的GET请求而设计的,它旨在将URL段用作get参数,并围绕该想法构建。
答案 5 :(得分:0)
或者,如果要在操作签名中指定预期参数,但将它们作为任意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);
});
答案 6 :(得分:0)
路由器
http.csrf().disable()
控制器
Route::get('search/{id}', ['as' => 'search', 'uses' => 'SearchController@search']);