dnafactory/laravel-modular

将 Laravel 转换为模块化系统

1.4.1 2020-03-22 12:48 UTC

This package is auto-updated.

Last update: 2024-09-06 22:51:44 UTC


README

用法

安装

composer require dnafactory/laravel-modular

在 app 下创建一个 Modules 文件夹

-----> app/Modules

这就完成了!

创建一个模块

在 Modules 下创建一个文件夹

例如:app/Modules/Module1

这就完成了!

模块结构

app
├── Modules
├────── Module1
├──────────── Api
├───────────────── Data
├───────────────────── OneInterface.php
├───────────────────── TwoInterface.php
├───────────────── OneRepositoryInterface.php
├───────────────── TwoManagementInterface.php
├──────────── Channel
├───────────────── OneChannel.php
├───────────────── TwoChannel.php
├──────────── Command
├───────────────── OneCommand.php
├───────────────── TwoCommand.php
├──────────── configs
├───────────────── one.php
├───────────────── two.php
├───────────────── three.php
├───────────────── foldername
├───────────────────── four.php
├──────────── Controller
├───────────────── OneController.php
├───────────────── TwoController.php
├──────────── Management
├───────────────── OneManagement.php
├───────────────── TwoManagement.php
├──────────── etc
├───────────────── commands.php
├───────────────── di.php
├───────────────── providers.php
├──────────── Event
├───────────────── OneEvent.php
├───────────────── TwoEvent.php
├───────────────── ThreeEvent.php
├──────────── factories
├───────────────── One.php
├───────────────── Two.php
├───────────────── Three.php
├──────────── Factory
├───────────────── OneFactory.php
├───────────────── TwoFactory.php
├───────────────── ThreeFactory.php
├──────────── Management
├───────────────── OneManagement.php
├───────────────── TwoManagement.php
├───────────────── ThreeManagement.php
├──────────── Middleware
├───────────────── OneMiddleware.php
├───────────────── TwoMiddleware.php
├───────────────── ThreeMiddleware.php
├──────────── migrations
├───────────────── 2000_00_00_000010_create_first_table.php
├───────────────── 2000_00_00_000020_create_second_table.php
├──────────── Model
├───────────────── One.php
├───────────────── Two.php
├───────────────── Three.php
├──────────── Provider
├───────────────── OneServiceProvider.php
├───────────────── TwoServiceProvider.php
├───────────────── ThreeServiceProvider.php
├──────────── Queue
├───────────────── OnePublisher.php
├───────────────── OneConsumer.php
├──────────── Repository
├───────────────── OneRepository.php
├───────────────── TwoRepository.php
├──────────── routes
├───────────────── api.php
├───────────────── web.php
├──────────── Seed
├───────────────── OneSeeder.php
├───────────────── TwoSeeder.php
├──────────── views
├───────────────── first.blade.php
├───────────────── second.blade.php
├──────────── helpers.php
├──────────── routes.php
├────── Module2
├──────────── ...
├──────────── ...
├────── Module3
├──────────── ...
├──────────── ...

Api 文件夹

此文件夹中所有文件都是 Facade、Proxy、Mediator、Strategy 或通用 Service 的 Service Contract 文件

所有文件都是接口

别忘了在 etc/di.php 中注册此类

注意:Api 的首字母大写且为单数

Api/Data 文件夹

此文件夹中所有文件都是 Model 或通用 Data Class 的 Service Contract 文件

所有文件都是接口

别忘了在 etc/di.php 中注册此类

注意:Data 的首字母大写且为单数

Channel 文件夹

此文件夹中所有文件都是 Event Channel

注意:Channel 的首字母大写且为单数

Command 文件夹

此文件夹中所有文件都是 Console Command

注意:Command 的首字母大写且为单数

configs 文件夹

此文件夹中的所有文件都将被视为配置

您可以使用 config('MODULENAME.FILENAME') 或 config('MODULENAME.FOLDER.FILENAME') 来引用它

注意:configs 小写且为复数

config('module1.one');
config('module1.foldername.four');

Controller 文件夹

此文件夹中的所有文件都是 Controller

所有文件必须以 Controller 结尾

注意:Controller 的首字母大写且为单数

etc 文件夹

此文件夹中定义了一些配置

di.php

di.php 是模块中的 di 数组

providers.php

<?php return [
    'bind' => [
        Interface1::class => Concrete1::class,
        Interface2::class => Concrete2::class,
    ],
    'singleton' => [
        Interface3::class => Concrete3::class,
        Interface4::class => Concrete4::class,
    ],
];

providers.php 是模块中所有服务提供者的数组

commands.php

<?php return [
    Provider1::class,
    Provider2::class
];

commands.php 是模块中所有命令的数组

