pierresilva/laravel-modules

Laravel 8 模块

8.42 2022-04-27 20:46 UTC

This package is auto-updated.

Last update: 2024-09-28 01:51:39 UTC


README

模块是一个简单的包,允许将您的 Laravel 5.3 应用程序分离成模块。每个模块都是完全独立的,允许简单地插入模块以供使用。

快速安装

首先通过 Composer 安装此包。

composer require pierresilva/laravel-modules

完成此操作后,只需将服务提供者和外观类添加到项目的 config/app.php 文件中

服务提供者

pierresilva\Modules\ModulesServiceProvider::class,

外观

'Module' => pierresilva\Modules\Facades\Module::class,

模块结构

此包是为 Laravel 5 构建的。模块遵循 Laravel 最新版本中采用的应用程序结构,确保模块感觉像是应用程序的自然部分。

laravel-project/
    app/
    |-- Modules/
        |-- Blog/
            |-- Config/
            |-- Database/
                |-- Factories/
                |-- Migrations/
                |-- Seeds/
            |-- Http/
                |-- Controllers/
                |-- Middleware/
                |-- Requests/
            |-- Models/
            |-- Providers/
                |-- ModuleServiceProvider.php
                |-- RouteServiceProvider.php
            |-- Resources/
                |-- Lang/
                |-- Views/
            |-- Routes/
                |-- api.php/
                |-- web.php/
            |-- Tests/
            |-- module.json

清单文件

除了结构外,每个模块还有一个 module.json 清单文件。此清单文件用于概述有关模块的信息,例如描述、版本、作者以及您希望存储的任何其他相关信息。

{
    "name": "Blog",
    "slug": "blog",
    "version": "1.0",
    "author": "Author Name",
    "license": "MIT",
    "description": "Only the best blog module in the world!",
    "order": 100
}
  • name - 模块的人性化名称。非必需。
  • slug - 模块的 slug。用于识别目的。
  • version - 模块的版本。非必需。
  • description - 模块的描述。非必需。
  • author - 模块的作者名称。非必需
  • license - 模块的许可证。非必需
  • order - 加载模块的顺序。这是可选的,但如果您需要稍后加载模块,则这是您要查找的选项。非必需

配置

发布配置文件

要发布捆绑的配置文件,只需运行 Laravel 的 vendor:publish Artisan 命令

php artisan vendor:publish

模块路径

您可以定义存储模块的位置。

'path' => app_path('Modules'),

模块的基本命名空间

定义模块的基本命名空间。

'namespace' => 'App\Modules\\'

注意:如果将模块移动到另一个目录,请务必更新此路径。

移动模块文件夹

  • 更改上述配置。
  • 在 composer.json 文件中添加自动加载命名空间匹配文件夹。例如:"Modules": "modules/"。这将把模块文件夹移动到 Laravel 基础路径。
  • 在 composer.json 安装的地方运行命令 composer dump-autoload。

重新构建模块

您可以在不影响脚手架和迁移命令的情况下更改模块的内部结构。例如,如果您想将 PHP 代码放在 src 目录中,并省略资源文件,您可以这样做

'pathMap' => [
    'Database'          => 'src/Database',
    'Http'              => 'src/Http',
    'Providers'         => 'src/Providers',
    'Models'            => 'src/Models',
    'Policies'          => 'src/Policies',
    'Resources/Views'   => 'resources/views',
    'Resources/Lang'    => 'resources/lang',
    'Routes'            => 'routes',
],

注意 这里键的设置仅基于默认模块结构

资源

视图

模块视图使用双冒号 module::view 语法引用。因此,您可以像这样从 blog 模块加载 admin 视图

Route::get('admin', function() {
    return view('blog::admin');
});

覆盖模块视图

模块为每个模块的视图注册两个位置:一个在应用程序的 resources/views/vendor 目录中,另一个在模块的资源目录中。以我们的博客示例来说:当请求模块视图时,Laravel 首先检查 resources/views/vendor/blog 中是否提供了自定义的视图版本。如果没有自定义,Laravel 将搜索模块的视图目录。这使得最终用户能够轻松地自定义/覆盖模块的视图。

翻译

模块在每个模块内部注册了 Resources/Lang 位置,用于存放您的翻译文件。模块翻译使用双冒号 module::file.line 语法引用。因此,您可以从消息文件中加载 blog 模块的 welcome 行,如下所示

