是否可以使用 Zend Servicemanager 传输中间件?

Is it possible to pipe a middleware using Zend Servicemanager?

我正在使用 Zend Expressive 作为 API。我已经成功地添加了一个中间件,它为每个请求验证 headers of API Keys 的请求。

目前我在config/pipeline中添加middleware using the pipe() function。php

$app->pipe(new MyAuthMiddleware(....);

这实际上效果很好。 但是,我想使用 Zend Servicemanager 添加管道,使用 configuration file,例如:

return [
'dependencies' => [
    /* ... */
    'invokables' => [
        // Remove this entry:
        App\Action\HelloAction::class => App\Action\HelloAction::class,
    ],
    'factories' => [
        /* ... */
        // Add this:
        App\Action\HelloAction::class => App\Action\HelloActionFactory::class,
    ],
    /* ... */
],];

问题:是否可以使用 Zend Servicemanager 通过管道传输中间件? 如果可以的话如何。

是的,这是可能的。在 1.1 之前,它是按照您的要求配置驱动的。从 1.1 开始,如果您通过框架安装,它默认是编程驱动的。您仍然可以使用配置驱动,但我不得不提一下您不能同时使用两者。至少,不推荐。

一个配置可能看起来像这样(取自一个富有表现力的 1.0 表现力应用程序)。错误处理在 1.1+ 中发生了变化,但我没有相关示例。

<?php

return [
    'dependencies' => [
        'factories'  => [
            // ...
        ],
    ],

    'middleware_pipeline' => [
        'always' => [
            'middleware' => [
                Zend\Expressive\Helper\ServerUrlMiddleware::class,
            ],
            'priority'   => 10000,
        ],

        'routing' => [
            'middleware' => [
                Zend\Expressive\Container\ApplicationFactory::ROUTING_MIDDLEWARE,
                Zend\Expressive\Helper\UrlHelperMiddleware::class,
                LocalizationMiddleware::class,
                AuthenticationMiddleware::class,
                AuthorizationMiddleware::class,
                Zend\Expressive\Container\ApplicationFactory::DISPATCH_MIDDLEWARE,
            ],
            'priority'   => 1,
        ],

        'error' => [
            'middleware' => [
                Application\Middleware\Auth\UnauthorizedErrorMiddleware::class,
                Application\Middleware\Auth\ForbiddenErrorMiddleware::class,
                Application\Middleware\Logger\ExceptionLoggerMiddleware::class,
            ],
            'error'      => true,
            'priority'   => -10000,
        ],
    ],
]; 

这是我现在可以找到的更多信息: