elightwalk/laravel-modules

Laravel 模块管理

dev-master 2020-01-31 07:42 UTC

This package is auto-updated.

Last update: 2024-09-29 05:35:50 UTC


README

elightwalk/laravel-modules 是一个 Laravel 包,用于通过模块管理大型 Laravel 应用。模块类似于 Laravel 包,包含一些视图、控制器或模型。此包在 Laravel 6 中得到支持和测试。

安装

通过 Composer 安装,运行以下命令

composer require elightwalk/laravel-modules

该包将自动注册服务提供者和别名。

通过运行以下命令发布包的配置文件

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

自动加载

默认情况下,模块类不会自动加载。您可以使用 psr-4 自动加载您的模块。例如

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

Composer

进行 Composer 自动加载

composer dump-autoload

配置缓存

清除配置缓存

php artisan config:cache

配置

  • namespace - 当生成模块时,默认命名空间。

  • stubs - 重写默认生成的模板,用于生成模块。这可以用于自定义不同文件的输出。

  • paths - 重写包中使用的默认路径。

  • scan - 默认情况下禁用。一旦启用,该包将在指定的路径数组中查找模块。

  • composer - 自定义生成的 composer.json 文件。

  • cache - 如果您有多个模块,缓存此信息(例如,多个 module.json 文件)是个好主意。

  • register - 决定哪些自定义命名空间需要由包注册。如果设置为 false,则包不会处理其注册。

  • activators - 显示模块状态

  • activator - 从激活器中选择

创建模块

要创建新模块,您可以简单地运行

php artisan module:make <module-name>
  • <module-name> - 必需的。创建的模块名称。

创建多个模块

php artisan module:make User Auth

默认情况下,如果您创建新模块,则会自动添加一些资源,如控制器、种子类或提供者。如果您不希望这样,可以添加 --plain 标志,以生成一个纯模块。

php artisan module:make User --plain
#OR
php artisan module:make User -p

命名规范

因为我们正在使用 psr-4 自动加载模块,所以我们强烈建议使用 StudlyCase 规范。

文件夹结构

laravel-app/
app/
  Modules/
    ├── Elightwalk/
      ├── User/
          ├── Config/
          ├── Console/
          ├── Database/
              ├── factories/
              ├── Migrations/
              ├── Seeders/
                  ├── UserDatabaseSeeder.php
          ├── Entities/
          ├── Http/
              ├── Controllers/
                  ├── UserController.php
              ├── Middleware/
              ├── Requests/
          ├── Providers/
              ├── RouterServiceProvider.php
              ├── UserServiceProvider.php
          ├── Resources/
              ├── assets/
                  ├── js/
                      ├── app.js
                  ├── sass/
                      ├── app.sass
              ├── lang/
              ├── views/
                  ├── layouts/
                      ├── master.blade.php
                  ├── index.blade.php
          ├── Routes/
              ├── api.php
              ├── web.php
          ├── Tests/
              ├── Feature/
              ├── Unit/
          ├── composer.json
          ├── module.json
          ├── package.json
          ├── webpack.mix.js
bootstrap/
vendor/

助手

获取指定模块的路径。

$path = module_path('User');

编译资源(Laravel Mix)安装和设置

默认的 package.json 文件包含您开始所需的全部内容。您可以通过运行以下命令安装它引用的依赖项

npm install

运行 Mix

Mix 是 Webpack 之上的配置层,因此要运行您的 Mix 任务,您只需要执行默认 laravel-modules package.json 文件中包含的 NPM 脚本之一

// Run all Mix tasks...
npm run dev

// Run all Mix tasks and minify output...
npm run production

生成版本化文件后,您不知道确切的文件名。因此,您应该在视图中使用 Laravel 的全局 mix 函数来加载相应哈希的资产。mix 函数将自动确定当前哈希文件的名称

// Modules/Elightwalk/User/Resources/views/layouts/master.blade.php

<link rel="stylesheet" href="{{ mix('css/user.css') }}">

<script src="{{ mix('js/user.js') }}"></script>

有关 Laravel Mix 的更多信息,请参阅以下文档:https://laravel.net.cn/docs/mix

安装 laravel-mix-merge-manifest

npm install laravel-mix-merge-manifest --save-dev

修改 webpack.mix.js 主文件

let mix = require('laravel-mix');


/* Allow multiple Laravel Mix applications*/
require('laravel-mix-merge-manifest');
mix.mergeManifest();
/*----------------------------------------*/

mix.js('resources/assets/js/app.js', 'public/js')
   .sass('resources/assets/sass/app.scss', 'public/css');

模块管理

创建新模块。

php artisan module:make User

生成多个模块。

php artisan module:make User Auth

使用指定的模块。这允许您在需要模块名称作为参数的其他命令中不指定模块名称。

php artisan module:use User

取消使用模块:use命令设置的指定模块。

php artisan module:unuse User

列出所有可用模块。

php artisan module:list

启用指定的模块。

