菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
3332
7

模块化尝试——基于 Module 的 Laravel API 结构

原创
05/13 14:22
阅读数 2839

主要参考:基于 Module 的 Laravel API 架构

前言

又是一篇讨论目录结构的口水文章(笔记额。。。

项目中有多个模块是很常有的事,可能大多数小伙伴会在laravel原本的app下的ControllersModelsObserversJobs、.....目录下分别新建多个模块目录。可是这样当项目变得庞大,将会很难维护。如果使用模块化设计,相当于多个模块公用一套laravel底层代码,会清晰许多,有的模块简单(结构也简单),有的模块复杂(结构也复杂),迭代也容易许多(你可以老模块用旧标准、新模块用新标准),升级也会容易许多(如果你需要从低版本升到高版本,又只需要其中一部分模块,你可以把旧版本你需要的几个模块的代码提出来放到新版本中)。

上图,模块化的 目录结构 以及 命名空间namespace类引用use大概是这样
模块化设计

app目录保留,只放一些必须公用的东西,比如异常处理、中间件、Providers,越简单越好。
当然不同模块,你想自定义单独模块异常处理和中间件都很方便。

以下是我的笔记:

step 0. 肯定是先建立module目录,新建两个模块以及各自模块的路由文件。
step 1. 修改 app/RouteServiceProvider.php 中的 mapApiRoutes() 方法,给它新增一个指向 routes/modules.php 的路由组。

  protected function mapApiRoutes()
    {
        Route::prefix('api')
             ->middleware('api')
             ->namespace($this->namespace)
             ->group(base_path('routes/api.php'));
        //以下为新增
        Route::middleware('api')
             ->group(base_path('routes/modules.php'));
    }

step 2. 修改 composer.json , 具体是autoloadpsr-4字段 ,给它新增你需要的项目模块psr-4的自动加载,(找"App\\": "app/",加在它下面~

 "autoload": {
        "classmap": [
            "database/seeds",
            "database/factories"
        ],
        "psr-4": {
            "App\\": "app/",
            "Blog\\": "modules/Blog",      //新增
            "Shop\\": "modules/shop"     //新增
        },
        "files": [
            "bootstrap/helpers.php"
        ]
    },

这里,其实是可以建立和app平级的目录,可是,假如你有20+模块,这就很可怕了,还是放在modules里好一点.

别忘了执行 composer dump-autoload

setp 3. 新增routes/modules.php , 添加指向所需模块(这里是Blog和Shop)的路由组。

<?php
Route::prefix('blog')
    ->namespace('Blog\Http\Controllers')
    ->group(base_path('modules/Blog/routes.php'));

Route::prefix('shop')
    ->namespace('Shop\Http\Controllers')
    ->group(base_path('modules/Shop/routes.php'));

step 4. 修改模块下Controller、Model等目录的命名空间和引用。(如果是新模块,直接新建咯
namespace App\Http\Controllers\Blog;namespace Blog\Http\Controllers;
use App\Models\Blog\Topic;use Blog\Models\Topic;

step 5. 测试.postman跑接口,都是ok哒。

后记

还没解决的问题:migrations文件怎样更改目录? 好像是只能放到database/migrations下面。
其他todo:新增Module相关的artisan命令。

发表评论

0/200
3332 点赞
7 评论
收藏
为你推荐 换一批