超薄PHP框架:中间件可以延迟加载吗?

时间:2016-03-09 15:25:17

标签: php lazy-loading slim

在构建一个小型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连接
无依赖性

那么,有没有办法只实例化&#34; PDO&#34;请求/ withpdo的实例?

1 个答案:

答案 0 :(得分:3)

您正在add()调用工厂,而不是仅仅告诉Slim有关DIC密钥的信息。

即。改变:

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

->add('middleware.withdep');

这样,Slim会向DIC询问中间件.withdep&#39;什么时候需要它。