php artisan module:enable User

禁用指定的模块。

php artisan module:disable User

更新指定的模块。

php artisan module:update User

迁移

迁移指定的模块,如果没有指定模块参数,则迁移所有模块。

php artisan module:migrate User

回滚指定的模块,如果没有参数,则回滚所有模块。

php artisan module:migrate-rollback User

刷新指定模块的迁移,如果没有指定模块,则刷新所有模块的迁移。

php artisan module:migrate-refresh User

重置指定模块的迁移,如果没有指定模块,则重置所有模块的迁移。

php artisan module:migrate-reset User

为指定的模块生成迁移。

php artisan module:make-migration create_posts_table User

Seed

对指定的模块进行Seed操作,如果没有参数,则对所有模块进行Seed操作

php artisan module:seed User

为指定的模块生成种子名称。

php artisan module:make-seed seed_fake_blog_posts User

Publish

发布指定模块的迁移文件,如果没有参数,则发布所有模块的迁移文件。

php artisan module:publish-migration

发布指定模块的配置文件,如果没有参数,则发布所有模块的配置文件。

php artisan module:publish-config User

发布指定模块的翻译文件,如果没有指定模块,则发布所有模块的迁移文件。

php artisan module:publish-translation User

生成器命令

为指定的模块生成控制台命令。

php artisan module:make-command CreatePostCommand User

Controller

为指定的模块生成控制器。

php artisan module:make-controller PostsController User

Model

为指定的模块生成模型。

可选选项

--fillable = field1,field2: 在生成的模型上设置可填充字段 --migration, -m: 为给定的模型创建迁移文件

php artisan module:make-model Post User

Provider

为指定的模块生成服务提供者名称。

php artisan module:make-provider UserServiceProvider User

Middleware

为指定的模块生成中间件名称。

php artisan module:make-middleware CanReadPostsMiddleware User

Mail

为指定的模块生成邮件类。

php artisan module:make-mail SendWeeklyPostsEmail User

Notification

为指定的模块生成通知类名称。

php artisan module:make-notification NotifyAdminOfNewComment User

Event

为指定的模块生成事件。

php artisan module:make-event UserPostWasUpdated User

Listener

为指定的模块生成监听器。可选地,您可以指定它应该监听的事件类。它还接受一个--queued标志允许队列事件监听器。

php artisan module:make-listener NotifyUsersOfANewPost User
php artisan module:make-listener NotifyUsersOfANewPost User --event=PostWasCreated
php artisan module:make-listener NotifyUsersOfANewPost User --event=PostWasCreated --queued

Request

为指定的模块生成请求。

php artisan module:make-request CreatePostRequest User

Job

为指定的模块生成作业。

php artisan module:make-job JobName User

php artisan module:make-job JobName User --sync # A synchronous job class

Route Provider

为指定的模块生成路由服务提供者。

php artisan module:route-provider User

Factory

为指定的模块生成数据库工厂。

php artisan module:make-factory FactoryName User

Policy

为指定的模块生成策略类。在创建新模块时默认不生成策略。将mconfig.php中paths.generator.policies的值更改为您期望的位置。

php artisan module:make-policy PolicyName User

Rule

为指定的模块生成策略类。在创建新模块时默认不生成规则。将mconfig.php中paths.generator.rules的值更改为您期望的位置。

php artisan module:make-rule ValidationRule User

Resources

为指定的模块生成资源类。它可以有一个可选的--collection参数来生成资源集合。在创建新模块时默认不生成Transformers文件夹。将mconfig.php中paths.generator.resource的值更改为您期望的位置。

php artisan module:make-resource PostResource User
php artisan module:make-resource PostResource User --collection

Test

为指定的模块生成测试类。

php artisan module:make-test EloquentPostRepositoryTest User

门面方法

获取所有模块。

Module::all();

获取所有缓存的模块。

Module::getCached()

获取排序后的模块。模块将按config/modules.php文件中的优先级键排序。

Module::getOrdered();

获取扫描的模块。

Module::scan();

查找特定模块。

Module::find('name');

// OR

Module::get('name');

查找模块,如果有,则返回模块实例,否则抛出Elightwalk\Modules\Exeptions\ModuleNotFoundException异常。

Module::findOrFail('module-name');

获取扫描的路径。

Module::getScanPaths();

获取所有模块作为集合实例。

Module::toCollection();

按状态获取模块。1表示活动状态,0表示非活动状态。

Module::getByStatus(1);

检查指定的模块。如果存在,则返回true,否则返回false。

Module::has('module-name');

获取所有启用的模块。

Module::allEnabled();

获取所有禁用的模块。

Module::allDisabled();

获取所有模块的数量。

Module::count();

获取模块路径。

Module::getPath();

注册模块。

Module::register();

启动所有可用模块。

Module::boot();

获取所有启用模块的集合实例。

Module::collections();

从指定模块获取模块路径。

Module::getModulePath('name');

从指定模块获取资产路径。

