纤薄的PHP框架:中间件可以延迟加载


Slim PHP Framework: can middleware be lazy-loaded?

在构建一个小型 Slim 应用程序时,我注意到我所有的中间件实例都是为每个请求创建的。我的应用程序中有四条路由,其中只有一条需要 PDO 实例,但所有路由都会创建一个实例。另一个路由需要一个 SoapClient 实例,但同样,对任何路由的请求都会导致创建实例。我可以做一些不同的事情来避免这种情况吗?

这是一个精简的示例,显示了我的意思:

<?php
require __DIR__ . '/../vendor/autoload.php';
class Middleware {
    private $dep;
    public function __construct($dep = null) {
        $this->dep = $dep;
    }
    public function __invoke($req, $res) {
        $res->getBody()->write($this->dep ? 'Got dependency' : 'No dependency');
        return $res;
    }
}
$app = new 'Slim'App();
$c = $app->getContainer();
$c['pdo'] = function ($c) {
    echo "PDO connection here<br/>'n";
    return (object) ['pdo' => true];
};
$c['middleware.nodep'] = function ($c) {
    return new Middleware();
};
$c['middleware.withdep'] = function ($c) {
    return new Middleware($c['pdo']);
};
$app->get('/nopdo', function () {})->add($c['middleware.nodep']);
$app->get('/withpdo', function () {})->add($c['middleware.withdep']);
$app->run();

正如您所期望的那样,对/withpdo 的请求将获得以下响应:

PDO连接在这里
有依赖关系

对/nopdo的请求得到这个,我不想要:

PDO连接在这里
无依赖关系

那么,有没有办法只实例化对/withpdo 的请求的"PDO"实例?

您是在add()打电话给工厂,而不仅仅是告诉 Slim 有关 DIC 密钥的信息。

即更改:

->add($c['middleware.withdep']);

->add('middleware.withdep');

这样,Slim 会在需要时向 DIC 请求"中间件.withdep"。