Lập trình viên như chúng ta thì hầu như ko người nào là ko biết về mẫu hình MVC (Model – View – Controller). Đây cũng là một trong những mẫu hình được vận dụng trong hồ hết những ứng dụng web. Những framework PHP phổ quát lúc này đều đang vận dụng mẫu hình này và Laravel cũng vậy.
Mẫu hình MVC của Laravel cung cấp rất tốt cho những dự án công trình khoảng và nhỏ, tuy rằng nhiên, với những dự án công trình to hoặc cần mở bát ngát với nhiều người tăng trưởng thì mẫu hình MVC lại thể hiện một vài ba thiếu sót, nên nói nhất đó là không dễ quản lý và vận hành số con số code lúc chúng được tạo thêm ko ngừng.
Để khắc phục vấn đề này, Laravel vẫn hỗ trợ cho chúng ta năng lực Module hóa dùng mẫu hình HMVC (Hierarchy – Model – View – Controller). HMVC hỗ trợ chúng ta chia từng tính tăng thành những group với cấu trúc MVC và Routing riêng lẻ khi đó hỗ trợ chúng ta dễ dàng dang quản lý và vận hành code na ná năng lực mở bát ngát trong sau này.
Để tạo một Module cơ phiên bản theo mẫu hình HMVC thì chúng ta cần làm những bước sau:
1. Khai báo lúc đầu và khởi tạo ServiceProvider
1.1 Khai báo Thư mục chứa Modules
Chúng ta sẽ đặt Thư mục chứa Modules tại thư mục root của ứng dụng và đặt tên là “modules”, xem xét là Thư mục này ko nhất quyết phải đặt tại thư mục root và cũng ko nhất quyết với tên là “modules”.
Lúc tạo xong chúng ta sẽ khai báo trong mục “autoload/psr-4” ở file “composer.json”
“autoload”: { “psr-4”: { “App”: “app/”, “modules”: “modules/” }, “classmap”: [ “database/seeds”, “database/factories” ] },
Ở đầu cuối chạy “composer dump-autoload” để hoàn thành khai báo.
1.2 Khởi tạo và khai báo ServiceProvider
Chúng ta sẽ tạo file “ModuleServiceProvider.php” đặt tại thư mục “modules” vừa tạo và nó với nội dung như sau:
<?php namespace modules; use IlluminateSupportServiceProvider; use File; class ModuleServiceProvider extends ServiceProvider { public function register() {} public function boot(){} }
Để hoàn thành quy trình khai báo thì chúng ta cần một bước ở đầu cuối nữa đấy là khai báo trong “config/app.php” tại mục “providers”:
‘providers’ => [ … /* * Custom Service Providers… */ ‘AppModulesServiceProvider’, ]
2. Tạo Module cùng với khai báo ServiceProvider ứng
2.1 Cấu trúc Module cơ phiên bản
Một module cơ phiên bản sẽ bao gồm với cấu trúc thư mục như sau:
modules ├── Demo │ ├── configs │ │ └── demo.php │ ├── migrations │ ├── resources │ │ └── lang │ │ └── views │ ├── routes │ │ └── routes.php │ ├── src │ │ └── Commands │ │ └── Http │ │ | └── Controllers │ │ | └── Middlewares │ │ └── Models ├── Demo2 │ ├── … └── ModuleServiceProvider.php
PS: Những thư mục trên ko nhất quyết cần thiết nhưng mà nó còn tùy từng modules đấy với sài thường ko.
2.2 Khai báo ServiceProvider để với thể load được toàn thể modules
Chúng ta sẽ ghi chú lại khai báo cho toàn thể những thành phần với trong module theo đoạn code sau đây:
<?php namespace modules; use IlluminateSupportServiceProvider; use File; class ModuleServiceProvider extends ServiceProvider { public function register() {} public function boot(){ // Đăng ký modules theo cấu trúc thư mục $directories = array_map(‘basename’, File::directories(__DIR__)); foreach ($directories as $moduleName) { $this->registerModule($moduleName); } } // Khai báo đăng ký cho từng modules private function registerModule($moduleName) { $modulePath = __DIR__ . “/$moduleName/”; // Khai báo thành phần ở đây } }
3. Khai báo những thành phần với tại cấu trúc thư mục
3.1 Khai báo routes, migrations, langs, views, helpers
Khai báo những thành phần của modules tại “modules/ModuleServiceProvider.php” và nó được đặt tại hàm “registerModule”.
private function registerModule($moduleName) { $modulePath = __DIR__ . “/$moduleName/”; // Khai báo route if (File::exists($modulePath . “routes/routes.php”)) { $this->loadRoutesFrom($modulePath . “routes/routes.php”); } // Khai báo migration // Toàn thể file migration của modules sẽ tự hoạt động được load if (File::exists($modulePath . “migrations”)) { $this->loadMigrationsFrom($modulePath . “migrations”); } // Khai báo languages if (File::exists($modulePath . “resources/lang”)) { // Đa tiếng nói theo file php // Sài đa tiếng nói tại file php resources/lang/en/general.php : @lang(‘Demo::general.hello’) $this->loadTranslationsFrom($modulePath . “resources/lang”, $moduleName); // Đa tiếng nói theo file json $this->loadJSONTranslationsFrom($modulePath . ‘resources/lang’); } // Khai báo views // Gọi view thì ta dùng: view(‘Demo::index’), @extends(‘Demo::index’), @include(‘Demo::index’) if (File::exists($modulePath . “resources/views”)) { $this->loadViewsFrom($modulePath . “resources/views”, $moduleName); } // Khai báo helpers if (File::exists($modulePath . “helpers”)) { // Toàn bộ files với tại thư mục helpers $helper_dir = File::allFiles($modulePath . “helpers”); // khai báo helpers foreach ($helper_dir as $key => $value) { $file = $value->getPathName(); require $file; } } }
2.2 configs
Để với thể dùng configs thì chúng ta cần khai báo tại function “register”
public function register() { … // Khai báo configs $configFile = [ ‘demo’ => __DIR__.’/Demo/configs/demo.php’, ]; foreach ($configFile as $alias => $path) { $this->mergeConfigFrom($path, $alias); } … }
Lúc khai báo như trên thì chúng ta với thể gọi config tại module như những config phổ biến khác, VD: config(‘demo’)
2.3 Middlewares
Để với thể dùng Middlewares thì chúng ta cần khai báo tại function “register”
public function register() { … // Khai báo middleare $middleare = [ // ‘key’ => ‘namespace của middleare’ ‘demo’ => ‘modulesDemosrcHttpControllersMiddlewaresDemoMiddleware’, ]; foreach ($middleare as $key => $value) { $this->app[‘router’]->pushMiddlewareToGroup($key, $value); } … }
2.4 Commands
Để với thể dùng commands thì chúng ta cần khai báo tại function “register”
public function register() { … // Khai báo commands $this->commands([ // namespace của commands đặt tại đây ‘modulesDemosrcHttpCommandsDemoCommand’ ]); … }
Tổng kết
Như những du khách với thể thấy những module được kiểu dáng theo mẫu hình HMVC như là một trong những ứng dụng Laravel thu nhỏ với toàn bộ những thành phần. Do cấu trúc thư mục vẫn được xây dựng và khái niệm ngay lập tức từ trên đầu nên lúc với lỗi xảy ra chúng ta cũng dễ dàng dàng tìm ra lỗi và fix chúng. Lúc những dự án công trình to dần chúng ta cũng dễ dàng dàng làm chủ và mở bát ngát.
Bài hướng dẫn chỉ là một trong những demo đơn thuần nên với thể sẽ thiếu hụt một vài ba thành phần nhưng bản thân vẫn mong nó hỗ trợ ích cho những du khách trong quy trình tăng trưởng ứng dụng web bằng laravel.
Nguyễn Viết lách Hiếu