Module::assetPath('name');

从本包获取配置值。

Module::config('composer.vendor');

获取使用的存储路径。

Module::getUsedStoragePath();

获取用于cli会话的模块。

Module::getUsedNow();
// OR
Module::getUsed();

设置用于cli会话的模块。

Module::setUsed('name');

获取模块的资产路径。

Module::getAssetsPath();

从特定模块获取资产URL。

Module::asset('user:img/logo.img');

通过模块名称安装指定的模块。

Module::install('elightwalk/hello');

更新指定模块的依赖项。

Module::update('hello');

向模块仓库添加宏。

Module::macro('hello', function() {
    echo "I'm a macro";
});

从模块仓库调用宏。

Module::hello();

获取模块的所有必需模块。

Module::getRequirements('module name');

模块方法

从特定模块获取实体。

$module = Module::find('blog');

获取模块名称。

$module->getName();

获取小写模块名称。

$module->getLowerName();

获取PascalCase格式的模块名称。

$module->getStudlyName();

获取模块路径。

$module->getPath();

获取额外路径。

$module->getExtraPath('Assets');

禁用指定的模块。

$module->disable();

启用指定的模块。

$module->enable();

删除指定的模块。

$module->delete();

获取模块要求的数组。注意:这些应该是模块的别名。

$module->getRequires();

模块资源

您的模块可能包含Laravel所说的资源,这些资源包含配置、视图、翻译文件等。为了让您的模块正确加载并(如果需要)发布它们,您需要让Laravel了解它们,就像任何常规包一样。合并后清理缓存

配置

$this->publishes([
    __DIR__.'/../Config/config.php' => config_path('user.php'),
], 'config');
$this->mergeConfigFrom(
    __DIR__.'/../Config/config.php', 'user'
);

这里的主要内容是调用loadViewsFrom方法。如果您不希望将视图发布到Laravel视图文件夹中,可以移除对$ this->publishes()的调用。

视图

$viewPath = base_path('resources/views/modules/user');

$sourcePath = __DIR__.'/../Resources/views';

$this->publishes([
    $sourcePath => $viewPath
]);

$this->loadViewsFrom(array_merge(array_map(function ($path) {
    return $path . '/modules/user';
}, \Config::get('view.paths')), [$sourcePath]), 'user');

使用

@extends('user::layouts.master')
@include('user::auth.tokenexpire')

语言文件

$langPath = base_path('resources/lang/modules/user');

if (is_dir($langPath)) {
    $this->loadTranslationsFrom($langPath, 'user');
} else {
    $this->loadTranslationsFrom(__DIR__ .'/../Resources/lang', 'user');
}

结构

— Elightwalk
    - User
        — Resources
            — lang
                — en
                    messages.php
                — dk
                    messages.php

使用

@lang('user::messages.something')

工厂

如果您想使用Laravel工厂,您必须在服务提供器中添加以下内容

$this->app->singleton(Factory::class, function () {
    return Factory::construct(__DIR__ . '/Database/factories');
});

创建命令

您的模块可能包含控制台命令。您可以手动生成这些命令,或者使用以下辅助工具

php artisan module:make-command CreatePostCommand User

这将创建一个位于Blog模块中的CreatePostCommand。默认情况下,它将是app/Modules/Elightwalk/User/Console/CreatePostCommand。

请参阅Laravel artisan命令文档以了解所有相关信息。

注册命令

您可以使用服务提供器类内部可用的laravel方法(commands)来注册命令。

$this->commands([
    \app\Modules\Elightwalk\User\Console\CreatePostCommand::class,
]);

现在您可以通过php artisan在控制台访问您的命令。

事件服务提供者

一旦您有多个事件,您可能会发现将所有事件及其监听器放在一个专门的服务提供器中更容易。这就是EventServiceProvider的作用。

在app/Modules/Elightwalk/User/Providers文件夹中创建一个名为EventServiceProvider的新类(Blog只是一个示例名称)。

此类需要看起来像这样

<?php

namespace Modules\Blog\Providers;

use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;

class EventServiceProvider extends ServiceProvider
{
    protected $listen = [];
}

这现在就像app/命名空间中的常规EventServiceProvider。在我们的例子中,listen属性将看起来像这样

// ...
class EventServiceProvider extends ServiceProvider
{
    protected $listen = [
        BlogPostWasUpdated::class => [
            NotifyAdminOfNewPost::class,
        ],
    ];
}

鸣谢

关于Elightwalk Technology

Elightwalk在Web开发领域处于领先地位。我们提供完整的解决方案,从不妥协于功能性和设计,Elightwalk的领导者对Web技术有着丰富的经验,我们的目标是让客户和员工每天都感到快乐。我们的常规任务

Magento development.
Web app development.
WordPress development.
WooCommerce development.
Laravel development.
SaaS development.
PWA development.
Full Stack Development

访问 elightwalk.com

许可证

MIT许可(MIT)。有关更多信息,请参阅许可文件