🧭CRUD CHUẨN LARAVEL

Errors log:

  1. Cài Laravel trên host nhưng k phù hợp php version
  2. Dùng lệnh artisan trong Terminal nhưng chưa đứng trong thư mục chứa source Laravel
  3. Lỗi ABCController not found khi chạy artisan -> do thiếu khai báo namespace ở đầu file web.php


Dưới đây là 👉 LỘ TRÌNH 3 NGÀY – CRUD CHUẨN LARAVEL

Thiết kế cho người đã có nền tảng lập trình, học để làm thật, không lan man.


🧭 MỤC TIÊU SAU 3 NGÀY

✔ Hiểu chuẩn luồng Laravel
✔ Tự tay xây CRUD hoàn chỉnh
✔ Code đọc được – mở rộng được – không bừa
✔ Sẵn sàng làm app nội bộ / dashboard / CMS


📅 NGÀY 1 – NỀN TẢNG & CRUD CƠ BẢN (80%)

⏱️ ~2–3 giờ


🎯 Mục tiêu ngày 1

  • Hiểu luồng MVC

  • Làm CRUD chạy được

  • Không cần đẹp – chỉ cần đúng


🧩 1️⃣ Tạo project CRUD mẫu

Ví dụ: Post (id, title, content, status)

php artisan make:model Post -mcr

➡️ Tạo:

  • Model: app/Models/Post.php

  • Migration

  • Controller resource


🧱 2️⃣ Migration – Tạo bảng

Gõ đoạn code sau để tạo bảng trong file database/migrations/YYYMMDD_create_posts_table.php
Schema::create('posts', function (Blueprint $table) {
    $table->id();
    $table->string('title');
    $table->text('content');
    $table->boolean('status')->default(1);
    $table->timestamps();
});
php artisan migrate

🧠 3️⃣ Model – Khai báo dữ liệu

Vào file app/Models/Post.php
class Post extends Model {
    protected $fillable = ['title', 'content', 'status'];
}

📌 QUAN TRỌNG: không có $fillable = không insert/update được


🛣️ 4️⃣ Route resource

Vào file routes/web.php
Thêm namespace vào đầu trang:
use App\Http\Controllers\PostController;
Route::resource('posts', PostController::class);
hoặc viết đủ:

Route::resource('posts', \App\Http\Controllers\PostController::class);

Quay ra Terminal:
php artisan route:list

➡️ Hiểu 7 route chuẩn:

  • index, create, store

  • show

  • edit, update

  • destroy


🎮 5️⃣ Controller – CRUD logic

public function index() {
    $posts = Post::latest()->get();
    return view('posts.index', compact('posts'));
}
public function store(Request $request) {
    Post::create($request->all());
    return redirect()->route('posts.index');
}

📌 Ngày 1 chỉ cần chạy được


🎨 6️⃣ View – Blade cơ bản

resources/views/posts/
├── index.blade.php
├── create.blade.php
├── edit.blade.php
@foreach($posts as $post)
<tr>
  <td>{{ $post->title }}</td>
  <td>
    <a href="{{ route('posts.edit', $post) }}">Edit</a>
  </td>
</tr>
@endforeach

✅ KẾT THÚC NGÀY 1

✔ CRUD chạy
✔ Hiểu route → controller → model → view
✔ 80% dev Laravel dừng ở đây

Test view gõ: thumucLaravel/public/posts

muốn có data seed để hiển thị trong view blade vào file route/web.php


// 7️⃣ Route seed nhanh 10 posts
Route::get('/seed-posts', function() {
    for ($i = 1; $i <= 10; $i++) {
        Post::create([
            'title'   => "Seed Post $i",
            'content' => "This is content for seed post $i",
            'status'  => 1,
        ]);
    }
    return "✅ 10 posts seeded!";
});

Sau đó mở trình duyệt vào:


Thumuclaravel/public/seed-posts
Thumuclaravel/public/posts


📅 NGÀY 2 – CRUD CHUẨN CHỈNH (CODE SẠCH)

⏱️ ~3 giờ


🎯 Mục tiêu ngày 2

  • Code đúng chuẩn

  • Không để lỗi logic

  • Bắt đầu nghĩ như senior


🧪 1️⃣ Validation (BẮT BUỘC)

$request->validate([
    'title' => 'required|min:5',
    'content' => 'required',
]);

📌 Không validation = app nghiệp dư


🧠 2️⃣ Tách logic hợp lý

❌ Sai:

Post::create($request->all());

✅ Đúng:


Post::create($request->only(['title','content','status']));

🔁 3️⃣ Update & Delete chuẩn

public function update(Request $request, Post $post) {
    $post->update($request->only(['title','content','status']));
    return redirect()->route('posts.index');
}
public function destroy(Post $post) {
    $post->delete();
    return back();
}

🧱 4️⃣ Layout Blade

views/layouts/app.blade.php
<html>
<body>
  @yield('content')
</body>
</html>
@extends('layouts.app')
@section('content')

📌 View bắt đầu gọn & tái sử dụng


📄 5️⃣ Pagination

$posts = Post::paginate(10);
{{ $posts->links() }}

✅ KẾT THÚC NGÀY 2

✔ CRUD chuẩn chỉnh
✔ Code sạch hơn 80% tutorial ngoài kia
✔ Bắt đầu có kỷ luật Laravel


📅 NGÀY 3 – CRUD THỰC TẾ & MỞ RỘNG

⏱️ ~3 giờ


🎯 Mục tiêu ngày 3

  • Gần với app thật

  • Chuẩn bị cho dashboard / API


