Я написал несколько InputFilters. Теперь я wanne фильтровать и проверять форму с несколькими из них. Так я думал, что я могу написать новый InputFilter добавить все остальные мне нужно в строителю и установить этот новый в форме, но работа ^^ доцент вот мой код:
образец InputFilterZend Framework 2 - InputFilter add InputFilter
class MyEmailFilter extends InputFilter
{
protected $config = array(
array(
'name' => 'email',
'required' => true,
'allow_empty' => false,
'validators' => array(
array(
'name' => 'NotEmpty',
'options' => array(
'messages' => array(
NotEmpty::IS_EMPTY => 'Please type in your emailaddress.',
)
),
'break_chain_on_failure' => true,
),
array(
'name' => 'EmailAddress',
'break_chain_on_failure' => true,
),
),
),
);
public function init()
{
foreach ($this->config as $name => $input) {
if (is_string($name)) {
$this->add($input, $name);
} else {
$this->add($input);
}
}
}
}
мой конфиг:
return array(
'input_filters' => array(
'invokables' => array(
'member.myemailfilter' => 'Member\InputFilter\MyEmailFilter',
),
'factories' => array(
'member.registerfilter' => 'Member\InputFilter\Service\RegisterFilterFactory',
),
'shared' => array(
'common.myemailfilter' => true,
'member.registerfilter' => true,
),
),
);
моя фабрика:
class RegisterFilterFactory implements FactoryInterface
{
public function createService(ServiceLocatorInterface $inputFilterPluginManager)
{
/** @var ServiceLocatorInterface $serviceLocator */
$serviceLocator = $inputFilterPluginManager->getServiceLocator();
/** @var MyEmailFilter $emailFilter */
$emailFilter = $serviceLocator->get('InputFilterManager')->get('member.myemailfilter');
return new RegisterFilter($emailFilter);
}
}
RegisterInputFilter (здесь я WANNE добавить все что мне нужно для вида):
class RegisterFilter extends InputFilter
{
public function __construct(InputFilter $myEmailFilter)
{
$this->add($myEmailFilter, 'email');
}
}
теперь добавляют фильтр к форме в моей registercontroller:
class RegisterController extends AbstractActionController
{
/**
* registrierungszeuch
*/
public function indexAction()
{
if ($this->getAuthService()->hasIdentity()) {
return $this->redirect()->toRoute('home');
}
$form = $this->getRegisterForm();
if ($this->request->isPost()) {
$form->setData($this->params()->fromPost());
$form->setInputFilter($this->getRegisterFilter());
if ($form->isValid()) {
var_dump('valide');
} else {
var_dump('invalide');
}
}
$viewModel = new ViewModel();
$viewModel
->setVariable('form', $form);
return $viewModel;
}
/**
* @return Form
*/
private function getRegisterForm()
{
return $this->getServiceLocator()->get('FormElementManager')->get('form.user.register');
}
/**
* @return RegisterFilter
*/
private function getRegisterFilter()
{
return $this->getServiceLocator()->get('InputFilterManager')->get('member.registerfilter');
}
}
, когда я прямо добавляю myEmailFilter в форму, он работает, если i добавить registerfilter, я получаю исключение
[[Дополнительная информация]]: Zend \ InputFilter \ Exception \ InvalidArgumentException [[Файл]]: /дома/бродяга/проект/продавец/ZendFramework/ZendFramework/библиотека/Zend/InputFilter/BaseInputFilter.php: 137 [[Сообщение]]: Zend \ InputFilter \ BaseInputFilter :: setData ожидает массив или аргумент Traversable; полученная строка [[Stack trace]]: # 0 /home/vagrant/project/vendor/zendframework/zendframework/library/Zend/InputFilter/BaseInputFilter.php(535): Zend \ InputFilter \ BaseInputFilter-> setData ('') # 1 /home/vagrant/project/vendor/zendframework/zendframework/library/Zend/InputFilter/BaseInputFilter.php(147): Zend \ InputFilter \ BaseInputFilter-> populate() # 2/home/vagrant/project/поставщик/zendframework/zendframework/library/Zend/Form/Form.php (467): Zend \ InputFilter \ BaseInputFilter-> setData (Array) # 3/home/vagrant/project/module/Member/src/Controller/RegisterController. php (29): Zend \ Form \ Form-> isValid() # 4 /home/vagrant/project/vendor/zendframework/zendframework/library/Zend/Mvc/Controller/AbstractActionController.php(83): Member \ Controller \ RegisterController-> indexAction() # 5 [in ternal function]: Zend \ Mvc \ Controller \ AbstractActionController-> onDispatch (Object (Zend \ Mvc \ MvcEvent)) # 6 /home/vagrant/project/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php (468): call_user_func (Array, Object (Zend \ Mvc \ MvcEvent)) # 7 /home/vagrant/project/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php(207): Zend \ EventManager \ EventManager -> triggerListeners ('dispatch', Object (Zend \ Mvc \ MvcEvent), Object (Closure)) # 8 /home/vagrant/project/vendor/zendframework/zendframework/library/Zend/Mvc/Controller/AbstractController.php (117): Zend \ EventManager \ EventManager-> trigger ('dispatch', Object (Zend \ Mvc \ MvcEvent), Object (Closure)) # 9/home/vagrant/project/vendor/zendframework/zendframework/library/Zend/Mvc/DispatchListener.php (114): Zend \ Mvc \ Controller \ AbstractController-> dispatch (Object (Zend \ Http \ PhpEnvironment \ Request), Object (Zend \ Http \ PhpEnvironment \ Response)) # 10 [внутренняя функция]: Zend \ Mvc \ DispatchListener-> onDispatch (Object (Zend \ Mvc \ MvcEvent)) # 11 /home/vagrant/project/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php(468): call_user_func (массив, объект (Zend) \ Mvc \ MvcEvent)) # 12 /home/vagrant/project/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php(207): Zend \ EventManager \ EventManager-> triggerListeners ('dispatch', Object (Zend \ Mvc \ MvcEvent), Object (Closure)) # 13 /home/vagrant/project/vendor/zendframework/zendframework/library/Zend/Mvc/Application.php(309): Zend \ EventManager \ EventManager-> триггер («Отправка», Объект (Zend \ Mvc \ MvcEvent), Объект (Закрытие)) # 14/home/vagrant/project/public/ind ex.php (17): Zend \ Mvc \ Application-> run() # 15 {main}
Как я могу сшить отдельные фильтры в правильном направлении? подумал, что функция add() также принимает InputFilters, но выглядит dosent.
ТНХ помощи :-)