Параметры контроллера через URL или POST - PullRequest
0 голосов
/ 10 января 2019

Я использую laravel для доставки страницы поиска со следующими маршрутами:

Route::get('/search', 'PagesController@search');
Route::get('/search/{q}', 'PagesController@search');
Route::post('/search', 'PagesController@search');

Первый маршрут обрабатывает посещение страницы поиска, на которой должна отображаться форма поиска. Второй маршрут ожидает параметр в URL, который позволяет создавать закладки для поиска. Третий маршрут получает форму с первой страницы в виде POST и обрабатывает поиск.

Каждый из трех маршрутов пытается использовать одну функцию в PagesController.

public function search(Request $request)
{
    if ($request->has('q')) {
        $q = $request->input('q');
    }

    if ($q) {
        $models = Model::where('name', 'LIKE', "%{$q}%") 
                ->orderBy('name', 'desc')
                ->take(10)
                ->get();

        return view('pages.search', [ 'models' => $models, 'query' => $q ]);
    }

    return view ('home')->withMessage('No Details found. Try to search again !');       
}

Мой вопрос: как мне заставить единственную функцию Контроллера обрабатывать три маршрута? Чтобы передать {q} из URL-адреса, я думаю, что мне нужно добавить еще один параметр в функцию поиска, но в этом случае происходит сбой на двух маршрутах, которые не имеют {q}.

В этой ситуации это отдельная функция для каждого типа ответа?

1 Ответ

0 голосов
/ 10 января 2019

Чтобы сохранить код в чистоте, я бы предложил сделать отдельные функции. Один для отображения формы, один для POST и один для закладки. Его немного легче поддерживать, чем ветки if, и немного легче читать.

Однако, чтобы напрямую ответить на ваш вопрос, вы можете сохранить все это в одном, если хотите. Просто добавьте необязательный параметр в метод следующим образом:

public function search(Request $request, $q = false){}

Если для $q по умолчанию задано значение false, входящие маршруты без переменной не будут завершаться ошибкой. Также допускается простая проверка if (if($q)...).

НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...