magmasoftwareengineering/slim-module-middleware

用于 Slim Framework 4 的模块管理

1.1.0 2024-06-24 20:28 UTC

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.phpmiddleware.phproutes.phpsettings.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();
};