2016-03-09 1 views
1

При создании небольшого приложения Slim я заметил, что все мои экземпляры промежуточного программного обеспечения создаются для каждого запроса. У меня есть четыре маршрута в моем приложении, только один из которых требует экземпляра PDO, но все они создают экземпляр. Для другого маршрута требуется экземпляр SoapClient, но снова запросы на любой маршрут приводят к созданию экземпляров. Могу ли я сделать что-то по-другому, чтобы избежать этого?Тонкая PHP-платформа: может ли промежуточное программное обеспечение быть ленивым?

Вот разобранный пример, показывающий, что я имею в виду:

<?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 соединения здесь
Got зависимость

Запросы/nopdo получить это, что я не хочу:

PDO соединение здесь
Нет зависимости

Итак, есть ли способ только создать экземпляр экземпляра «ПД» для запросов к/withpdo?

ответ

3

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

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

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

в

->add('middleware.withdep');

Таким образом, Слим спросит DIC для 'middleware.withdep', когда он нуждается в этом.

+0

Ahhh, я не понял этого. Подтвердил, что он ведет себя так, как ожидалось. Благодаря! –