Slim 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 connection here
Got dependency
对 /nopdo 的请求得到这个,我不想要:
PDO connection here
No dependency
那么,有没有办法只为对 /withpdo 的请求实例化 "PDO" 实例?
您正在调用 add()
中的工厂,而不是仅仅告诉 Slim DIC 密钥。
即变化:
->add($c['middleware.withdep']);
到
->add('middleware.withdep');
这样,Slim 会在需要时向 DIC 请求 'middleware.withdep'。
在构建一个小型 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 connection here
Got dependency
对 /nopdo 的请求得到这个,我不想要:
PDO connection here
No dependency
那么,有没有办法只为对 /withpdo 的请求实例化 "PDO" 实例?
您正在调用 add()
中的工厂,而不是仅仅告诉 Slim DIC 密钥。
即变化:
->add($c['middleware.withdep']);
到
->add('middleware.withdep');
这样,Slim 会在需要时向 DIC 请求 'middleware.withdep'。