• Bỏ qua primary navigation
  • Skip to main content
  • Bỏ qua primary sidebar

Thủ thuật thiết kế website

Chia sẻ kinh nghiệm thiết kế website

  • Trang chủ
  • Joomla
    • Thủ thuật Joomla
    • Joomla Extensions
    • Joomla Themes
  • WordPress
    • Thủ thuật WordPress
    • WordPress Plugins
    • WordPress Themes
  • PHP Framework
    • Codeigniter
    • Laravel
    • Laminas
  • App Developer
    • React Native
    • Flutter
  • SEO
  • Chia sẻ
  • Phần mềm
Bạn đang ở:Trang chủ / PHP Framework / Laravel / Thiết kế cấu trúc folder HMVC cho Laravel

Thiết kế cấu trúc folder HMVC cho Laravel

14/12/2024 - Administrator Để lại bình luận

Ở bài viết này mình sẽ hướng dẫn bạn bắt đầu xây dựng một ứng dụng HMVC với Laravel, và tận dụng sức mạnh của Composer khi quản lí modules.

Thiết kế cấu trúc folder HMVC cho Laravel

Tạo mới một dự án Laravel

Khởi tạo một dự án Laravel mới bằng dòng lệnh sau

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ composer create-project --prefer-dist laravel/laravel hmvc-project
$ cd hmvc-project
$ composer create-project --prefer-dist laravel/laravel hmvc-project $ cd hmvc-project
$ composer create-project --prefer-dist laravel/laravel hmvc-project
$ cd hmvc-project

Lúc này cấu trúc thư mục của chúng ta sẽ có dạng như thế này

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
|- app/
|- Console/
|- Exceptions/
|- Http/
|- Providers/
User.php
|- bootstrap/
|- config/
|- database/
|- public/
|- resources
|- routes/
|- storages/
|- tests/
|- vendor/
...
|- app/ |- Console/ |- Exceptions/ |- Http/ |- Providers/ User.php |- bootstrap/ |- config/ |- database/ |- public/ |- resources |- routes/ |- storages/ |- tests/ |- vendor/ ...
|- app/
    |- Console/
    |- Exceptions/
    |- Http/
    |- Providers/
    User.php
|- bootstrap/
|- config/
|- database/
|- public/
|- resources
|- routes/
|- storages/
|- tests/
|- vendor/
...

Khởi tạo thư mục chứa các modules HMVC

Chúng ta sẽ cố gắng không sử dụng cấu trúc thư mục mặc định để tránh tối đa sự xung đột hoặc khó khăn lúc nâng cấp lên các phiên bản cao hơn khi mà Laravel định kỳ release 6 tháng một lần. Điều này cũng giúp bạn đạt được sự thuận tiện tối đa khi tích hợp vào một dự án sẵn có.

Từ thư mục Laravel gốc, bạn tạo các thư mục tương ứng qua các dòng lệnh sau:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ mkdir platform
$ mkdir platform/core
$ mkdir platform/plugins
$ mkdir platform/themes
$ mkdir platform $ mkdir platform/core $ mkdir platform/plugins $ mkdir platform/themes
$ mkdir platform
$ mkdir platform/core
$ mkdir platform/plugins
$ mkdir platform/themes

Lúc này chúng ta sẽ có cấu trúc thư mục như sau

Tất cả source code của chúng ta sẽ được gói gọn bên trong folder platform.

  • core: chứa tất cả các modules không thể thiếu để có thể khởi chạy ứng dụng.
  • plugins: chứa các modules được thực thi dưới dạng trình cắm. Khi chúng ta xóa bỏ hoặc vô hiệu hóa chúng ra khỏi composer.json thì chúng sẽ không được khởi chạy, nhưng cũng không ảnh hưởng đến hệ thống hiện tại.
  • themes: chứa danh sách các themes của hệ thống. Một thời điểm chỉ nên có một theme được kích hoạt. Theme sẽ là phần sử dụng các modules core và plugins để hiển thị dữ liệu và thao tác với người dùng.

Chỉnh sửa file composer.json

Thêm đoạn khai báo sau vào trong file composer.json từ thư mục gốc của dự án. Đoạn khai báo này giúp composer biết được nơi tìm kiếm các custom module của bạn.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
"repositories": [
{
"type": "path",
"url": "./platform/core/*"
},
{
"type": "path",
"url": "./platform/plugins/*"
},
{
"type": "path",
"url": "./platform/themes/*"
}
]
"repositories": [ { "type": "path", "url": "./platform/core/*" }, { "type": "path", "url": "./platform/plugins/*" }, { "type": "path", "url": "./platform/themes/*" } ]
"repositories": [
    {
        "type": "path",
        "url": "./platform/core/*"
    },
    {
        "type": "path",
        "url": "./platform/plugins/*"
    },
    {
        "type": "path",
        "url": "./platform/themes/*"
    }
]

Cấu trúc một module trong dự án sẽ tương tự một Laravel pakage. Bạn có thể tham khảo thêm ở liên kết https://laravel.com/docs/7.x/packages.