Event 文件夹

<?php return [
    Command1::class,
    Command2::class
];

此文件夹中的所有文件都是 Event 或 Broadcast Event

注意:Event 的首字母大写且为单数

factories 文件夹

此文件夹中的所有文件都将被视为 Laravel 的 factory

然后您可以使用 factory(One::class),就像 One.php 已在 Laravel 的 factories 文件夹中声明一样

注意:factories 小写且为复数

Factory 文件夹

此文件夹中的所有文件都是自定义 Factory

所有文件必须以 Factory 结尾

注意:Factory 的首字母大写且为单数

参见 Factory 模式:https://refactoring.guru/design-patterns/factory-method

Management 文件夹

此文件夹中的所有文件都是 Management

将所有 Facade、Proxy、Mediator、Strategy 或通用 Service 放在这里

所有文件必须以 Management 结尾。您不需要在文件名中指定模式。

注意:Management 的首字母大写且为单数

参见 Facade 模式:https://refactoring.guru/design-patterns/facade

参见 Proxy 模式:https://refactoring.guru/design-patterns/proxy

参见 Mediator 模式:https://refactoring.guru/design-patterns/mediator

参见 Strategy 模式:https://refactoring.guru/design-patterns/strategy

Middleware 文件夹

此文件夹中的所有文件都是 Middleware 文件

本文件夹中的所有文件都将视为迁移,并按字母数字顺序(所有模块中的所有迁移)执行。

请注意:迁移名称为小写且为复数。

模型文件夹

本文件夹中的所有文件都是模型。

请注意:模型名称首字母大写且为单数。

提供者文件夹

本文件夹中的所有文件都是自定义提供者。

别忘了在 etc/providers.php 中注册所有提供者。

所有文件必须以 ServiceProvider 结尾。

请注意:提供者名称首字母大写且为单数。

队列文件夹

本文件夹中的所有文件都是发布者/消费者队列。

所有文件必须以 Publisher 或 Consumer 结尾。

请注意:队列名称首字母大写且为单数。

仓库文件夹

本文件夹中的所有文件都是仓库。

所有文件必须以 Repository 结尾。

请注意:仓库名称首字母大写且为单数。

routes 文件夹

web.php 文件或 api.php

本文件中的所有路由将在所有应用程序中以 web 或 api 的形式共享。

例如 web.php

<?php Route::get('/hello-world', function (){ echo 'Hello World'; });

现在您可以通过 yoursite.com/hello-world 访问,并在页面上看到 "Hello World"。

请注意:routes.php 为小写且为复数。

Seed 文件夹

本文件夹中的所有文件都是 Seeder。

所有文件必须以 Seed 结尾。

请记住扩展 \Illuminate\Database\Seeder。

请注意:Seeder 名称首字母大写且为单数。

views 文件夹

本文件夹中的所有文件都将被视为视图。

您可以使用 Module1::filename 来引用它。

注意:configs 小写且为复数

module1::first 指向 first.blade.php

module1::first.foo 指向 first/foo.blade.php

return view('module1.first');

请注意:views 为小写且为复数。

helpers.php 文件

本文件中的所有函数将在所有应用程序中共享。

注意:configs 小写且为复数

<?php function sum($a, $b) { return $a + $b; }

现在您可以在应用程序的所有类中使用 sum($a, $b)。

请注意:helpers.php 为小写且为复数。

如何注册 Cron 作业

在提供者文件夹中创建一个名为 RegisterCronServiceProvider 的文件,它扩展 \DNAFactory\Core\Provider\RegisterCronServiceProvider。

实现受保护的 registerCron(Schedule $schedule) 方法,如下所示

protected function registerCron(Schedule $schedule) {
    $schedule->command('command:name')->everyMinute();
}

现在在 etc/providers.php 中注册此 ServiceProvider

如何创建模块化包

在 composer.json 中指定 dnafactory/laravel-modular 的依赖关系。

创建一个扩展 \DNAFactory\Core\Provider\ModuleRegisterServiceProvider 的 ServiceProvider。

实现 getModuleName,指定模块名称。

public function getModuleName() { return 'ModuleName'; } 

实现 getBasePath,指定模块的根路径。

如果文件存储在根目录中

public function getBasePath(){ return __DIR__ . DIRECTORY_SEPARATOR . '..'; }

如果文件存储在 src 中

public function getBasePath(){ 
    return __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'src'; 
} 

将此服务提供者在 AutoDiscover 中添加

"extra": {
         "laravel": {
             "providers": [
                 "VendorName\\ModuleName\\Provider\\NameOfServiceProvider"
             ]
         }
     },

您可以在 \DNAFactory\Core\Provider\ExampleModuleRegisterServiceProvider 中看到此模块的示例。