HTML: Form GET/POST
Glossary overview

HTML: Form GET/POST

Делал фильтр с помощью spatie/laravel-query-builder.

Сделал форму в Blade шаблоне для отображения фильтра.

        <form method="GET" action="{{ route('post.index') }}" class="mb-6 flex gap-3">
            <input type="text" name="filter[title]" placeholder="Search title..."
                   value="{{ request('filter.title') }}"
                   class="border rounded px-3 py-1">
            <select name="filter[category_id]" class="border rounded px-3 py-1">
                <option value="">All categories</option>
                @foreach($categories as $category)
                    <option value="{{ $category->id }}"
                        @selected(request('filter.category_id') == $category->id)>
                        {{ $category->title }}
                    </option>
                @endforeach
            </select>
            <button class="bg-indigo-600 text-white px-4 py-1 rounded">Filter</button>
        </form>

Когда отправляю форму, получаю такой URL:

http://domain.com/posts?filter%5Btitle%5D=ab&filter%5Bcategory_id%5D=1

Как GET параметры подставились в URL?

У полей в форме есть атрибут name с квадратными скобками filter[title], filter[category_id].

Когда нажимаем кнопку Filter, браузер берёт name и value всех <input> и <select> и превращает их в GET-параметры. Это дефолтное поведение. Так происходит всегда, когда метод формы = GET.

 <input type="text" name="filter[title]" placeholder="Search title..."
                   value="{{ request('filter.title') }}"
                   class="border rounded px-3 py-1">

<select name="filter[category_id]" class="border rounded px-3 py-1">
                <option value="">All categories</option>
                @foreach($categories as $category)
                    <option value="{{ $category->id }}"
                        @selected(request('filter.category_id') == $category->id)>
                        {{ $category->title }}
                    </option>
                @endforeach
</select>

Например, если ты вводишь:

title = ab
category_id = 2

то браузер отправит запрос на:

/posts?filter[title]=ab&filter[category_id]=2

Это поведение определено стандартом HTML и не зависит от Laravel, JavaScript и т.д.
— Оно происходит всегда, когда метод формы = GET.

Если мы поменяем нейминг полей в форме, например на “test-field”, то в URL подставится GET параметр “?test-field=…”.

            <input type="text" name="test-field" placeholder="Search title..."

/// URL
http://laravel-course.test/posts?test-field=ab&filter%5Bcategory_id%5D=1

Что происходит при POST

Если ты поменяешь на:

<form method="POST" action="/posts">

то браузер не добавит параметры в URL, а отправит их в теле запроса (request body) в формате application/x-www-form-urlencoded.

Laravel при этом получит те же данные, просто они будут не в $_GET, а в $_POST.