Определение::addMethodCall не вызывает метод set

#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); as setArguments не существует, но у меня все еще та же проблема

2. Мне удалось использовать $def->setArguments([$this->_configPath]); , но у меня такая же проблема

3. Как определяется ваша фабрика? Это сервис?