I. Introduction.
- As you already know Laravel builds MVC with this model you won’t have many problems with small to medium projects. But on some bad day, you have to maintan the project a little bit bigger then you find it difficult to manage the project’s code, what should we do?
- To solve the above problem, I will introduce to you the HMVC (Hierarchy – Model – View – Controller) model. With this model, you group code by function, each function will be a module. In each module is an MVC model full of model, view, controller and router. Thus code management is very easy.
II. Module configuration.
- Laravel supports module configuration so the configuration is very easy without much difficulty for developers.
Step 1:
First, you have to create a folder containing modules that do not force you to name it, but most people call it Modules as shown below:
1 2 3 4 | app/ └── Modules └── Providers |
Step 2: Create 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">App Providers</span> <span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate Support ServiceProvider</span> <span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate Support Facades File</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> |
=> Then declare ModuleServiceProvider in app / config / app.php as shown:
Step 3: Create 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 |
=> Now all functions of product are working properly.
III. End.
My post is done, hope it can help a little.
Thank you for reading my article. Thanks you !!