Спростіть генерацію URL за допомогою нового методу query() у Laravel

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 09 квітня, 2025
Laravel пропонує елегантний підхід до генерації URL з параметрами запиту через новий метод query. Досліджте, як цей метод спрощує створення складних URL, зменшуючи повторення коду та помилки у статті

Laravel пропонує елегантніший підхід до генерації URL з параметрами запиту за допомогою нового методу query(). Цей спеціалізований API спрощує створення складних URL з рядками запиту, зменшуючи кількість повторюваного коду та можливі помилки.

// Генерує: http://localhost/products?sort=-name
url()->query('products', ['sort' => '-name']);

Метод query() приймає базовий шлях як перший аргумент та масив параметрів запиту як другий, обробляючи всі складнощі їх правильного поєднання та кодування у завершений URL.

// Прості пари ключ-значення
// http://localhost/products?sort=-name
url()->query('products', ['sort' => '-name']);
 
// Масиви як параметри (для фільтрів, колонок тощо)
// http://localhost/products?columns[0]=name&columns[1]=price&columns[2]=quantity
url()->query('products', ['columns' => ['name', 'price', 'quantity']]);
 
// Перезаписування існуючих параметрів
// http://localhost/products?sort=-price
url()->query('products?sort=-name', ['sort' => '-price']);
 
// Додавання параметрів до існуючих
// http://localhost/products?sort=-name&search=samsung
url()->query('products?sort=-name', ['search' => 'samsung']);

Цей метод особливо корисний при реалізації функцій, які потребують складних фільтрацій та сортировок. Наприклад, під час створення каталогу продуктів із динамічним фільтром:

class ProductController extends Controller
{
    public function index(Request $request)
    {
        $products = Product::query();
 
        // Застосування фільтрів на основі параметрів запиту
        if ($request->has('category')) {
            $products->where('category_id', $request->category);
        }
 
        // Застосування сортування
        if ($request->has('sort')) {
            $sort = $request->sort;
            $direction = str_starts_with($sort, '-') ? 'desc' : 'asc';
            $column = ltrim($sort, '-');
            $products->orderBy($column, $direction);
        }
 
        $products = $products->paginate(20);
 
        // Генерування URL наступної сторінки з усіма поточними фільтрами
        $nextPageUrl = null;
        if ($products->hasMorePages()) {
            $params = $request->query();
            $params['page'] = $products->currentPage() + 1;
            $nextPageUrl = url()->query('products', $params);
        }
 
        return view('products.index', [
            'products' => $products,
            'nextPageUrl' => $nextPageUrl,
            'filterUrl' => function($newParams) use ($request) {
                // Генерація URL для фільтрів, зберігаючи інші параметри
                $params = array_merge($request->query(), $newParams);
                return url()->query('products', $params);
            }
        ]);
    }
}

Регулярне використання методу query() у вашій програмі створює більш підтримувану кодову базу, усуваючи типові помилки, такі як неправильне кодування параметрів або випадкове перезаписування існуючих рядків запиту