Từ thư mục platform/plugins, bạn cần tạo ra cấu trúc thư mục như sau:

Việc tạo ra một cấu trúc như vầy khá là tốn công sức, nên mình có viết một Laravel package giúp các bạn thực hiện việc này nhanh chóng ^_^

Bạn mở cửa sổ terminal từ thư mục gốc dự án và thực thi dòng lệnh:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ composer require duyphan2502/hmvc-tools
$ composer require duyphan2502/hmvc-tools
$ composer require duyphan2502/hmvc-tools

Mình có hỗ trợ một số lệnh như:

  • Tạo một module mới
  • Tạo các tập tin thường hay sử dụng, ví dụ như controller, request, middleware, migration, facade, view composer…

Bạn có thể xem tài liệu hướng dẫn kỹ hơn ở liên kết sau https://github.com/duyphan2502/hmvc-tools.

Để tạo ra module mới, từ cửa sổ terminal bạn thực thi câu lệnh:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ php artisan module:create test-module
$ php artisan module:create test-module
$ php artisan module:create test-module

Hệ thống sẽ gợi ý bạn chỉ định loại module mà bạn muốn khởi tạo. Ở đây bạn sẽ chọn plugins.

Khi mở tập tin composer.json trong thư mục platform/plugins/test-module, bạn sẽ thấy đoạn khai báo sau:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
{
"name": "plugins/test-module",
"require": {},
"require-dev": {},
"autoload": {
"psr-4": {
"TestModule": "src/"
}
},
"extra": [],
"minimum-stability": "dev",
"description": "Test HMVC module"
}
{ "name": "plugins/test-module", "require": {}, "require-dev": {}, "autoload": { "psr-4": { "TestModule": "src/" } }, "extra": [], "minimum-stability": "dev", "description": "Test HMVC module" }
{
    "name": "plugins/test-module",
    "require": {},
    "require-dev": {},
    "autoload": {
        "psr-4": {
            "TestModule": "src/"
        }
    },
    "extra": [],
    "minimum-stability": "dev",
    "description": "Test HMVC module"
}

Bạn cũng đừng quên đăng ký provider TestModuleProvidersModuleServiceProvider:class vào config/app.php trong thư mục gốc.

Nếu bạn không muốn đăng ký một cách thủ công như vậy, bạn có thể đăng ký auto register cho Laravel bằng cách cập nhật lại tập tin platform/plugins/test-module/composer.json.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
{
...,
"extra": {
"laravel": {
"providers": [
"TestModuleProvidersModuleServiceProvider"
]
}
},
}
{ ..., "extra": { "laravel": { "providers": [ "TestModuleProvidersModuleServiceProvider" ] } }, }
{
    ...,
    "extra": {
        "laravel": {
            "providers": [
                "TestModuleProvidersModuleServiceProvider"
            ]
        }
    },
}

Tiếp theo, chúng ta sẽ khai báo module này vào composer.json của dự án bằng dòng lệnh:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ composer require plugins/test-module:*
$ composer require plugins/test-module:*
$ composer require plugins/test-module:*

Khởi tạo một controller mới cho module của chúng ta:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ php artisan module:make:controller test-module Test --resource
$ php artisan module:make:controller test-module Test --resource
$ php artisan module:make:controller test-module Test --resource

Mở tập tin platform/plugins/test-module/routes/web.php và cập nhật thông tin route:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
use IlluminateRoutingRouter;
use IlluminateSupportFacadesRoute;
$moduleRoute = 'test-module';
Route::group(['prefix' => $moduleRoute], function (Router $router) {
$router->resource('', 'TestController');
});
use IlluminateRoutingRouter; use IlluminateSupportFacadesRoute; $moduleRoute = 'test-module'; Route::group(['prefix' => $moduleRoute], function (Router $router) { $router->resource('', 'TestController'); });
use IlluminateRoutingRouter;
use IlluminateSupportFacadesRoute;

$moduleRoute = 'test-module';

Route::group(['prefix' => $moduleRoute], function (Router $router) {
    $router->resource('', 'TestController');
});

Tiếp theo, tạo ra một tập tin platform/plugins/test-module/resources/views/index.blade.php và cập nhật nội dung cho nó như sau

Đến đây, mọi thứ cơ bản đã hoàn thành. Chúng ta bắt đầu kiểm tra xem module mới tạo đã hoạt động đúng chưa.

Từ terminal, thực thi câu lệnh:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ php artisan serve
Laravel development server started: http://127.0.0.1:8000
$ php artisan serve Laravel development server started: http://127.0.0.1:8000
$ php artisan serve
Laravel development server started: http://127.0.0.1:8000

Mở trình duyệt của bạn lên và truy cập theo đường dẫn http://127.0.0.1:8000/test-module.

Các bạn có thể tải xuống mã nguồn của bản demo này theo link sau https://github.com/duyphan2502/demo-hmvc.

Tổng kết

Bạn có thể thấy rằng, bản chất của module chính là một ứng dụng Laravel thu nhỏ, với đầy đủ các thành phần như Controller, Model, Provider,…

Phía trên chỉ là một ví dụ khá đơn giản, khi mà chỉ có một plugin duy nhất.

