[英]Zend Framework 2 - InputFilter add InputFilter
我已經寫了一些InputFilters。 現在我要篩選並使用其中的幾個來驗證表單。 所以我以為我可以寫一個新的InputFilter,在構造器中添加所有我需要的其他東西,並將這個新的設置為表單,但是它的確起作用^^這是我的代碼:
樣本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(在這里我要添加所有我需要的表格):
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添加到窗體時,它可以工作,如果我添加registerfilter,則會出現異常
[[其他信息]]:Zend \\ InputFilter \\ Exception \\ InvalidArgumentException [[文件]]:/home/vagrant/project/vendor/zendframework/zendframework/library/Zend/InputFilter/BaseInputFilter.php:137 [[Message]]: Zend \\ InputFilter \\ BaseInputFilter :: setData需要一個數組或Traversable參數; 收到的字符串[[堆棧跟蹤]]:#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 / vendor / 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 [內部功能]:Zend \\ Mvc \\ Controller \\ AbstractActionController-> onDispatch(Object(Zend \\ Mvc \\ MvcEvent))#6 / home / vagrant / project / vendor / zendframework / zendframework / library / Zend / EventManager / EventManager。的PHP(468):call_user_fun c(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(Array,Object(Zend \\ Mvc \\ MvcEvent) ))#12 / home / vagrant / project / vendor / zendframework / zen dframework / 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-> trigger('dispatch',Object(Zend \\ Mvc \\ MvcEvent),Object(Closure))#14 / home / vagrant / project / public / index.php(17):Zend \\ Mvc \\ Application-> run()#15 {main}
如何以正確的方式堆疊單個過濾器? 以為add()函數也可以接受InputFilters,但是看起來像。
尋求幫助:-)
您的問題已經很豐富了。 您需要重新考慮您的方法。 我在這里有一些文章和工具可供您考慮:
http://circlical.com/blog/2015/7/6/zend-framework-2-forms-factories-inputfilters-and-hydration
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.