Migration + Model ContactMessage

Категорія: Laravel | 04.09.2026 10:12
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