1

Я просто обновляю свой ZF2 до V2.1.4, чтобы использовать метод init класса Zend \ Form для инъекции ServiceLocator в FieldSet, как объясняет Zend documentation.Zend Framework 2 Inject Service Manager в Fieldset

У меня есть в файлах Global.php и Module.php определения драйвера базы данных и службы, как также объясняется documentation. Эта услуга работает нормально во всех проектах.

Это мой Fieldset Код:

class UserFieldset extends Fieldset implements ServiceLocatorAwareInterface{ 
     protected $serviceLocator; 
      public function setServiceLocator(ServiceLocatorInterface $sl) { 
       $this->serviceLocator = $sl; 
      } 
      public function getServiceLocator() { 
       return $this->serviceLocator; 
      } 
      public function init() { 
       var_dump($this->serviceLocator); 
      } 

      public function __construct() { 
        ......... 
      } 

}

Моя проблема является продолжением:

Внутри UserFieldset :: Init (метод), $ this-> ServiceLocator не экземпляр Zend \ ServiceManager \ ServiceManager, например, при получении службы с контроллера. Экземпляр Zend \ Form \ FormElementManager и использование var_dump, см., Что он не имеет сервиса моей настройки Zend.

Как я могу получить экземпляр Zend \ ServiceManager \ ServiceManager внутри поля, используя DI?

Пожалуйста, помогите мне.

ответ

0

Вы в значительной степени должны использовать конструктор-инжектировать все свои материалы. Я делаю это так:

$form = new SomeForm($serviceManager) 

Внутри SomeForm:

public function __construct(ServiceManager $serviceManager) { 
    $fieldSet = new SomeFieldset($serviceManager) 

    $this->add($fieldSet); 
} 

Вы можете вкладывать это в основном так глубоко, как вы хотите. Хорошая документация о том, как все это делается в

+0

Это решение уже рассматривалось, я хотел бы вводить без использования этого tecnique (как показано в документации Zend версии 2.1). – josepmra

+1

@josepmra Вы вызываете форму самостоятельно из ServiceManager? Интерфейс есть, потому что, вероятно, где-то в ZF есть инициализатор, который будет вызывать геттер после построения. Но вам нужно вызвать форму из ServiceManager! Затем произойдет инъекция. – Sam

0

Попробуйте позвонить в FormElementManager сек getServiceLocator() метод

public function init() { 
    var_dump($this->serviceLocator->getServiceLocator()); 
} 
+0

$ this-> serviceLocator-> getServiceLocator() имеет значение null, FormElementManager ничего не объявил в zend config. – josepmra

+0

Вы реализовали 'FormElementProviderInterface' в своем модуле? – Crisp

+0

Да, кроме того, у меня есть служба, определенная в методе Module :: getFormElementConfig() – josepmra

2

Вы можете захватить менеджер службы instace так:

public function init() { 
    // You will get the application wide service manager 
    $sm = $this->getFormFactory()->getFormElementManager()->getServiceLocator(); 

    // Now you can get things like the application configuration 
    $config = $sm->get('Config'); 
} 

Примечание : Убедитесь, что ваш набор полей создан с помощью FormElementManager.

+1

Я использую fieldset как тип коллекции форм, и это не работает для меня; он говорит: Вызов функции-члена get() на null. – Aise