#php #symfony #symfony-2.3 #symfony3.x
#php #symfony #symfony-2.3 #symfony3.x
Вопрос:
Я пытаюсь обновить Symfony с 2.3 до 3.4. На данный момент я пытаюсь устранить проблему с внедрением зависимостей. Похоже, что старая версия DependencyInjectionDefinition
класса вызывала фабричный метод, когда завод был установлен, но это изменилось?
Я попытался использовать это руководство для обновления кода: https://gist.github.com/mickaelandrieu/5211d0047e7a6fbff925#dependencyinjection . Но я считаю, что поведение класса изменилось.
Итак, это исходный код:
public function getSymfonyValue()
{
$def = new SymfonyComponentDependencyInjectionDefinition("Zend_Config");
$def->setFactoryClass(__CLASS__);
$def->setFactoryMethod('valueFactory');
$def->addArgument($this->_configPath);
return $def;
}
который вызывает этот метод:
public function valueFactory($configPath){
...
return $value;
}
Я обновил тело метода до этого:
$def = new SymfonyComponentDependencyInjectionDefinition("Zend_Config");
$def->setFactory(__CLASS__);
$def->addMethodCall('valueFactory', [$this->_configPath]);
return $def;
Я ожидал, что код вызовет функцию valueFactory
, но эта функция никогда не вызывается. Это может быть связано с тем, что в старом коде нет контейнера? Я не уверен
Ответ №1:
setFactory
Метод ожидает вызываемый объект, а не просто класс. Вызовет addMethodCall
функцию для самой службы, а не для его фабрики.
То, что вы хотите сделать, это :
$def->setFactory(array(__CLASS__, 'valueFactory'))
$def->setArguments(array($this->_configPath))
Это означает, что вы создадите службу, вызвав фабричный метод с заданными аргументами.
Комментарии:
1. Итак, я изменил метод на
$def->addArgument($this->_configPath);
assetArguments
не существует, но у меня все еще та же проблема2. Мне удалось использовать
$def->setArguments([$this->_configPath]);
, но у меня такая же проблема3. Как определяется ваша фабрика? Это сервис?