🔐 1️⃣ Middleware & Auth (nhẹ)

php artisan make:middleware IsAdmin
if (!auth()->check()) {
    abort(403);
}
Route::middleware('auth')->group(function () {
    Route::resource('posts', PostController::class);
});

🧩 2️⃣ Route Model Binding (HIỂU SÂU)

public function edit(Post $post)

📌 Laravel tự query → giảm code → giảm bug


🧠 3️⃣ Search & Filter

Post::when($request->q, function ($q) use ($request) {
    $q->where('title','like','%'.$request->q.'%');
});

🌐 4️⃣ Chuẩn bị API

return response()->json(Post::paginate(10));

📌 CRUD Web → CRUD API rất nhanh


🧱 5️⃣ Tư duy nâng cấp (KHÔNG CODE NGAY)

  • Repository pattern

  • Service layer

  • Policy & Gate

  • Soft delete

  • Observer


🏁 SAU 3 NGÀY – BẠN ĐANG Ở ĐÂU?

Kỹ năngTrạng thái
CRUD Laravel✅ Vững
MVC✅ Rõ
App nội bộ✅ Làm được
Dashboard✅ Sẵn sàng
App tài chính⚠️ Cần tối ưu thêm

🎯 GỢI Ý RIÊNG CHO TIẾN SĨ M

Bước tiếp theo hợp lý nhất:

  • 🔥 CRUD + DataTables

  • 🔥 Laravel API + frontend JS

  • 🔥 Laravel cho dashboard chứng khoán

  • 🔥 Kiến trúc Laravel + Python/Go xử lý nặng

👉 Tiến sĩ M chỉ cần nói “đi tiếp hướng X”, mình sẽ vẽ kiến trúc + code mẫu ngay 🚀

made by AI


Nếu chỉ copy mấy đoạn code CRUD ở trên thì:

CHẮC CHẮN không thấy data
Index trống trơn là đúng

👉 Vì thiếu 3 thứ sống còn mà tutorial hay “lờ đi”.

Giờ mình bóc thẳng nguyên nhân + sửa để CHẠY CHẮC 100%.


❌ VÌ SAO CRUD TRÊN “KHÔNG THẤY DATA”?

1️⃣ DB đang RỖNG

  • Mới migrate

  • Chưa insert dòng nào
    ➡️ Post::all() = []

2️⃣ Chưa có form CREATE

  • Không có nơi submit dữ liệu

  • Không có POST request

3️⃣ Chưa seed / factory

  • Không test data

  • Dev nhìn tưởng code sai

📌 Laravel không auto có data


✅ CÁCH LÀM CRUD “CHẮC CHẮN THẤY DATA”

🧩 BƯỚC 1 — Kiểm tra DB có kết nối chưa

.env

DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
php artisan migrate:status

👉 Nếu bảng posts có ✔ là OK


🧩 BƯỚC 2 — TẠO DATA NGAY (CÁCH NHANH NHẤT)

👉 Cách 1: Insert tay bằng Tinker (khuyên dùng)

php artisan tinker
Post::create([
  'title' => 'Bài viết test',
  'content' => 'Nội dung demo',
  'status' => 1
]);
Post::count();

➡️ Nếu ra 1100% có data


🧩 BƯỚC 3 — Controller PHẢI như này

use App\Models\Post;

public function index()
{
    $posts = Post::latest()->get();
    dd($posts); // 👈 TEST TẠI ĐÂY
}

👉 Nếu dd() ra array object → MODEL OK


🧩 BƯỚC 4 — View PHẢI in thử thô

resources/views/posts/index.blade.php

<h1>Danh sách bài viết</h1>

@if($posts->count() == 0)
    <p>❌ Chưa có dữ liệu</p>
@endif

@foreach($posts as $post)
    <p>{{ $post->id }} - {{ $post->title }}</p>
@endforeach

👉 Nếu chữ hiện ra → CRUD ĐÃ CHẠY


✅ CÁCH ĐÚNG CHUẨN DEV LÂU NĂM (SEED)

🧪 Factory

php artisan make:factory PostFactory

Thumuclaravel/database/factories/PostFactory.php

public function definition()
{
    return [
        'title' => fake()->sentence(),
        'content' => fake()->paragraph(),
        'status' => 1,
    ];
}
php artisan tinker
Post::factory()->count(10)->create();

➡️ Có ngay 10 record


🔥 CHECKLIST “NẾU KHÔNG THẤY DATA”

Kiểm traKết quả
migrate xong?
bảng có record?
Model có $fillable?
Controller gọi đúng Model?
View có foreach?

👉 Chỉ cần 1 dòng fail → trang trắng


🎯 NÓI THẲNG

Laravel KHÔNG bao giờ tự sinh data
CRUD chỉ là khung
Data phải:

  • seed

  • nhập tay

  • hoặc form

Tutorial hay làm dev ảo tưởng là có sẵn


👉 BƯỚC TIẾP THEO CHO TIẾN SĨ M

Mình có thể:
1️⃣ Viết CRUD TỐI THIỂU nhưng CHẮC CHẠY (1 file/controller)
2️⃣ CRUD + Form HTML đầy đủ
3️⃣ CRUD + DataTables (chuẩn dashboard)
4️⃣ CRUD + JSON API test bằng Postman

👉 Tiến sĩ M chọn 1 số, mình code đúng kiểu “copy chạy liền”.

✨🤖 made by AI

Nhận xét

Bài đăng phổ biến từ blog này

🌈 Tự Động Highlight Code Trong Blogger

🚀01 giờ học cách sử dụng Developer Console