laravel多模块解决方案

创建于 8个月前 / 阅读数 81 / PHP


依赖

这里我们使用第三方依赖包nwidart/laravel-modules

官网地址:点我
Github:点我

安装

$ composer require nwidart/laravel-modules

版本

如果你的 Laravel 版本小于 5.5 你需要注册服务提供者与别名

'providers' => [
      Nwidart\Modules\LaravelModulesServiceProvider::class,
],

'aliases' => [
    'Module' => Nwidart\Modules\Facades\Module::class,
],

当然如果版本大于等于 5.5 借助于包自动发现你可以忽略

$ composer du
...
Discovered Package: nwidart/laravel-modules
Package manifest generated successfully.

生成配置

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

由于 Modules 默认会生成在项目目录下,配置composer.json自动加载

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

使用

首先可以生成模块, 假设创建Blog模块

$ php artisan module:make Blog

说明:会生成Modules/Blog, 包含一套完整的laravel代码目录

目录结构如下

前端依赖

对于模块,需要使用Terminal进入模块目录单独为模块安装依赖,假设你使用的是 yarn

$ cd Modules/Blog
$ yarn install
$ npm run dev

说明:此时会生成public/css/blog.csspublic/js/blog.js

打开Blog/Resources/views/layouts/master.blade.php

{{-- Laravel Mix - CSS File --}}
<link rel="stylesheet" href="{{ mix('css/blog.css') }}">

{{-- Laravel Mix - JS File --}}
<script src="{{ mix('js/blog.js') }}"></script>

访问 your-domain/blog 即可查看效果

个人习惯

为了便于管理和符合laravel的特性,我们习惯将目录放置在app下, 具体配置操作如下:

首先打开 config/modules.php

<?php
return [
    'namespace' => 'App\Modules',
    ...
    'paths' => [
        'modules' => base_path('app/Modules'),
        ...
    ]
]

说明:此时可以重新执行命令生成模块

生成模块后打开 app/Modules/Blog/webpack.mix.js

// mix.setPublicPath('../../public').mergeManifest();
mix.setPublicPath('../../../public').mergeManifest();

最后重新执行 mix 即可

$ npm run dev

常见问题

a. 需要注意前端依赖是在对应模块下安装与执行编译
b. 注意安装前端laravel-mix-merge-manifest依赖,防止覆盖文件

$ yarn add laravel-mix-merge-manifest

c. 更多问题可以前往github issue查看
这里也有我参与的一个 issue, 如果你也遇到了希望对你有帮助