Хотя user999305 является правильным (и заслуживает того, чтобы его пометили как решение), учитывая ваш комментарий и недоразумение, я хотел бы привести вам расширенный пример того, что он сказал.
Давайте вамимеют следующую ситуацию:
- Модуль :
FormModule
- Контроллер :
FormController
- Форма :
ComposedForm
В контроллере у вас есть два действия, withTitleAction
и withoutTitleAction
. Оба используют ComposedForm
. Поскольку вам нужно ComposedForm
в вашем FormController
, вам нужно создать его экземпляр с помощью FormPluginManager
(вы можете прочитать об этом в документации )
Теперь у вас есть два вариантакак получить форму в вашем контроллере:
- вы получаете ее через плагин контроллера (как предложено в конце user999305, и что на самом деле является разумной идеей)
- вы вводите
FormPluginManager
в вашем контроллере
Inject FormPluginManager
в контроллере
Прежде всего, вы должны создать фабрику для контроллера:
Контроллер/FormControllerFactory.php
namespace FormModule\Controller;
use Interop\Container\ContainerInterface;
use Zend\ServiceManager\Factory\FactoryInterface;
class FormControllerFactory implements FactoryInterface {
public function __invoke(ContainerInterface $container, $requestedName, array $options = null) {
$formPluginManager = $container->get('FormElementManager');
return new FormController($container, $options);
}
}
Необходимо обновить конфигурацию модуля, чтобы приложение знало, как создать контроллер
module.config.php
'controllers' => [
'factories' => [
Controller\FormController::class => Controller\FormControllerFactory::class
]
],
А теперь просто обновите контроллер, чтобы получить новый параметр:
Controller / FormController.php
namespace FormModule\Controller;
use Zend\Form\FormElementManager;
use Zend\Mvc\Controller\AbstractActionController;
class FormController extends AbstractActionController {
private $formManager;
public function __construct(FormElementManager $formManager) {
$this->formManager = $formManager;
}
}
Сейчас, выполните два действия:
Controller / FormController.php
public function withTitleAction(){
$options = ['hasTitle' => true];
$form = $this->formManager->get(\FormModule\Form\ComposedForm::class, $options);
}
public function withoutTitleAction(){
$options = ['hasTitle' => false];
$form = $this->formManager->get(\FormModule\Form\ComposedForm::class, $options);
}
Наконец, ваша форма:
Form / ComposedForm.php
namespace FormModule\Form;
use Zend\Form\Form;
use Zend\InputFilter\InputFilterProviderInterface;
class ComposedForm extends Form {
public function __construct($name = null, $options = []) {
// DO NOT FORGET THIS
parent::__construct($name, $options);
// The constructor is not really needed, unless you have some
// dependencies or you have to do something particular, like
// setting the hydrator, form attributes, form object, ...
}
public function init() {
parent::init();
if ($this->getOption('hasTitle')) {
$this->add([
'type' => 'text',
'name' => 'title',
'options' => [
'label' => 'text',
'placeholder' => 'Test',
],
]);
}
}
}
Надеюсь, это поможет вам