Bỏ qua đến nội dung chính

Mô hình MVC là gì? Cách hoạt động và ví dụ trong Laravel

Giải thích kiến trúc MVC (Model - View - Controller): vai trò từng thành phần, luồng xử lý một request, ví dụ code trong Laravel và ưu nhược điểm.

Tan Hien
Founder
Cập nhật 5 phút đọc
Chia sẻ:
Mô hình MVC là gì? Cách hoạt động và ví dụ trong Laravel
Nội dung bài viết
  1. 1.Ba thành phần của mô hình MVC
  2. 1.1Model: dữ liệu và nghiệp vụ
  3. 1.2View: giao diện hiển thị
  4. 1.3Controller: điều phối
  5. 2.Mô hình MVC hoạt động như thế nào?
  6. 3.Ví dụ MVC trong Laravel
  7. 3.1Model
  8. 3.2Route và Controller
  9. 3.3View (Blade)
  10. 4.Ưu điểm và nhược điểm của mô hình MVC
  11. 5.Những hiểu lầm thường gặp về MVC
  12. 6.Lịch sử ra đời của MVC
  13. 6.1Kinh nghiệm từ Hozitech

MVC (Model – View – Controller) là mẫu kiến trúc chia ứng dụng thành ba phần: Model quản lý dữ liệu và quy tắc nghiệp vụ, View hiển thị giao diện, Controller nhận yêu cầu của người dùng rồi điều phối giữa Model và View. Mô hình do Trygve Reenskaug đưa ra cuối thập niên 1970 tại Xerox PARC và nay là nền tảng của hầu hết framework web như Laravel, Rails, ASP.NET MVC.

Bài viết giải thích từng thành phần, luồng xử lý một request, ví dụ MVC trong Laravel bản hiện hành, ưu nhược điểm và những hiểu lầm thường gặp về MVC.

Sơ đồ luồng request theo mô hình MVC trong Laravel: route, controller, model, view, response
Một request đi qua route, controller, model và view trước khi trả về trình duyệt.

Ba thành phần của mô hình MVC

Model: dữ liệu và nghiệp vụ

Model biểu diễn dữ liệu của ứng dụng, độc lập với giao diện: đọc, ghi database, ràng buộc dữ liệu, quan hệ giữa các bảng, quy tắc tính toán (ví dụ tính tổng đơn hàng). Model không cần biết dữ liệu sẽ hiển thị ra trang web, ứng dụng di động hay file Excel.

View: giao diện hiển thị

View nhận dữ liệu đã chuẩn bị sẵn và trình bày cho người dùng: trang HTML, email, JSON… View không nên tự truy vấn database hay chứa logic nghiệp vụ phức tạp.

Controller: điều phối

Controller nhận đầu vào (URL, dữ liệu form), kiểm tra, gọi Model để lấy hoặc cập nhật dữ liệu, rồi chọn View phù hợp để trả về. Controller nên mỏng: logic nghiệp vụ nặng đặt ở Model hoặc lớp dịch vụ riêng.

Mô hình MVC hoạt động như thế nào?

  1. Người dùng mở một địa chỉ, ví dụ /bai-viet/mo-hinh-mvc.
  2. Bộ định tuyến (router) xác định Controller và phương thức xử lý URL đó.
  3. Controller gọi Model để lấy bài viết từ database.
  4. Controller truyền dữ liệu cho View.
  5. View dựng HTML và ứng dụng gửi về trình duyệt.

Trong Laravel, quá trình này nằm bên trong một vòng đời request đầy đủ hơn (service provider, middleware…), xem chi tiết ở bài vòng đời request trong Laravel.

Ví dụ MVC trong Laravel

Ví dụ dưới viết theo Laravel 13 (bản hiện hành). Trong dự án Laravel, model nằm ở app/Models, controller ở app/Http/Controllers, view ở resources/views, route ở routes/web.php. Tạo model kèm migration và controller bằng Artisan:

php artisan make:model Post --migration --controller

Model

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    protected $fillable = ['title', 'slug', 'body'];
}

Route và Controller

// routes/web.php
use App\Http\Controllers\PostController;

Route::get('/posts', [PostController::class, 'index'])->name('posts.index');
Route::get('/posts/{post:slug}', [PostController::class, 'show'])->name('posts.show');
<?php

namespace App\Http\Controllers;

