dnafactory / laravel-modular
将 Laravel 转换为模块化系统
Requires
- php: >=7.0.0
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 中看到此模块的示例。