Скажем, я хочу иметь возможность отправить форму поиска на любой странице, которая будет добавлять ?s= к текущему URL-адресу, но возвращать SERP: https://example.com/my-page?s=foobar. (Я видел, как несколько сайтов делали это вместо того, чтобы указывать на /search?s=.* - не так, как я, но это иллюстрирует мой вопрос.)

В моих маршрутах Laravel web.php есть ли в настоящее время способ зарегистрировать это, кроме, возможно, использования нестабильного регулярного выражения?

<?php
Route::get('.+?\?.+?\bs={search}', 'SearchController@search');
// This regex is probably wrong, but you get what I was going for,
// and that kinda highlights why this is not an ideal way to do it
?>

Это становится еще более уродливым, когда, скажем, вы хотите захватить несколько параметров $ _GET:

https://example.com/my-page?s=foobar&dept=clothing

Я не нашел в документации Laravel ничего, что позволяло бы определять параметры строки запроса для параметра Route $uri. Рекомендуемый вариант - просто использовать красивые URL-адреса (https://example.com/search/foobar), но есть определенно допустимые варианты использования для хранения строк запроса.

1
Phil Tune 11 Дек 2018 в 22:43

2 ответа

Лучший ответ

1. Создайте промежуточное ПО (https://laravel.com/docs/5.7/middleware) 2: Подтвердите входящий запрос, используя $ request-> query ('s') 3: Если проверка прошла успешно, вернитесь к следующему, иначе перенаправьте куда угодно или отобразите ответ об ошибке

1
Rajeev Radhakrishnan 11 Дек 2018 в 19:54

Это очень просто, это зависит от частей URL-адреса. Класс Route использует «строку пути» URL-адреса, а вы пытаетесь использовать «параметры» URL-адреса.

https://doepud.co.uk/blog/anatomy-of-a-url

На современных веб-сайтах вы должны работать с этой структурой, потому что вы получаете лучшую структуру URL-адресов, и она намного лучше для SEO и поисковых систем.

Вы должны использовать параметры только в функции, которую вы вызываете, для небольших вещей, которые вы можете вызвать через метод $request->get('s');, но тогда вам нужно перенаправить или вам нужно работать с этой функцией.

Так что не сражайтесь с фреймворком и работайте в той структуре, что определено из фреймворка, и все люди, знающие фреймворк, знают, как с ним работать.

0
René Höhle 11 Дек 2018 в 20:00