Если ты всё ещё пишешь формы на чистом JS, страдая от валидации, стейтов и прочей фронтовой дряни — сочувствую. Но есть способ не ковыряться в этом болоте. Livewire. Да, это не серебряная пуля, но если тебе надо просто собрать форму и не хочется лезть в Vue или React — оно работает. Не идеально, но работает. 

Ниже — как сделать форму, которая не бесит. Без поучений, без “вот тут волшебство происходит”. Только то, что реально нужно, чтобы не тратить лишние часы на очевидное.

Как всё это выглядит на практике

1. Установка

Если ты ещё не поставил Livewire — значит, ты либо только что проснулся, либо у тебя странные приоритеты. Вбей:

bash

composer require livewire/livewire

И не спрашивай, зачем. Просто поставь. Это как кофе с утра — не обсуждается.

2. Компонент

Создаём компонент. Название можешь придумать сам, но если фантазии нет — пусть будет contact-form.

bash

php artisan make:livewire contact-form

Laravel тебе накидает два файла:

  • app/Http/Livewire/ContactForm.php — тут логика
  • resources/views/livewire/contact-form.blade.php — тут верстка

Если ты не знаешь, где эти файлы — иди спать. Или открой IDE, наконец.

3. Логика формы

Вот тебе минимальный набор, чтобы не выглядеть как идиот:

php

namespace App\Http\Livewire;

use Livewire\Component;

class ContactForm extends Component
{
    public $name;
    public $email;
    public $message;

    public function submit()
    {
        // Тут ты можешь делать что угодно: писать в базу, слать письма, материться
        $this->reset(['name', 'email', 'message']);
    }

    public function render()
    {
        return view('livewire.contact-form');
    }
}

Да, это всё. Никаких сервисов, никаких DI, никаких “чистых архитектур”. Просто работай.

4. Верстка

Вот тебе Blade-шаблон. Без Tailwind, без Bootstrap, без соплей. Просто HTML, который не вызывает рвотный рефлекс:

html

<div>
    <form wire:submit.prevent="submit">
        <input type="text" wire:model="name" placeholder="Имя">
        <input type="email" wire:model="email" placeholder="Email">
        <textarea wire:model="message" placeholder="Сообщение"></textarea>
        <button type="submit">Отправить</button>
    </form> 
</div> 

Если тебе хочется добавить стили — добавь. Но не надо спрашивать, “а как сделать красиво?” — это не тут.

5. Вставка в шаблон

Хочешь, чтобы форма появилась на странице? Вставь:

blade

@livewire('contact-form')

Всё. Никаких Vue-компонентов, никаких npm install, никаких “сборок”. Просто Blade и Livewire. Как в старые добрые, когда фронт не был отдельной религией.

6. Проверка

Открой браузер. Заполни форму. Нажми кнопку. Если не работает — проверь консоль, проверь логи, проверь, не забыл ли ты включить Livewire в шаблоне. Если всё равно не работает — иди курить, потом разберёшься.

Что дальше?

Livewire — это не панацея. Он ломается. Он глючит. Иногда он делает вещи, которые ты не просил. Но если тебе надо быстро собрать форму, не лезть в JS и не страдать — он спасает. Особенно, если ты не хочешь превращать проект в SPA ради одной формы.

Можно добавить валидацию, можно слать письма, можно писать в базу. Всё это делается в компоненте. Никаких “состояний”, никаких “сигналов”, никаких “эффектов”. Просто PHP. Просто Blade. Просто работает.

Вывод

Если ты в Laravel и тебе надо форма — Livewire норм. Не идеал, не шедевр, но рабочий инструмент. Не надо читать туториалы на 40 минут, не надо смотреть видео с “экспертами”. Просто поставь, напиши, проверь. Всё остальное — от лукавого.