При создании небольшого приложения 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 здесь
Нет зависимости
Итак, есть ли способ создать экземпляр «PDO» только для запросов к / withpdo?
Вы звоните на завод в add()
вместо того, чтобы просто рассказывать Слиму о ключе DIC.
т.е. изменить:
->add($c['middleware.withdep']);
в
->add('middleware.withdep');
Таким образом, Slim запросит у DIC файл «middleware.withdep», когда он ему понадобится.
Других решений пока нет …