Организация маршрута поиска в PHP-фреймворках

Раздел: Веб-фреймворки -> Маршрутизация

Маршрут поиска: основные подходы

Наиболее эффективное решение для организации маршрута поиска в PHP - использование современного веб-фреймворка с встроенной маршрутизацией, например Laravel. В этом случае маршрут определяется в файле routes/web.php и автоматически обрабатывает HTTP-запросы, валидацию и отправку ответа.


// routes/web.php в Laravel
Route::get('/search', [SearchController::class, 'index'])->name('search');

Index php uri (получение uri в index.php)

Контроллер принимает параметр запроса q и возвращает результаты. Такой подход гарантирует чёткую структуру, поддержку middleware, кэширование маршрутов и безопасность.


// app/Http/Controllers/SearchController.php
namespace App\Http\Controllers;

use Illuminate\Http\Request;

class SearchController extends Controller
{
    public function index(Request $request)
    {
        $query = $request->input('q');
        // поиск в базе данных
        $results = Product::where('name', 'like', "%{$query}%")->get();
        return view('search.results', compact('results', 'query'));
    }
}

Index php page url ru (url страницы index.php на русском)

Для формирования ссылки используется именованный маршрут: route('search', ['q' => 'футболка']).

Типичная ошибка: забыть экранировать пользовательский ввод. Рекомендуется использовать параметризованные запросы или ORM, как в примере выше. Также необходимо настроить fallback-маршрут для 404.

Как реализовать маршрут поиска без фреймворка, используя только PHP и .htaccess?

В простых проектах маршрутизация реализуется через единую точку входа (index.php) и файл .htaccess для перенаправления всех запросов.


// .htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?route=$1 [QSA,L]

Search index php route (маршрут поиска в php)


// index.php
$route = $_GET['route'] ?? '';
$method = $_SERVER['REQUEST_METHOD'];
if ($route === 'search' && $method === 'GET') {
    $q = $_GET['q'] ?? '';
    // ... обработка
} else {
    http_response_code(404);
    echo 'Страница не найдена';
}

Routes php (роутинг в php)

Проблема: прямое использование $_GET ведёт к XSS. Необходимо экранировать вывод. Также сложно поддерживать множество маршрутов.

Каким образом можно использовать компонент Symfony Routing для поискового маршрута?

Компонент symfony/routing позволяет создать автономную маршрутизацию без полного фреймворка. Установка через Composer: composer require symfony/routing.


// routes.php
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection;

$routes = new RouteCollection();
$routes->add('search', new Route('/search', [
    '_controller' => 'handleSearch'
]));
return $routes;

// front-controller.php
require_once __DIR__.'/vendor/autoload.php';

$request = Symfony\Component\HttpFoundation\Request::createFromGlobals();
$context = new Symfony\Component\Routing\RequestContext();
$context->fromRequest($request);

$matcher = new Symfony\Component\Routing\Matcher\UrlMatcher(include 'routes.php', $context);
try {
    $parameters = $matcher->match($request->getPathInfo());
    $controller = $parameters['_controller'];
    $controller($request);
} catch (Symfony\Component\Routing\Exception\ResourceNotFoundException $e) {
    http_response_code(404);
}

Распространённая ошибка: несоответствие метода запроса. Маршрут по умолчанию принимает любые методы. Для ограничения используется опция methods.

Каким способом можно организовать маршрут поиска с поддержкой SEO-дружественных URL, например /search/ключевое_слово?

Многие фреймворки поддерживают сегменты пути. В Laravel маршрут определяется с параметром:


Route::get('/search/{query}', [SearchController::class, 'show'])->where('query', '[a-zA-Zа-яА-Я0-9\-\_]+');

В контроллере параметр извлекается из $query аргумента метода. Такой URL более понятен поисковым системам.

Проблема: кириллические символы в URL нужно кодировать. Рекомендуется использовать транслитерацию или slug.

Расширенные примеры реализации маршрута поиска

Пример 1: Маршрут поиска в Laravel с пагинацией и фильтрацией.

Пример

// routes/web.php
Route::get('/search', [ProductSearchController::class, 'search'])->name('products.search');

// ProductSearchController.php
public function search(Request $request)
{
    $query = $request->input('q');
    $category = $request->input('category');
    $minPrice = $request->input('min_price');
    $maxPrice = $request->input('max_price');

    $products = Product::query()
        ->when($query, fn($q) => $q->where('name', 'like', "%{$query}%"))
        ->when($category, fn($q) => $q->where('category_id', $category))
        ->when($minPrice, fn($q) => $q->where('price', '>=', $minPrice))
        ->when($maxPrice, fn($q) => $q->where('price', '<=', $maxPrice))
        ->paginate(12);

    return view('catalog.search', compact('products', 'query'));
}
Результат: страница с результатами поиска и пагинацией. URL: /search?q=ноутбук&category=2&min_price=10000

Пример 2: Маршрут поиска в Symfony с использованием аннотаций.

Пример

// src/Controller/SearchController.php
use Symfony\Component\Routing\Annotation\Route;

class SearchController extends AbstractController
{
    /**
     * @Route("/search", name="app_search")
     */
    public function index(Request $request): Response
    {
        $query = $request->query->get('q');
        // поиск через Doctrine
        $results = $this->getDoctrine()
            ->getRepository(Product::class)
            ->findBySearchQuery($query);

        return $this->render('search/index.html.twig', [
            'results' => $results,
            'query' => $query
        ]);
    }
}
Результат: отображение списка продуктов по запросу. Маршрут работает как GET /search?q=...

Пример 3: Кастомная маршрутизация с использованием FastRoute (библиотека для простой маршрутизации).

Пример

// composer require nikic/fast-route
$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) {
    $r->addRoute('GET', '/search', 'handleSearch');
});

$httpMethod = $_SERVER['REQUEST_METHOD'];
$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);

$routeInfo = $dispatcher->dispatch($httpMethod, $uri);
switch ($routeInfo[0]) {
    case FastRoute\Dispatcher::FOUND:
        $handler = $routeInfo[1];
        $vars = $routeInfo[2];
        call_user_func($handler, $vars);
        break;
    case FastRoute\Dispatcher::NOT_FOUND:
        // 404
        break;
}
Результат: вызов функции handleSearch при обращении к /search. Поддерживает GET параметры.

Маршрут поиска в PHP - comments

En
Search index php route (php)