Zend Framework 2: передача переменных («параметры») для формирования с помощью formelementmanager

Мне нужно программно изменить поведение формы на основе некоторых параметров. Скажем, например, я показываю форму с информацией о пользователе.

Мне нужно отобразить флажок «отправить почту», если и только если пользователь еще не получил почту активации. Раньше, с ZF1, я делал что-то вроде

$form = new MyForm(array("displaySendMail" => true)) 

который, в свою очередь, был получен в качестве варианта и который позволил сделать

 class MyForm extends Zend_Form { protected $displaySendMail; [...] public function setDisplaySendMail($displaySendMail) { $this->displaySendMail = $displaySendMail; } public function init() { [....] if($this->displaySendMail) { $displaySendMail new Zend_Form_Element_Checkbox("sendmail"); $displaySendMail ->setRequired(true) ->setLabel("Send Activation Mail"); } } 

Как это можно сделать с помощью Zend Framework 2? Все, что я нашел, это управление зависимостями (классами) и ничего об этом сценарии, за исключением этого вопроса SO: ZF2. Как передать переменную в форму, которая в конце концов возвращается к передаче зависимости. Может быть, последний комментарий Jean Paul Rumeau может дать решение, но я не смог заставить его работать. Thx A.

@AlexP, спасибо за вашу поддержку. Я уже использую FormElementManager, поэтому он должен быть простым. Если я правильно понял, я должен просто получить эту опцию в моем конструкторе SomeForm, не так ли?

 [in Module.php] 'Application\SomeForm' => function($sm) { $form = new SomeForm(); $form->setServiceManager($sm); return $form; }, 

в SomeForm.php

 class SomeForm extends Form implements ServiceManagerAwareInterface { protected $sm; public function __construct($name, $options) { [here i have options?] parent::__construct($name, $options); } } 

Я пробовал это, но не работал, я дам ему вторую попытку и дважды проверю все.

С помощью менеджеров плагинов (классы, расширяющие Zend\ServiceManager\AbstractPluginManager ), вы можете предоставить массив «параметры создания» в качестве второго параметра.

 $formElementManager = $serviceManager->get('FormElementManager'); $form = $formElementManager->get('SomeForm', array('foo' => 'bar')); 

Важно то, как вы зарегистрировали сервис у менеджера. «invokable» службы будут иметь массив параметров, переданный в конструктор запрошенной службы , однако «фабрики» (которые должны быть строкой имени фабричного класса) получат параметры в его конструкторе.

редактировать

Вы зарегистрировали свою службу с анонимной функцией, которая означает, что это не сработает для вас. Вместо этого используйте заводский класс .

 // Module.php public function getFormElementConfig() { return array( 'factories' => array( 'Application\SomeForm' => 'Application\SomeFormFactory', ), ); } 

Тогда это фабрика , которая получит опции, введенные в ее конструктор (что, если вы думаете об этом, имеет смысл).

 namespace Application; use Application\SomeForm; use Zend\ServiceManager\ServiceLocatorInterface; use Zend\ServiceManager\FactoryInterface; class SomeFormFactory implements FactoryInterface { protected $options = array(); public function __construct(array $options = array()) { $this->options = $options; } public function createService(ServiceLocatorInterface $serviceLocator) { return new SomeForm('some_form', $this->options); } } 

Кроме того, вы можете вводить непосредственно в службу, которую вы запрашиваете ( SomeForm ), зарегистрировав ее как услугу «invokeable»; очевидно, это будет зависеть от того, какие зависимости требует сервис.