使用 Laravel-Modules 扩展包通过模块化开发大型 Laravel 应用

简介

当我们开发大型应用时,经常需要将应用划分成不同的模块,比如博客、电商、论坛等,Laravel-Modules 就是这样一个使用模块帮助我们管理大型应用的扩展包。模块和扩展包有点类似,包含视图、控制器、模型等子组件,但是用于区别大的功能单元时使用模块更加清晰,本扩展包是 pingpong/modules 的升级版,且最新版支持 Laravel 5.5。

AsgardCMS 就是使用了该扩展包进行模块化管理和开发。

安装

注:安装最新 Laravel-Modules 要求 PHP 版本在 7.0 以上,同时 Laravel 版本是 5.5.*

首先在 Laravel 项目根目录下使用 Composer 安装该扩展包:

composer require nwidart/laravel-modules

该扩展包会自动注册服务提供者和别名。此外,你可以通过运行如下命令来发布配置文件:

 php artisan vendor:publish --provider="Nwidart\Modules\LaravelModulesServiceProvider"

我们可以通过如下命令生成应用的第一个模块:

php artisan module:make Blog

生成的模块目录结构如下:

要让模块目录中定义的类可以自动加载,可以这样配置 composer.json

{
  "autoload": {
    "psr-4": {
      "App\\": "app/",
      "Modules\\": "Modules/"
    }
  }
}

配置完成后不要忘记运行 composer dump-autoload 命令让修改生效。

基本使用

我们简单定义一个路由来访问模块中的控制器方法。

首先在 Laravel 应用根目录下的 routes/web.php 定义一个路由:

Route::get('/blog', '\Modules\Blog\Http\Controllers\BlogController@index');

然后在浏览器中访问 http://demo.dev/blog(假设我们使用 demo.dev 访问应用),页面显示如下:

其实跟我们在 Laravel 原生应用 app 目录下开发完全一致,只是通过模块重新组织了目录结构而已,更多使用方法可参考官方文档

学院君 has written 977 articles

Laravel学院院长,终身学习者

积分:112022 等级:P12 职业:手艺人 城市:杭州

13 条回复

  1. 李凌云 李凌云 says:
    路由能不能在模块中配置啊
  2. koala koala says:
    当功能模块话后,可以对项目复制,不同客户对应不同模块,同时可以由社区提供相应的模块。比如基础CMS,模块话的留言,模块话的统计等,去掉这些模块,cms 还是cms。
  3. birjemin birjemin says:
    个人觉得,项目真的到了这么大的时候,采用的开发语言不仅仅是php了,也不会一个项目里面分模块,如果我负责的是用户中心,不小心改了其他模块怎么办?
  4. birjemin birjemin says:
    文档有一句话:要让模块目录中定义的类可以自动加载,可以这样配置 composer.json,你这个没有配置
  5. 木拉地力 木拉地力 says:
    Class 'Modules\Blog\Providers\BlogServiceProvider' not found 这个问题怎么解决啊? 在线等 急!!!
  6. vary vary says:
    Route::any('/{module}/{controller?}/{action?}', function($module, $controller, $action='index') { if(Route::has($controller)){ return redirect($controller); }else{ $realcontroller="Modules\\".$module."\\Http\\Controllers\\".$controller."Controller"; if (!file_exists($realcontroller.".php")){ return view('error.404'); }else{ $ctrl = \App::make($realcontroller); return \App::call([$ctrl, $action]); } } });
  7. Ray Ray says:
    使用这个包的时候如果不喜欢学院君提供的这个路由访问,可以直接去生成的模块里的route进行路由填写,一样能访问,这样的话可以把路由也区分开
  8. Ray Ray says:
    当你用到非常大型的项目的时候你就会烦恼学院里没办法删除评论了
  9. digua digua says:
    大哥你怕是thinkphp用多了。什么情况下要用url()这个函数来生成url呢,
  10. bvcvb bvcvb says:
    两回事,你这只是控制器分开。

登录后才能进行评论,立即登录?