2015-01-14 4 views
1

Я пытаюсь реализовать 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?

+1

Я не совсем понимаю ваш вопрос и что вы пытаясь достичь, поэтому я просто оставлю вам комментарий о том, почему ваш код не работает. Вы пытаетесь пропустить Pimple (в вашем коде $ app) как массив, что невозможно, потому что Pimple реализует только ArrayAccess. Если вам нужна такая функциональность, вы можете расширить Pimple и реализовать Iterator, или IteratorAggregate. – Darko

+0

Также вам нужно позаботиться о заказе, сначала поставьте $ app ['testme'] .... Затем поставщик услуг может получить доступ к $ app ['testme'] – ivoba

+0

@ivoba Не уверен, что вы имеете в виду, но объекты/сервисы ленивы загружаются через обратные вызовы, поэтому порядок неважен. – DanFromGermany

ответ

0

Ваши Exemple обновленные с МОК силикатного и моих бедных знаний о инъекции интерфейса:

$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']; 
    } 
} 
+0

Не имеет значения, что я установил testme, это был всего лишь пример. Как ваш ответ показывает, где инъекция интерфейса может быть реализована в Silex или как – DanFromGermany

+0

@DanFromGermany. Ваша потребность совершенно неясно, я просто обновляю свой ответ в качестве примера моей интерпретации интерфейса. – Fractaliste

+0

Спасибо, что предоставили больше кода. 'foreach ($ app as $ val) {' этот пункт не работает, поскольку 'Silex \ Application' не проходит. – DanFromGermany

Смежные вопросы