Я пытаюсь реализовать interface injection
с Silex\Application
,
У меня есть мой начальный загрузчик в одном файле PHP, обратите внимание, это упрощено без интерфейсов на самом деле:
$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!');
}
}
}
}
Первое исключение не должно быть выброшено, но я ожидал, что второе сработает.
Почему вышеупомянутое не работает, и где может быть место в Silex для добавления конфигурации в интерфейсы в соответствии с $app[....] instanceof MyAwareInterface
?
Ваш пример обновлен с помощью Silex IOC и моих плохих знаний о внедрении интерфейса:
$app = new Silex\Application();
$app->register(
new ServiceProvider($app)
);
$app['testme'] = function() {
return new ThisObjectImplementsMyInterface();
};
$app->run();
И у меня есть ServiceProvider:
class ServiceProvider implements ServiceProviderInterface{
public function register(Application $app) {
$app['configure.interface'] = function() use ($app) {
foreach ($app as $val) {
if ($val instanceOf 'MyInterface') {
$val->configureInterfaceMethod($app['param1'], $app['param2'] /*, ...*/);
}
}
}
}
public function boot(Application $app) {
$app['configure.interface'];
}
}
Других решений пока нет …