Как передать параметры GET для Laravel с помощью метода GET?

Я застрял в этой самой простой форме, чего я не смог выполнить, и я хочу создать форму поиска с текстовым вводом и двумя элементами управления, с маршрутом, который принимает 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' => '[email protected]']);

Когда я отправляю форму, она перенаправляет меня на

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

Как я могу передать эти параметры на мой маршрут с помощью Laravel и без Javascript!: D

Ответы

Ответ 1

Самый простой способ - просто принять входящий запрос и извлечь нужные переменные в контроллере:

Route::get('search', ['as' => 'search', 'uses' => '[email protected]']);

а затем в [email protected]:

class SearchController extends BaseController {

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

        // do things with them...
    }
}

Полезно, что вы можете установить значения по умолчанию в Input::get() если ничего не передано вашему действию Controller.

Как говорит joe_archer, нет необходимости помещать эти термины в URL, и это может быть лучше как POST (в этом случае вам следует обновить ваш вызов Form::open() а также ваш поисковый маршрут в route.php - Input::get() остается прежним)

Ответ 2

Я тоже боролся с этим и, наконец, получил его на работу.

routes.php

Route::get('people', '[email protected]');
Route::get('people/{lastName}', '[email protected]');
Route::get('people/{lastName}/{firstName}', '[email protected]');
Route::post('people', '[email protected]');

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

У меня была такая же проблема. Мне нужно показать URL-адрес поисковой системы

Я использую два маршрута, подобные этому

Route::get('buscar/{nom}', '[email protected]');

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

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

   return Redirect::action('[email protected]', array('nom'=>$bsqd));

});

Сначала используется для отображения URL-адреса, как мы хотим

Второй, который используется формой и перенаправляется на первый

Ответ 4

Итак, вы пытаетесь найти поисковый запрос и категорию в URL?

Я бы посоветовал это сделать, поскольку вам придется иметь дело с многословными поисковыми терминами и т.д., и может закончиться всевозможными неприятностями с запрещенными символами.

Я бы предложил POSTing данные, дезинфицируя его, а затем возвращая страницу результатов.

Маршрутизация Laravel не предназначена для приема запросов GET из форм, она предназначена для использования сегментов URL в качестве параметров получения и построена вокруг этой идеи.

Ответ 5

Альтернатива msturdy solution использует запрос вспомогательного метода, доступный для вы.

Это работает точно так же, без необходимости импортировать пространство имен Input use Illuminate\Support\Facades\Input в верхней части вашего контроллера.

Например:

class SearchController extends BaseController {

    public function search()
    {
        $category = request('category', 'default');
        $term = request('term'); // no default defined

        ...
    }
}

Ответ 6

В качестве альтернативы, если вы хотите указать ожидаемые параметры в сигнатуре действия, но передайте их как произвольные аргументы GET. Используйте фильтры, например:

Создайте маршрут без параметров:

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

Задайте действие с двумя параметрами и прикрепите фильтр:

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

Ответ 7

маршрутизатор

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

контроллер

class SearchController extends BaseController {

    public function search(Request $request){

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

        ...
    }
}