creolab/laravel-modules

此包的最新版本(0.5.6)没有提供许可证信息。

Laravel 4中的应用特定模块

0.5.6 2014-02-10 10:37 UTC

This package is auto-updated.

Last update: 2024-09-17 18:44:33 UTC


README

此包已不再维护。

我鼓励您使用composer包来管理模块,以便获得最大的灵活性。

Laravel 4中的模块

在Laravel 4中,可以通过向您的 "composer.json" 文件中添加以下内容来启用应用特定模块

"require": {
    "creolab/laravel-modules": "dev-master"
}

并添加一个新的提供者到您的 "app/config/app.php" 文件中的提供者列表

'providers' => array(
    'Creolab\LaravelModules\ServiceProvider',
);

您还需要将您的模块目录添加到composer自动加载器中

"autoload": {
    "classmap": [
        "app/modules"
    ]
}

这也意味着每次您向模块中添加一个新的类时,都需要运行 "composer dump-autoload"

默认情况下,您可以在 "app" 目录下添加一个 "modules" 目录。以下是我项目中的一个结构示例

app/
|-- modules
    |-- auth
        |-- controllers
        |-- models
        |-- views
        |-- module.json
    |-- content
        |-- controllers
        |-- models
        |-- views
        |-- module.json
    |-- shop
        |-- module.json
    |-- system
        |-- module.json

注意,每个模块都有一个 "module.json" 文件,其中您可以启用/禁用模块。我计划添加更多元数据到这些模块定义中,但我需要反馈来确定其中应该包含什么。首先可能是某种启动类。

如果您想将模块放在多个目录中,您需要按照以下方式更改包配置文件

'path' => array(
    'app/modules',
    'public/site',
    'another/folder/containing/modules',
),

并且不要忘记在 composer.json 文件中将这些目录添加到自动加载列表中。

一个可用的选项是模块加载的顺序。这可以通过向您的 module.json 文件中添加以下内容来实现

"order": 5

默认顺序为0,所以如果您没有定义它,请记住这一点。

目前请查看示例实现,并请提供反馈 ;)

https://github.com/bstrahija/laravel-modules-example

命令

此包通过以下两种命令提供可用性

php artisan modules

它简单地显示根据配置中设置的模式设置的所有当前模块。并且

php artisan modules:scan

如果您将模块设置为 "manifest" 模式,则需要此命令(见下文)。此命令扫描模块的方式与 "auto" 模式相同,但将结果缓存到manifest文件中。

优化

默认情况下,该包扫描 "modules" 目录中的 "module.json" 文件。这不是发现模块的最佳方法,我计划在Finder类中实现某种缓存。为了进一步优化模块Finder,您可以发布包配置,并通过运行以下命令将模块和定义直接添加到配置文件中

php artisan config:publish creolab/laravel-modules

并编辑文件 "app/config/packages/creolab/laravel-modules/config.php"。您只需将 "mode" 参数从 "auto" 更改为 "manual",并在 "modules" 键下列出您的模块。配置中已提供示例。

注意:对于具有多个路径的手动模式:Laravel-Modules无法确定使用哪个路径。因此,请指定包含您想要加载的模块的文件夹。例如:

'modules' => [
    'app/modules' => [
        'system' => ['enabled' => true],
    ],
    'another/modules/path' => [
        'pages' => ['enabled' => false],
        'seo'   => ['enabled' => true],
    ],
],

您还可以将多个模块路径作为数组添加,但请注意,如果模块具有相同的名称,则可能会出现问题。

包含文件

您还可以指定模块中要自动包含的文件。只需在 module.json 配置中添加文件列表即可

{
    "include": [
        "breadcrumbs.php"
    ]
}

默认设置了一些文件,如果存在,则会被包含。请查看最新的配置文件,并在需要时重新发布配置。默认情况下,以下文件将被包含

'include' => array(
    'helpers.php',
    'filters.php',
    'composers.php',
    'routes.php',
    'bindings.php',
    'observers.php',
)

因此,您可以选择将自定义文件添加到全局配置中,这将使每个模块都查找这些文件,或者您可以通过将它们添加到 module.json 文件中来按模块设置。

服务提供商

新增功能是为每个模块注册服务提供商。只需在您的 module.json 文件中添加一行,如下所示

"provider": "App\\Modules\\Content\\ServiceProvider"

这些服务提供商类与您添加到 app/config/app.php 配置中的任何其他服务提供商完全一样,因此通过扩展 \Illuminate\Support\ServiceProvider 类并添加适当的方法来设置这些类。

您也可以通过提供一个数组来为每个模块注册多个提供商。

"provider": [
    "App\\Modules\\Content\\ServiceProvider",
    "App\\Modules\\Content\\AnotherServiceProvider"
]

请注意,您可能需要运行 composer dump-autoload 以避免出现缺少类的错误。

模块清单

另一种可能的模式是 "manifest",这基本上会在您的 Laravel 存储目录中写入一个包含所有模块定义的 JSON 清单文件。这只会进行一次,并且要更新清单文件,您需要删除它或通过以下命令重新扫描模块

php artisan modules:scan

资源

最近添加了为每个模块发布公共资源的能力。只需运行

php artisan modules:publish

然后所有包含 "assets" 目录的模块都将发布到 Laravel 公共目录。您也可以通过提供模块名称来为单个模块发布资源

php artisan modules:publish content

迁移

每个模块都可以有自己的迁移,并且它们需要位于模块/migrations 目录中。例如,如果您想为 auth 模块创建一个创建用户表的迁移

php artisan migrate:make create_users_table --path=app/modules/auth/migrations --table=users --create

要运行所有模块迁移,请这样做

php artisan modules:migrate

或要运行特定模块的迁移

php artisan modules:migrate auth

如果您在 module.json 中包含了一个 seeder 设置,您还可以从模块中填充数据库。只需将 --seed 选项传递给命令

php artisan modules:migrate --seed

填充

模块也可以有填充器。只需像创建常规填充器一样创建类,将其放置在模块内部某处,并确保运行 composer dump-autoload。然后在您的 module.json 文件中添加以下内容

"seeder": "App\\Modules\\Content\\Seeds\\DatabaseSeeder"

此设置应包含您的填充器类的命名空间路径。现在只需运行

php artisan modules:seed

以填充所有模块。或者您可以为特定模块进行操作

php artisan modules:seed content

命令

您可以添加模块特定的命令。这是一个 artisan 命令文件创建的示例

php artisan command:make <MyModuleCommandName> --path=app/modules/<MyModule>/commands --namespace=App\Modules\<MyModule>\Commands --command=modules.mymodule:mycommand

然后在 module.json 中添加(如果您有多个命令,也可以添加一个数组)

"command": "App\\Modules\\<MyModule>\\Commands\\MyModuleCommandName"

在 dump-autoload 之后,您现在可以从命令行执行 modules.mymodule:mycommand

php artisan modules.mymodule:mycommand

别名

如果您在模块中声明了 Facades,您可能希望为模块创建别名,您可以在 module.json 中简单地引用您的别名

"alias": {
	"<MyAlias>" "App\\Modules\\<MyModule>\\Facades\\<MyFacade>"
}

许可

此软件包是开源软件,根据 MIT 许可证 许可。