Bên dưới là cấu trúc mà CMS mà mình đang xây dựng thực tế (Webed CMS).

Đây cũng là CMS mà blog này đang sử dụng.

Tất cả các core modules sẽ được require bởi module core/base, composer.json ở thư mục gốc chỉ cần require core/base là đủ. Bạn cũng cần đảm bảo việc các plugins được load sau core modules bằng cách require core/base ở các composer.json của plugins.

Do kiến trúc đã được định nghĩa ngay từ đầu, nên khi có lỗi ở đâu đó xảy ra, mình và đồng nghiệp rất dễ dàng debug và tìm ra root cause. Khi dự án lớn dần thì cũng dễ dàng kiểm soát và mở rộng hơn. Việc merge code giữa các team hoặc thành viên trong nhóm cũng trở nên đơn giản nhiều.

Ví dụ như mình cần một bạn trong nhóm phát triển tính năng tích hợp hệ thống với GHN thì bạn đó sẽ làm việc trên một module riêng biệt, không tác động tới những phần khác. Thậm chí việc loại bỏ một module cũng dễ dàng khi chỉ cần xóa nó ra khỏi composer.json.

Kết thúc chương trình truyền hình đến đây là hết 😀 hẹn gặp lại các bạn trong các series chọc phá laravel sắp tới. Nếu các bạn có ý kiến hay đóng góp về bài viết thì để lại bình luận bên dưới nhé.

Cám ơn các bạn đã theo dõi.

Nguồn : https://duypt.dev/thiet-ke-cau-truc-folder-hmvc-cho-laravel

0 0 đánh giá
Article Rating
Theo dõi
Đăng nhập
Thông báo của
guest


guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất
Phản hồi nội tuyến
Xem tất cả bình luận

Sidebar chính

LỜI NGỎ

Đây là blog cá nhân, cung cấp các thông tin, kiến thức và kinh nghiệm về lập trình và cuộc sống. Những bài viết được mình sưu tập từ nhiều nguồn, mọi chi tiết liên quan đến bản quyền xin vui lòng liên hệ qua email kairu2607@gmail.com ! Cám ơn rất nhiều.

Tìm kiếm

Thủ thuật Wordpress

T

Tạo trang chuyển hướng download cho WordPress

[flatsome ] Text Ticker (fade) For Top Bar In Flatsome Theme

[Flatsome] Text Ticker (Fade) for Top Bar in Flatsome Theme

Định Dạng ảnh Webp Là Gì ? Làm Thế Nào để Sử Dụng Webp Trên Wordpress 2024 Mới Nhất ?

Định dạng ảnh WebP là gì ? Làm thế nào để sử dụng WebP trên WordPress 2024 mới nhất ?

X

Xử Lý Lỗi Không Xem Được Giỏ Hàng Và Thanh Toán Woocommerce Website WordPress

Vì Sao Rank Math Vượt Trội – SEO WordPress 2023

Hướng Dẫn Ghi đè (override) Folder Inc Trong Child Theme Flatsome

Hướng dẫn ghi đè (override) folder INC trong child-theme Flatsome

Hướng Dẫn Quản Lý Trang Trong Website WordPress

Laravel

Một số câu hỏi câu hỏi phổ biến phỏng vấn tuyển dụng lập trình viên Laravel

Thiết kế cấu trúc folder HMVC cho Laravel

Tại sao lại sử dụng Laravel Service và Repository Pattern?

[Laravel 7] Tổ chức theo dạng Package/Module trong ứng dụng Laravel – P3: khai báo config, translation, helpers và migrations

[Laravel 7] Tổ chức theo dạng Package/Module trong ứng dụng Laravel – P2: Route và mô hình MVC

[Laravel 7] Tổ chức theo dạng Package/Module trong ứng dụng Laravel – P1: Giới thiệu và khởi tạo cấu trúc thư mục cơ bản

Codeigniter Framework

[CodeIgniter 4] Codeigniter 4 Remove Public and Index.php From URL

[CodeIgniter 4] How to upload Codeigniter 4 website on share hosting?

Sửa lỗi website Codeigniter 2.x không chạy được với PHP 7.x

[CodeIgniter 4] Sử dụng cURL trong CodeIgniter 4

[CodeIgniter 4] Sử dụng cache để tăng tốc website trong CodeIgniter 4

[CodeIgniter 4] Xử lý hình ảnh chuyên nghiệp trong CodeIgniter 4

[CodeIgniter 4] Hướng dẫn gửi mail trong CodeIgniter 4

Dịch vụ Thiết Kế Website

Phần mềm hay

Hướng dẫn chuyển đổi php version trong ~/.zshrc ở MacOs

Tim Hieu Ve He Dieu Hanh Macos 1

Sửa file Hosts trong hệ điều hành MacOS

Hướng dẫn sử dụng phần mềm putty trên Windows

Switching between multiple PHP versions on macOS

Byebye Edge Chromium/Microsoft Edge

Copyright © 2025 · Metro Pro on Genesis Framework · WordPress · Đăng nhập

wpDiscuz