echo trans('blog::messages.welcome');

公共资产

与 Laravel 的包一样,您的模块可以包含资产,如 JavaScript、CSS 和图像。要发布这些资产到应用程序的 public 目录,请使用服务提供者的 publishes 方法。您可以在模块的主要服务提供者中这样做,或者创建一个专门用于资产的服务提供者。

在本例中,我们将把我们的资产存储在模块根目录下的 Assets 目录中。我们还将添加一个 modules 资产组标签,它可以用来发布相关资产组

/**
 * Preforms post-registration booting of services.
 *
 * @return void
 */
public function boot()
{
    $this->publishes([
        __DIR__.'/../Assets' => public_path('assets/modules/example'),
    ], 'modules');
}

现在,当您执行 vendor:publish 命令时,您的模块资产将被复制到指定的位置。由于您通常需要在模块更新时覆盖资产,因此您可以使用 --force 标志

php artisan vendor:publish --tag=modules --force

如果您想确保您的公共资产始终是最新的,您可以将此命令添加到 composer.json 文件中的 post-update-cmd 列表。

中间件

模块附带您可以在应用程序中使用的中间件。以下将描述每个中间件及其用法示例。

识别模块 中间件提供了在每次页面加载时从会话中拉取和存储模块清单信息的方法。这为识别特定模块的路由提供了手段。

注册

只需在您的 app/Http/Kernel.php 文件中将它注册为路由中间件,并使用简写键。

protected $routeMiddleware = [
    ...
    'module' => \pierresilva\Modules\Middleware\IdentifyModule::class,
];

用法

现在,您可以在路由选项数组中使用 middleware 键。IdentifyModule 中间件期望传递模块的 slug,以便定位和加载相关的清单信息。

Route::group(['prefix' => 'blog', 'middleware' => ['module:blog']], function() {
    Route::get('/', function() {
        dd(
            'This is the Blog module index page.',
            session()->all()
        );
    });
});

结果

如果您 dd() 您的会话,您会看到一个新的 module 数组键,其中包含您的模块的清单信息。

"This is the Blog module index page."
array:2 [▼
  "_token" => "..."
  "module" => array:6 [▼
    "name" => "Blog"
    "slug" => "blog"
    "version" => "1.0"
    "description" => "This is the description for the Blog module."
    "enabled" => true
    "order" => 9001
  ]
]

Composer 支持

安装

要开始,只需通过 Composer 在您的应用程序中要求插件。

composer require wikimedia/composer-merge-plugin

用法

"extra": {
    "merge-plugin": {
        "include": [
            "app/Modules/*/composer.json"
        ]
    }
}

现在,对于每个需要与您的应用程序一起安装自己的 Composer 依赖项的模块,只需在模块的根目录中创建一个 composer.json 文件。

{
    "name": "yourapplication/users",
    "description": "Yourapplication Users module.",
    "keywords": ["yourapplication", "module", "users"],
    "require": {
        "pierresilva/laravel-acl": "~5.3"
    },
    "config": {
        "preferred-install": "dist"
    }
}

然后只需像平常一样运行 composer update!维基媒体的 Composer 合并插件将自动解析您所有模块的 composer.json 文件,并动态地将它们与您的主 composer.json 文件合并。

门面引用

Module::all()

获取所有模块。

$modules = Module::all();

Module::all()

获取所有模块 slug。

$modules = Module::slugs();

Module::where($key, $value)

根据 where 子句获取模块。

  • $key (字符串) 模块属性键。必需。
  • $value (混合) 匹配值。必需。
$blogModule = Module::where('slug', 'blog');

Module::sortBy($key)

根据 where 子句获取模块。

  • $key (字符串) 模块属性键。必需。
$orderedModules = Module::sortBy('order');

Module::sortByDesc($key)

按给定键降序排序模块。

  • $key (字符串) 模块属性键。必需。
$orderedModules = Module::sortByDesc('order');

Module::exists($slug)

检查给定的模块是否存在。

  • $slug (字符串) 模块 slug。必需。
if (Module::exists('blog')) {
    return 'Module "blog" exists!';
}

Module::count()

返回所有模块的总数。

$moduleCount = Module::count();

Module::getProperties($slug)

返回模块定义的属性。

  • $slug (字符串) 模块 slug。必需。
$moduleProperties = Module::getProperties('blog');

