martynbiz/slim3-module

一个用于在Slim 3项目中加载模块的简单类

dev-master 2016-06-09 14:09 UTC

This package is not auto-updated.

Last update: 2024-09-23 13:13:27 UTC


README

介绍

Slim3模块

安装

Composer

"require-dev": {
    "martynbiz/slim3-module": "dev-master"
}

入门

此库期望在模块目录内有一个目录,并在该模块中有一个{module_name}/Module类

modules/
├── Hello
│   └── Module.php

public/index.php

$moduleInitializer = new \MartynBiz\Slim3Module\Initializer($app, [
    'autoload' => [ // <--- list of modules to autoload
        'Hello',
    ],
    'modules_path' => '/path/to/modules',
]);

$moduleInitializer->initModules();

composer.json

TODO 添加命名空间路径,例如 App/Module

/path/to/modules/Hello/Module.php

namespace Hello;

use Slim\App;
use MartynBiz\Slim3Module\AbstractModule;

class Module extends AbstractModule
{
    public function initRoutes(App $app)
    {
        $app->get('/hello/{name}', function ($request, $response) {
            $name = $request->getAttribute('name');
            $response->getBody()->write("Hello, $name");

            return $response;
        });
    }
}

高级用法

模块可以调用其他模块的库。为了允许这样做,模块初始化器将按以下顺序加载模块

  1. 为所有模块初始化类映射
  2. 从所有模块导入设置
  3. 为所有模块初始化依赖关系
  4. 为所有模块初始化应用程序中间件
  5. 最后,为所有模块初始化路由

要配置模块,简单地覆盖AbstractModule类的相关方法

namespace Hello;

use Composer\Autoload\ClassLoader;
use Slim\App;
use Slim\Container;
use MartynBiz\Slim3Module\AbstractModule;

class Module extends AbstractModule
{
    public function getModuleConfig()
    {
        return [
            'logger' => [
                //...
            ],
        ];
    }

    public function initClassLoader(ClassLoader $classLoader)
    {
        $classLoader->setPsr4("Hello\\", __DIR__ . "/src");
    }

    public function initDependencies(Container $container)
    {
        $container['logger'] = function ($c) {
            $settings = $c->get('settings')['logger'];
            $logger = new \Monolog\Logger($settings['name']);
            $logger->pushProcessor(new \Monolog\Processor\UidProcessor());
            $logger->pushHandler(new \Monolog\Handler\StreamHandler($settings['path'], \Monolog\Logger::DEBUG));
            return $logger;
        };

        //...
    }

    public function initMiddleware(App $app)
    {
        //...
    }

    public function initRoutes(App $app)
    {
        $app->get('/hello/{name}', function ($request, $response) {
            $name = $request->getAttribute('name');
            $response->getBody()->write("Hello, $name");

            return $response;
        });
    }
}