Laravel là 1 PHP framework được thiết kế rất tốt theo mô hình MVC (Model - View - Controller) cho các dự án trung bình và nhỏ. Đối với các sự án lớn hoặc cần mở rộng, được nhiều người phát triển thì mô hình MVC bộc lộ một vài khuyết điểm, đáng kể nhất là khó quản lý code khi số lượng file trong model/view/controller tăng trưởng không ngừng.

Laravel đã cung cấp cho chúng ta khả năng module hoá sử dụng mô hình HMVC (Hierarchy - Model - View - Controller) để mỗi nhóm tính năng trỡ thành 1 module có cấu trúc MVC và routing riêng biệt nhằm thuận tiện cho việc quản lý.

Để thực hiện quá trình này chúng ta cần làm các bước sau:

Khai báo địa chỉ cấu hình module

Folder chứa các module tạm đặt tại app/Modules, lưu ý là Folder này không nhất thiết phải nằm trong folder app và cũng không nhất thiết có tên là Modules.

Sau khi tạo folder xong chúng ta sẽ khao báo folder này trong mục autoload/psr-4 ở file composer.json

"autoload": {
        "classmap": [
            "database"
        ],
        "psr-4": {
            "App\\": "app/",
            "Modules\\": "app/Modules/"
        }
},

Trong folder app/Modules, chúng ta sẽ tạo 1 service provider trong file ServiceProvider.php.

app/Modules/ServiceProvider.php sẽ có nội dung:

<?php

namespace App\Modules;
use File;


class ServiceProvider extends  \Illuminate\Support\ServiceProvider{
    public function boot(){
        $listModule = array_map('basename', File::directories(__DIR__));
        foreach ($listModule as $module) {
            if(file_exists(__DIR__.'/'.$module.'/routes.php')) {
                include __DIR__.'/'.$module.'/routes.php';
            }
            if(is_dir(__DIR__.'/'.$module.'/Views')) {
                $this->loadViewsFrom(__DIR__.'/'.$module.'/Views', $module);
            }
        }
    }
    public function register(){}
}

Khai báo service provider này trong config/app.php tại mục providers:

'providers' => [
    ...
    /*
     * Custom Service Providers...
     */
    'App\Modules\ServiceProvider',
]

Tiến hành tạo các module

Tạo một module tên là Category thì chúng ta cần có cấu trúc sau:

app/
└── Modules
    ├── Category
    │   ├── Controllsers
    │   │   └── CategoryController.php
    │   ├── Models
    │   │   └── Category.php
    │   ├── Views
    │   │   └── index.php
    │   └── routes.php
    └── ServiceProvider.php

Test thử tính năng

File CategoryController.php có nội dung:

<?php
namespace App\Modules\Category\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;


class CategoryController extends Controller{
    /**
     * Create a new authentication controller instance.
     *
     * @return void
     */
    public function __construct(){
        # parent::__construct();
    }
    public function index(Request $request){
        return view('Category::index');
    }
}

File index.php có nội dung:
<h1>Hello module</h1>
File routes.php có nội dung:

<?php
$namespace = 'App\Modules\Category\Controllers';
Route::group(
    ['module'=>'Category', 'namespace' => $namespace],
    function() {
        Route::get('category', [
            # middle here
            'as' => 'index',
            'uses' => 'CategoryController@index'
        ]);
    }
);

Cuối cùng là chạy thử trên trình duyệt:
http://yourdomain.dev/category

Nguồn: https://xivila.com/profile/tbson@gmail.com/blog/212/module-hoa-du-an-dung-laravel/