I. Mở Đầu.
- Như các bạn đã biết Laravel xậy dựng MVC với mô hình này bạn sẽ không gặp nhiều vấn đề với các dự án vừa và nhỏ.
Nhưng ngày ko đẹp trời nào đó bạn phải maintan dự án to hơn 1 chút lúc đó bạn cảm thấy khó khăn trong việc quản lý code của dự án thì ta phải làm thế nào ? - Để giải quyết vấn đề trên mình sẽ giới thiệu cho các bạn mô hình HMVC (Hierarchy – Model – View – Controller). Với mô hình này bạn nhóm code theo chức năng mỗi chức năng sẽ là 1 module. Trong mỗi module là 1 mô hình MVC đầy đủ model, view, controller và cả router. Như vậy việc quản lý code là rất dễ dàng.
II. Cấu hình module.
- Laravel đã hộ trợ việc cấu hình module vậy nên việc cấu hình là rất dễ dàng không gặp nhiều khó khăn cho dev.
Bước 1:
Đầu tiền bạn phải tạo 1 folder chứa các module không ép buộc bạn đặt tên là gì nhưng đa phần mọi người đặt là Modules như hình dưới:
1 2 3 4 | app/ └── Modules └── Providers |
Bước 2: Tạo ModuleServiceProvider.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">namespace</span> <span class="token package">AppProviders</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">IlluminateSupportServiceProvider</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">IlluminateSupportFacadesFile</span><span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">ModuleServiceProvider</span> <span class="token keyword">extends</span> <span class="token class-name">ServiceProvider</span> <span class="token punctuation">{</span> <span class="token comment">/** * registerModules * * @return void */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">boot</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">getModules</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">as</span> <span class="token variable">$module</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token variable">$value</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token variable">$value</span><span class="token punctuation">)</span> <span class="token keyword">continue</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">registerModuleMigrations</span><span class="token punctuation">(</span><span class="token variable">$module</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">mapModuleRoutes</span><span class="token punctuation">(</span><span class="token variable">$module</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">defineNamespaceModuleViews</span><span class="token punctuation">(</span><span class="token variable">$module</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">/** * Register any application services. * * @return void */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">register</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token comment">/** * @return array */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">getModules</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">array</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> File<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">directories</span><span class="token punctuation">(</span><span class="token constant">__DIR__</span> <span class="token punctuation">.</span> <span class="token single-quoted-string string">'/../Modules/'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">/** * Register paths to be published by the publish command. * * @param string $module * @return void */</span> <span class="token keyword">protected</span> <span class="token keyword">function</span> <span class="token function">registerModuleMigrations</span><span class="token punctuation">(</span>string <span class="token variable">$module</span><span class="token punctuation">)</span><span class="token punctuation">:</span> void <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">loadMigrationsFrom</span><span class="token punctuation">(</span><span class="token function">module_path</span><span class="token punctuation">(</span><span class="token variable">$module</span> <span class="token punctuation">.</span> <span class="token constant">DIRECTORY_SEPARATOR</span> <span class="token punctuation">.</span> <span class="token single-quoted-string string">'Migrations'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">/** * Define the "module" routes for the application. * * @param string $module * @return void */</span> <span class="token keyword">protected</span> <span class="token keyword">function</span> <span class="token function">mapModuleRoutes</span><span class="token punctuation">(</span>string <span class="token variable">$module</span><span class="token punctuation">)</span><span class="token punctuation">:</span> void <span class="token punctuation">{</span> <span class="token variable">$namespace</span> <span class="token operator">=</span> <span class="token function">str_replace</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'/'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'\'</span><span class="token punctuation">,</span> <span class="token variable">$module</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$routerWebPath</span> <span class="token operator">=</span> <span class="token function">module_path</span><span class="token punctuation">(</span><span class="token variable">$module</span> <span class="token punctuation">.</span> <span class="token constant">DIRECTORY_SEPARATOR</span> <span class="token punctuation">.</span> <span class="token single-quoted-string string">'Routers/web.php'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$routerApiPath</span> <span class="token operator">=</span> <span class="token function">module_path</span><span class="token punctuation">(</span><span class="token variable">$module</span> <span class="token punctuation">.</span> <span class="token constant">DIRECTORY_SEPARATOR</span> <span class="token punctuation">.</span> <span class="token single-quoted-string string">'Routers/api.php'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">file_exists</span><span class="token punctuation">(</span><span class="token variable">$routerWebPath</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">mapWebRoutes</span><span class="token punctuation">(</span><span class="token variable">$namespace</span><span class="token punctuation">,</span> <span class="token variable">$routerWebPath</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">file_exists</span><span class="token punctuation">(</span><span class="token variable">$routerApiPath</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">mapApiRoutes</span><span class="token punctuation">(</span><span class="token variable">$namespace</span><span class="token punctuation">,</span> <span class="token variable">$routerApiPath</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">/** * Define the "api" routes for the application. * * These routes are typically stateless. * * @param $namespace * @param $path * @return void */</span> <span class="token keyword">protected</span> <span class="token keyword">function</span> <span class="token function">mapApiRoutes</span><span class="token punctuation">(</span><span class="token variable">$namespace</span><span class="token punctuation">,</span> <span class="token variable">$path</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> Route<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">prefix</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'api'</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span><span class="token function">middleware</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'api'</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span><span class="token keyword">namespace</span><span class="token punctuation">(</span><span class="token double-quoted-string string">"AppModules\<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$namespace</span><span class="token punctuation">}</span></span>\Controllers"</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span><span class="token function">group</span><span class="token punctuation">(</span><span class="token variable">$path</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">/** * Define the "web" routes for the application. * * These routes all receive session state, CSRF protection, etc. * @param $namespace * @param $path * @return void */</span> <span class="token keyword">protected</span> <span class="token keyword">function</span> <span class="token function">mapWebRoutes</span><span class="token punctuation">(</span><span class="token variable">$namespace</span><span class="token punctuation">,</span> <span class="token variable">$path</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> Route<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">middleware</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'web'</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span><span class="token keyword">namespace</span><span class="token punctuation">(</span><span class="token double-quoted-string string">"AppModules\<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$namespace</span><span class="token punctuation">}</span></span>\Controllers"</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span><span class="token function">group</span><span class="token punctuation">(</span><span class="token variable">$path</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">/** * Define namespace the "module" views for the application. * * @param string $module * @return void */</span> <span class="token keyword">protected</span> <span class="token keyword">function</span> <span class="token function">defineNamespaceModuleViews</span><span class="token punctuation">(</span>string <span class="token variable">$module</span><span class="token punctuation">)</span><span class="token punctuation">:</span> void <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">loadViewsFrom</span><span class="token punctuation">(</span><span class="token function">module_path</span><span class="token punctuation">(</span><span class="token variable">$module</span> <span class="token punctuation">.</span> <span class="token constant">DIRECTORY_SEPARATOR</span> <span class="token punctuation">.</span> <span class="token single-quoted-string string">'Views'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token variable">$module</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span> |
=> Sau đó khai báo ModuleServiceProvider trong app/config/app.php như hình:
Bước 3: Tạo Module.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | app/ └── Modules ├── Products │ ├── Controllsers │ │ └── ProductController.php │ ├── Models │ │ └── Product.php │ ├── Views │ │ └── index.php │ └── Routers └── web.php └── Providers ├── ModuleServiceProvider.php |
=> Bây giờ các chức năng của product hoạt động bình thường.
III. Kết thúc.
Bài viết của mình của mình đã xong hy vọng nó có thể giúp 1 chút gì đó.
Cảm ơn các bạn đã đọc bài viết của mình. Thanks you!!