Я пытаюсь настроить приложение PHP Slim (не напрямую связанное с моим вопросом), и мне бы хотелось, чтобы лучший способ передать зависимости маршрута к моей функции маршрута. Например, следующее работает так, как должно:
$app = new \Slim\Slim();
$testMessage = 'This is a test';
$app->get('/hello', function () use ($testMessage) {
echo $testMessage; //output: This is a test
});
Но я также пытаюсь использовать Pimple (Dependency Injection), который создает массив, который я могу ссылаться. Вместо того, чтобы передавать весь массив на мой маршрут, я предпочел бы передать только те объекты/службы, которые мне нужны (для более удобного кода). Например:
$app = new \Slim\Slim();
$container = new Container();
$container['test'] = function ($c) {
return new Test();
};
$app->get('/hello', function () use ($container['test']) { //I get a syntax error on this line
var_dump($container['test']);
});
Я мог бы "использовать" весь $container
, но тогда я передаю все в контейнер на маршрут, даже если мне нужен только один объект. При попытке отладить это я обнаружил, что могу передать любую переменную, которая выглядит так: $simple
которая может включать весь массив или объект, но я не могу использовать свойство объекта (значение $Test->value
) или одно значение из массива ($array['value']
), если я не добавлю дополнительный шаблон для переназначения этих значений следующим образом:
$Test = $container['test'];
$app->get('/hello', function () use ($Test) {
var_dump($Test); //everything works fine
});
Но тогда я создаю дополнительные объекты из области моего маршрута, и это может стать беспорядочным, конечно.
Может ли кто-нибудь сказать мне, есть ли способ use
$container['test']
в закрытии или предложить какие-либо советы?
Я бы рекомендовал передать весь контейнерный объект. Это создает очень мало дополнительных накладных расходов (просто новая ссылка), и вы не создаете дополнительные переменные без пробела. Он также позволяет добавлять зависимости, если возникнет такая необходимость.