🧭CRUD CHUẨN LARAVEL
Errors log:
- Cài Laravel trên host nhưng k phù hợp php version
- Dùng lệnh artisan trong Terminal nhưng chưa đứng trong thư mục chứa source Laravel
- 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.phpMigration
Controller resource
🧱 2️⃣ Migration – Tạo bảng
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
class Post extends Model {
protected $fillable = ['title', 'content', 'status'];
}
📌 QUAN TRỌNG: không có $fillable = không insert/update được
🛣️ 4️⃣ Route resource
use App\Http\Controllers\PostController;
Route::resource('posts', PostController::class);hoặc viết đủ:
Quay ra Terminal:Route::resource('posts', \App\Http\Controllers\PostController::class);
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:
📅 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ăng | Trạ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 1 → 100% 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
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 tra | Kế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
Đăng nhận xét