Module::get($property, $default)

返回给定模块清单属性。

  • $property (字符串) 模块属性 slug,格式如下:moduleSlug::propertyKey。必需。
  • $default (混合类型) 如果定义的属性不存在,则使用的默认值。
$moduleName = Module::get('blog::name', 'Blog');

Module::set($property, $value)

设置给定模块的属性值。

  • $propertySlug (字符串) 模块属性缩略名,格式如下:moduleSlug::propertyKey。必需。
  • $value (混合类型) 要保存的新属性值。必需
Module::set('blog::description', 'This is a new description for the blog module.');

Module::enable($slug)

启用指定的模块。

  • $slug (字符串) 模块 slug。必需。
Module::enable('blog');

Module::disable($slug)

禁用指定的模块。

  • $slug (字符串) 模块 slug。必需。
Module::disable('blog');

Module::enabled()

获取所有启用的模块。

$enabledModules = Module::enabled();

Module::disabled()

获取所有禁用的模块。

$disabledModules = Module::disabled();

Module::isEnabled($slug)

检查指定的模块是否已启用。

  • $slug (字符串) 模块 slug。必需。
if (Module::isEnabled('blog')) {
    return 'Blog module is enabled!';
}

Module::isDisabled($slug)

检查指定的模块是否已禁用。

  • $slug (字符串) 模块 slug。必需。
if (Module::isDisabled('blog')) {
    return 'Blog module is disabled.';
}

Artisan 命令

模块包附带了一些 Artisan 命令,使生成和管理模块变得简单。

module:make [slug]

生成一个新的模块。这将生成启动新模块所需的所有必要文件夹和文件。新模块将自动启用并直接工作。

php artisan module:make blog

module:make:controller [slug] [ControllerName]

生成一个新的模块控制器类。

php artisan module:make:controller blog PostsController

module:make:migration [slug] [migration_name]

生成一个新的模块迁移文件。

php artisan module:make:migration blog create_posts_table

module:make:seeder [slug] [SeederName]

生成一个新的模块种子文件。

php artisan module:make:seeder blog PostsTableSeeder

对于迁移入口 blog 种子,在模块的 Database\Seeders 文件夹中创建一个 [ModuleName]DatabaseSeeder 类,并在 run() 方法中包含您生成的种子类。

module:make:request [slug] [RequestName]

创建一个新的模块表单请求类。

php artisan module:make:request blog CreatePostRequest

module:make:test [slug] [TestName] [--unit]

创建一个新的模块功能测试类。

php artisan module:make:test blog PostsTest

创建一个新的模块单元测试类。

php artisan module:make:test blog PostsTest --unit

之后,php artisan test 命令可以找到模块测试类。

module:enable [slug]

启用模块。

php artisan module:enable blog

module:list

列出所有应用程序模块。

php artisan module:list

module:migrate [slug]

从指定的模块或所有模块迁移迁移。

迁移所有模块。

php artisan module:migrate

迁移特定模块。

php artisan module:migrate blog --pretend

module:migrate:refresh [slug]

重置并重新运行特定或所有模块的所有迁移。

参数

  • --database - 要使用的数据库连接。
  • --seed - 表示是否应该重新运行种子任务。
php artisan module:migrate:refresh
php artisan module:migrate:refresh blog --seed

module:migrate:reset [slug]

回滚特定或所有模块的所有数据库迁移。

参数

  • --database - 要使用的数据库连接。
  • --force - 强制在生产中运行操作。
  • --pretend - 输出将要运行的 SQL 查询。

重置所有模块迁移。

php artisan module:migrate:reset

重置特定模块迁移。

php artisan module:migrate:reset blog

module:migrate:rollback [slug]

回滚特定或所有模块的最后数据库迁移。

参数

  • --database - 要使用的数据库连接。
  • --force - 强制在生产中运行操作。
  • --pretend - 输出将要运行的 SQL 查询。

回滚所有模块迁移。

php artisan module:migrate:rollback

回滚特定模块迁移。

php artisan module:migrate:rollback blog

module:seed [slug]

使用特定或所有模块的记录填充数据库。

参数

  • --class - 模块根种子类的名称。
  • --database - 要填充的数据库连接。

填充所有模块。

php artisan module:seed

填充特定模块。

php artisan module:seed blog

开始构建一些令人惊叹的模块!

作者

Pierre Silva