Slim PHP Framework: может ли промежуточное ПО быть загружено лениво?

При создании небольшого приложения 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?

1

Решение

Вы звоните на завод в add()вместо того, чтобы просто рассказывать Слиму о ключе DIC.

т.е. изменить:

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

в

->add('middleware.withdep');

Таким образом, Slim запросит у DIC файл «middleware.withdep», когда он ему понадобится.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]