jkuchynka/laravel-modular

Laravel Modular

v0.9.1 2021-02-06 00:54 UTC

This package is auto-updated.

Last update: 2024-09-06 09:12:37 UTC


README

要求:Laravel 8.0^

这是一个工作进展中(WIP)的项目。随着我们朝着稳定版本发布而努力,许多内容正在快速变化。但无论如何,您可以自由尝试并提供反馈。我们正在接近完成,下面我们将详细说明哪些功能尚未工作以及开发中即将到来的是什么。

为什么使用这个包?

创建此包是为了使在模块化设置中使用 Laravel 更加容易。您可以使用模块化模式与开箱即用的 Laravel,但会遇到问题和烦恼,例如

  • 控制台命令不会映射到您的模块化目录结构
  • 许多 Laravel 假设默认的混合目录结构
  • 无法干净地分离迁移、工厂、种子文件、路由或视图

由于上述原因,如果您管理具有类似功能的多站点,那么从一个站点复制到另一个站点会非常痛苦。更不用说几乎不可能保持同步。我们仍在努力找出解决此问题的最佳方法。

模块使用默认的 Laravel 目录结构设置,但仅提供与模块相关的功能。它可以发布一个配置,可以被其他模块或在全局级别修改。

安装

composer require jkuchynka/laravel-modular
php artisan vendor:publish --provider="Modular\ModularServiceProvider"

此包可用于现有或新的 Laravel 应用。如果您想要一个全新的起点,您可以删除 app/ 中默认 Laravel 安装的所有文件。模块化提供了一个名为“Base”的内置模块。您可能需要编辑一些文件才能使 Laravel 正确运行

// bootstrap/app.php
$app->singleton(
    Illuminate\Contracts\Http\Kernel::class,
    Modular\Base\Http\Kernel::class
);

$app->singleton(
    Illuminate\Contracts\Console\Kernel::class,
    Modular\Base\Console\Kernel::class
);

$app->singleton(
    Illuminate\Contracts\Debug\ExceptionHandler::class,
    Modular\Base\Exceptions\Handler::class
);
// config/app.php
/*
 * Application Service Providers...
 */
Modular\Base\Providers\AppServiceProvider::class,
Modular\Base\Providers\AuthServiceProvider::class,
// Modular\Base\Providers\BroadcastServiceProvider::class,
Modular\Base\Providers\EventServiceProvider::class,
Modular\Base\Providers\RouteServiceProvider::class,

在 Modular\Base 模块中没有任何特殊的功能,因此您可以安全地创建自己的 App\Base 模块,并在需要时将这些文件拉入。

Artisan

所有 make 命令都与默认 Laravel 类似,但都带有模块参数,这将在正确的模块化目录中创建文件,并使用正确的命名空间等。在每个 make 命令之后,将模块名称作为第一个参数传递。

此处的目标是保持所有 make 命令与默认 Laravel 相同,而只需更改所需的命名空间和路径。目前唯一不工作的命令是控制器和模型的命令

php artisan make:model Users User

即将推出

正在开发中的 make:module 命令,它可以在 app/ 中创建新的模块。这将是一个交互式命令,您可以使用一个命令设置模型、控制器、请求等。新的模块目录结构可以通过 config/modular.php 修改。

正在开发中的自定义模板。使用您自己的自定义模板并将它们插入到 make 命令中。

模块

模块可以简单地是 app/ 中的一个目录,其中有一个 NameModule.php 类。这个类必须扩展 Modular/Module 并提供一些必需的属性和方法。此模块必须在 config/modular.php 中启用,通过添加带有配置变量的命名空间模块数组来覆盖。

return [
    'modules' => [
        \App\Posts\PostsModule::class => [
            'some_var' => 'foo'
        ]
    ]
]
<?php

namespace App\Posts;

use Modular\Module;

class PostsModule extends Module
{
    // The unique key of the module
    protected $key = 'posts';

    // The display name of the module
    protected $name = 'Posts';

    protected $description = 'Posts Module!!!';

    protected $version = '1.0';

    // Module config, can be overridden by other modules and app
    public function config(): array
    {
        return [
            'some_config_var' => true,
            'dependsOn' => ['users']
        ];
    }

    // Module routes
    public function routes(): array
    {
        return [
            // This is a route group
            [
                'prefix' => 'api',
                'middleware' => ['api'],
                'routes' => [
                    ['uri' => '', 'method' => 'api-resource']
                ]
            ]   
        ];       
    }   
}

配置

模块可以提供自己的配置,可以被其他模块或在 config/modular.php 中的全局应用修改。这有助于创建灵活的模块,可以满足多种用例。例如,一个 Auth 模块默认提供密码、Google 和 Facebook 登录,您可以在 config/modular.php 中指定要使用的登录方法。

模块配置使用示例

$modular = app(\Modular\Modular::class);
$users = $modular->getModule('users');

// Get module name
echo $users->name;

// Get all config vars
dump($users->getConfig());

// Get a config var with default
echo $users->get('some_var', 'foo');

路由

在Module类中,一个模块可以提供路由。该方法应该返回一个包含子路由的组数组。默认情况下,一个组对应一个Web路由。每个子路由都以前缀模块键开头,除非URI以/开头,这表示路由是绝对的。在这个例子中,省略了uses,因此将使用默认的模块控制器,例如PostController。

public function routes(): array
{
    return [
        [
            'prefix' => 'api',
            'middleware' => ['api'],
            'routes' => [
                ['uri' => '', 'method' => 'resource']
            ]
        ]
    ];
}