web-dev-qa-db-ja.com

GETメソッドを使用してGETパラメータをLaravelに渡す方法

私はこの非常に基本的なフォームで立ち往生しています、私は達成できなかったので、テキスト入力と2つの選択コントロールを備えた検索フォームを構築し、3つのパラメータを受け入れるルートで、フォームでは、Laravelウェイではなく疑問符でパラメーターをマップします。

Markup

{{ 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

26
Iliyass Hamza

最も簡単な方法は、着信リクエストを受け入れ、コントローラーで必要な変数を引き出すことです。

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(この場合、Form::open()への呼び出しを更新し、さらにroutes.phpでルートを検索-Input::get()は変わりません)

33
msturdy

私もこれに苦労していましたが、ようやく機能するようになりました。

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

people/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>

ノート:
2つの入力フィールドを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) ;
}
18
birchy

同じ問題がありました。検索エンジンのURLを表示する必要があります

このような2つのルートを使用します

Route::get('buscar/{nom}', 'FrontController@buscarPrd');

Route::post('buscar', function(){

   $bsqd = Input::get('nom');    

   return Redirect::action('FrontController@buscarPrd', array('nom'=>$bsqd));

});

私たちが望むようにURLを表示するために使用される最初のもの

2番目はフォームで使用され、1番目にリダイレクトされます

7
Fabian M

msturdyのソリューション の代わりに 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

        ...
    }
}
5
Jonathan

あなたは検索用語とカテゴリをURLに入れようとしていますか?

複数単語の検索用語などに対処する必要があり、許可されていない文字であらゆる種類の不快感が生じる可能性があるため、これには反対します。

データをPOSTし、サニタイズしてから結果ページを返すことをお勧めします。

Laravelルーティングは、フォームからGETリクエストを受け入れるように設計されていません。URLセグメントを取得パラメーターとして使用するように設計されており、そのアイデアに基づいて構築されています。

4
Joe

または、アクションシグネチャで予期されるパラメーターを指定するが、任意のGET引数として渡す場合。たとえば、フィルターを使用します。

パラメーターなしでルートを作成します。

$Route::get('/history', ['uses'=>'ExampleController@history']);

2つのパラメーターでアクションを指定し、フィルターを添付します。

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);
});
0
b.b3rn4rd

ルーター

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

コントローラ

class SearchController extends BaseController {

    public function search(Request $request){

        $id= $request->id ; // or any params

        ...
    }
}
0
Ayoub Bousetta