Я пытаюсь реализовать interface injection
с Silex\Application
. у меня самонастройку в одном PHP файл, ум, это упрощена без интерфейсов фактически:Интерфейсный впрыск с Silex
$app = new Silex\Application();
$app->register(
new ServiceProvider($app)
);
$app['testme'] = function() {
throw new Exception('I am invoked');
};
$app->run();
И у меня есть ServiceProvider:
class ServiceProvider implements ServiceProviderInterface
{
public function register(Application $app) {
foreach ($app as $key => $val) {
if ($key == 'testme') {
throw new Exception('it works!');
}
}
}
}
Первое исключение не должно быть выброшено, но Я ожидал, что второй запустит.
Почему это не работает и где может быть место в силексе для ввода конфигурации в интерфейсы в соответствии с $app[....] instanceof MyAwareInterface
?
Я не совсем понимаю ваш вопрос и что вы пытаясь достичь, поэтому я просто оставлю вам комментарий о том, почему ваш код не работает. Вы пытаетесь пропустить Pimple (в вашем коде $ app) как массив, что невозможно, потому что Pimple реализует только ArrayAccess. Если вам нужна такая функциональность, вы можете расширить Pimple и реализовать Iterator, или IteratorAggregate. – Darko
Также вам нужно позаботиться о заказе, сначала поставьте $ app ['testme'] .... Затем поставщик услуг может получить доступ к $ app ['testme'] – ivoba
@ivoba Не уверен, что вы имеете в виду, но объекты/сервисы ленивы загружаются через обратные вызовы, поэтому порядок неважен. – DanFromGermany