Migration + Model ContactMessage
Почнемо з Migration + Model ContactMessage.
php artisan make:model ContactMessage -m
Ця одна команда створить одразу два файли:
app/Models/ContactMessage.php
database/migrations/2026_09_04_074645_create_contact_messages_table.php
app/Models/ContactMessage.php
nano database/migrations/2026_09_04_074645_create_contact_messages_table.php
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('contact_messages', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email');
$table->string('subject');
$table->text('message');
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('contact_messages');
}
};
php artisan migrate
nano app/Models/ContactMessage.php
/*
Навіщо $fillable?
Це дуже важлива річ у Laravel.
ContactMessage::create([
'name' => 'Олексій',
'email' => 'test@example.com',
'subject' => 'Питання',
'message' => 'Текст повідомлення',
]);
*/
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class ContactMessage extends Model
{
protected $fillable = [
'name',
'email',
'subject',
'message',
];
}
----Перевірка ---
php artisan migrate:status
Migration name .................................................................................................................... Batch / Status
0001_01_01_000000_create_users_table ..................................................................................................... [1] Ran
0001_01_01_000001_create_cache_table ..................................................................................................... [1] Ran
0001_01_01_000002_create_jobs_table ...................................................................................................... [1] Ran
2026_09_01_124643_create_categories_table ................................................................................................ [2] Ran
2026_09_01_124659_create_articles_table .................................................................................................. [2] Ran
2026_09_04_074645_create_contact_messages_table .......................................................................................... [3] Ran
create_contact_messages_table
Крок 2. Створюємо Controller
Тепер нам потрібен Controller, який буде відповідати за сторінку зворотного зв'язку.
php artisan make:controller ContactController
nano app/Http/Controllers/ContactController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ContactController extends Controller
{
public function index()
{
return view('contact');
}
public function store(Request $request)
{
$validated = $request->validate([
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'email', 'max:255'],
'subject' => ['required', 'string', 'max:255'],
'message' => ['required', 'string', 'min:10'],
]);
dd($validated);
}
}
nano resources/views/contact.blade.php
@extends('layouts.app')
@section('title', 'Зворотний зв’язок')
@section('content')
<h1>Зворотний зв’язок</h1>
<form method="POST" action="{{ route('contact.store') }}">
@csrf
<div>
<label for="name">Ім'я</label>
<input
type="text"
id="name"
name="name"
value="{{ old('name') }}"
required
>
</div>
<div>
<label for="email">Email</label>
<input
type="email"
id="email"
name="email"
value="{{ old('email') }}"
required
>
</div>
<div>
<label for="subject">Тема</label>
<input
type="text"
id="subject"
name="subject"
value="{{ old('subject') }}"
required
>
</div>
<div>
<label for="message">Повідомлення</label>
<textarea
id="message"
name="message"
rows="8"
required
>{{ old('message') }}</textarea>
</div>
<button type="submit">
Надіслати
</button>
</form>
@endsection