use App\Models\Post;
use Illuminate\View\View;

class PostController extends Controller
{
    public function index(): View
    {
        return view('posts.index', [
            'posts' => Post::latest()->paginate(10),
        ]);
    }

    public function show(Post $post): View
    {
        return view('posts.show', ['post' => $post]);
    }
}

Tham số Post $post dùng route model binding: Laravel tự tìm bài viết theo slug trên URL và trả 404 nếu không có.

View (Blade)

{{-- resources/views/posts/index.blade.php --}}
<h1>Bài viết mới</h1>

@foreach ($posts as $post)
    <a href="{{ route('posts.show', $post->slug) }}">{{ $post->title }}</a>
@endforeach

{{ $posts->links() }}

Đi sâu từng phần qua các bài model trong Laravel, controller trong Laravel và view trong Laravel.

Ưu điểm và nhược điểm của mô hình MVC

Ưu điểmNhược điểm
Tách bạch trách nhiệm: sửa giao diện ít ảnh hưởng logic dữ liệu và ngược lại.Nhiều file, nhiều lớp hơn; với trang rất nhỏ có thể thấy rườm rà.
Nhiều người làm song song: người làm giao diện, người làm nghiệp vụ.Người mới phải hiểu luồng route → controller → model → view mới lần ra lỗi.
Dễ viết test cho Model và Controller riêng.Controller dễ "phình to" nếu dồn hết logic vào đó.
Một Model dùng lại cho nhiều View: trang web, API, email.Ứng dụng lớn thường cần thêm lớp (service, action, repository) ngoài ba thành phần gốc.

Những hiểu lầm thường gặp về MVC

  • "Model là database": Model là lớp biểu diễn dữ liệu và nghiệp vụ; database chỉ là nơi Model lưu trữ.
  • "Dùng MVC thì website chuẩn SEO hơn": MVC là cách tổ chức code phía máy chủ, không trực tiếp quyết định thứ hạng tìm kiếm. SEO phụ thuộc nội dung, tốc độ, cấu trúc HTML và URL.
  • "MVC giúp làm nhanh gấp nhiều lần": không có con số chung; MVC giúp dự án dễ bảo trì khi lớn dần, còn tốc độ làm phụ thuộc đội ngũ và framework.
  • "View được chứa logic thoải mái": View chỉ nên có vòng lặp, điều kiện hiển thị đơn giản.

Lịch sử ra đời của MVC

Trygve Reenskaug xây dựng MVC khi làm việc với Smalltalk-79 tại Trung tâm nghiên cứu Xerox PARC cuối thập niên 1970. Thiết kế ban đầu có bốn phần, sau thảo luận nhóm thống nhất còn ba thành phần như ngày nay (Wikipedia, truy cập 01/10/2026). Mẫu này phổ biến trong ứng dụng desktop trước, rồi được các framework web áp dụng rộng rãi.

Kinh nghiệm từ Hozitech

Website Hozitech chạy trên Laravel, tức tổ chức theo MVC. Một quy ước giúp dự án Laravel dễ bảo trì khi lớn dần: controller chỉ nhận request và trả response, kiểm tra dữ liệu bằng Form Request, logic nghiệp vụ dùng chung đặt trong lớp service riêng. Nhờ vậy khi cần thêm API cho ứng dụng di động, phần nghiệp vụ dùng lại được mà không viết lại. Nếu bạn mới bắt đầu, hãy đọc thêm Laravel là gì để thấy MVC được áp dụng trong một framework hoàn chỉnh.

Tan Hien

Về tác giả

Founder

Xin chào mình là Hiền hiện đang là Founder của Hozitech. Mình là kỹ sư phần mềm có hơn 9+ năm kinh nghiệm trong lĩnh vực thiết kế website, ứng dụng di động... Gần đây mình đang nghiên cứu thêm về lĩnh vực marketing. Mình rất vui khi được chia sẽ những kiến thức và kinh nghiệm của mình đến mọi người!

Câu hỏi thường gặp

Câu hỏi thường gặp

Sẵn sàng bắt đầu dự án của bạn?

Hãy để chúng tôi giúp bạn biến ý tưởng thành hiện thực. Đăng ký tư vấn miễn phí ngay hôm nay để nhận được giải pháp công nghệ tối ưu cho doanh nghiệp.