magmasoftwareengineering / slim-module-middleware
用于 Slim Framework 4 的模块管理
Requires
- php: >=7.4 || >=8.2
- psr/http-message: ^1.1
- psr/log: ^3.0
- slim/psr7: ^1.6
- slim/slim: ^4.13
Requires (Dev)
- vimeo/psalm: ^5.24
README
slim-module-middleware
嗨,你是一名开发者吗?你正在寻找一种方式来增强你的 Slim Framework 4 项目吗?那就不要再看其他地方了,这个新的软件库就是你所需要的!通过强大的模块加载功能,你可以将你的 Slim Framework 开发提升到新的水平。
当你在一个小型项目上工作时,Slim Framework 是很棒的,然而,一旦你需要在复杂系统中使用它,事情开始变得有点混乱。因此,slim-module-middleware 应运而生,并包含了你将代码分离成模块所需的一切,而不会打破 Slim Framework 本身的流程。这反过来可以帮助你的工作流程并提高你的生产力。
所以还等什么呢?今天尝试 slim-module-middleware,看看它能为你的 Slim Framework 项目带来什么差异!
安装
安装仅通过 Composer 支持
composer require magmasoftwareengineering/slim-module-middleware
这将安装 slim-module-middleware 及所有必需的依赖项。
然后确保你有一个
$loader = require __DIR__ . '/vendor/autoload.php';
合理的位置在你的项目的引导程序中。
使用
定义一个模块
模块简单地是一组与 Slim Framework 相关的文件,例如 dependencies.php、middleware.php、routes.php 和 settings.php,然而,它还包含一个额外的开销——模块文件夹中需要有一个 'Module.php' 文件。以下是一个 Module.php 的示例
<?php
namespace MyApp\Namespace;
use MagmaSoftwareEngineering\Slim\Module\AbstractModule;
/**
* Class Module
* @package MyApp\Namespace
*/
class Module extends AbstractModule
{
}
注意,模块不需要包含任何代码,只是你的模块的其他部分需要与在 Module.php 中指定的相同命名空间共享——这只是为了帮助模块加载器识别什么是一个模块。模块加载器将在 settings => modules => 路径数组中遍历文件夹,并向上到 4 个子文件夹深度,寻找 'Module.php' 文件。
所以,在你的项目中完全可能有以下类似的内容
src/
modules/
admin/
MyAdminModule/
Controller/
dependencies.php
Module.php
routes.php
dashboards/
MyAdminDashboardModule/
Controller/
dependencies.php
Module.php
routes.php
dashboards/
MyDashboardModule/
Controller/
dependencies.php
Module.php
routes.php
MyNonAdminModule/
Controller/
Entity/
Repository/
Service/
dependencies.php
middleware.php
Module.php
routes.php
settings.php
这可以实现相关资源的分组,并通过减少在关注较小批次的相关代码时的视野,降低开发者的认知负担。
设置
<?php
return [
'settings' => [
// ...
// Slim related settings
// ...
'modules' => [
'path' => [
// Modules
dirname(__DIR__) . '/app/modules',// Path to MyApp
dirname(__DIR__) . '/vendor/magmasoftwareengineering',// If you want to load any of our other module-aware libraries
],
'middleware' => [
'MagmaSoftwareEngineering\PhpDebugBar',// Example middleware module
],
'load' => [
'MagmaSoftwareEngineering\Rollout',// Example feature flagging module
'MyAppNamespace\ModuleName',// Your app-specific modules
'MyAppOtherNamespace\OtherModuleName'// Another of your modules etc.
],
'log' => false,// Enable logging of module loading
],
]
];
中间件
假设你在容器中有一个名为 'logger' 的记录器(monolog/monolog 或其他 psr/logger),以及名为 'autoload' 的 composer 自动加载器
<?php
use DI\Container;
use Psr\Log\LoggerInterface;
use Slim\App
/** @var Container $container */
/** @var \Composer\Autoload\ClassLoader $loader */
$container['autoload'] = $loader;
$container[\MagmaSoftwareEngineering\Slim\Module\ModuleLoader::class] = static function (
App $app, Container $container
): \MagmaSoftwareEngineering\Slim\Module\ModuleLoader {
$modules = $container->get('settings')['modules'];
return new \MagmaSoftwareEngineering\Slim\Module\ModuleLoader([
'app' => $app,
'modulesPath' => $modules['path'],
'logger' => isset($modules['log']) && $modules['log'] === true ? $container->get(LoggerInterface::class) : null,
]);
};
或者,如果你更喜欢流畅的接口使用
<?php
use DI\Container;
use Psr\Log\LoggerInterface;
use Slim\App;
/** @var Container $container */
/** @var \Composer\Autoload\ClassLoader $loader */
$container['autoload'] = $loader;
$container[\MagmaSoftwareEngineering\Slim\Module\ModuleLoader::class] = static function (
App $app, Container $container
): \MagmaSoftwareEngineering\Slim\Module\ModuleLoader {
$modules = $container->get('settings')['modules'];
return (new \MagmaSoftwareEngineering\Slim\Module\ModuleLoader())
->setApp($app)
->setModulesPath($modules['path'])
->setLogger(isset($modules['log']) && $modules['log'] === true ? $container->get(LoggerInterface::class) : null);
->init();
};