объясни пожалуйстаgrigori, так неясно о чём ты ведёшь речь: ну, бери Pimple, добавь этот сахар, что ещё?
что такое по-нормальному?либо дописать зависимости контроллера в конфиге и инжектить по-нормальному.
Ну это если хочется автокомплита.
По-нормальному — это явно. Все этичто такое по-нормальному?
/** @[USER=4683]var[/USER] $foo Bar */
$foo = $this->container->get('bar');
Может. Через конструктор или метод. Ни о каких контейнерах класс не знает.Зависимость так и так будет, ее не может не быть.
Под методом подразумевается setter, а не action. Работа с action — это уже не забота DIC.Инжектить прямо в метод - ок для простых проектов, где контроллер не дергает несколько своих методов, в которые не хочется передавать те же зависимости, а вместо этого дергать $this->foo.
Где отдельный контроллер? Отдельная строчка в конфиге DI — да.таки отдельный контроллер. спасибо
вот этот новый компилируемый язык поверх PHP мне и не нравитсяmail_manager:
abstract: true
calls:
- [setMailer, ["@my_mailer"]]
newsletter_manager:
class: "%newsletter_manager.class%"
parent: mail_manager
<?php
$container['foo'] = function (Container $c) {
return new Foo(...);
};
$container['controller.foo'] = function (Container $c) {
return new Controller($c['a'], $c['b']);
};
$container['controller.bar'] = function (Container $c) {
return $c['controller.foo']->setFoo($c['foo']);
};
/**
вспомнился мне Минималистичный dependency injection container
ну да че и говорить, fixxxer'у и grigori'ю посвещается
*/
include 'phpclub.ru/talk/threads/74634/';
// разширим его на конфигурацию
class MyInj extends Injector{
public function setConfig($cfg){
foreach( $cfg as $key => $val ){
$this->$key = function() use ($val,$cfg) {
$params = array();
if(isset($val['params'])){
foreach( $val['params'] as $parameter){
if(isset($cfg[$parameter])){
$params[] = $this->$parameter;
}
else{
$params[] = $parameter;
}
}
}
$reflect = new ReflectionClass( $val['class'] );
return $reflect->newInstanceArgs( $params );
};
}
}
}
class Dependency {}
class Service {
public function __construct(Dependency $dependency, $flag) {
$this->dependency = $dependency;
$this->flag = $flag;
}
}
;di.conf.ini
[service]
class = Service
params[] = dependency
params[] = 1
[dependency]
class = Dependency
$inj = new MyInj;
$inj->setConfig( parse_ini_file('di.conf.ini',true));
print_r( $inj->service );
мда, я о нем забыл, хотя про него и думалfixxxer'у и grigori'ю посвещается
А ты не в курсе можно ли это сделать из коробки без создания кастомного ParamConverter'а? Потому что инжектить в сам action в случае, если сервис нужен только ему, предпочтительней, да.А зачем инжектить в класс контроллера, а не метод, как это делается в symfony/silex? Только если я не ошибаюсь в symfony можно еще этот подход и закешировать.
То есть пишите
И controllerResolver сам разруливать что и куда инжектить. В принципе это дело можно даже не кешировать, рефлексия медленная, но не для вызова одной функцииPHP:public function blaBlaAction(Request $request, Connection $connect, $id, $name) { }