Module hóa dự án dùng Laravel
Bài đăng này đã không được cập nhật trong 7 năm
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/
All rights reserved