首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ZendFramework2- InputFilter添加InputFilter

ZendFramework2- InputFilter添加InputFilter
EN

Stack Overflow用户
提问于 2015-02-20 07:28:01
回答 1查看 1.2K关注 0票数 0

我写了一些InputFilters。现在,我使用其中的几个筛选和验证一个表单。因此,我想我可以编写一个新的InputFilter,在构造器中添加我需要的所有其他内容,并将这个新的添加到表单中,但是它需要大量的工作^^,这是我的代码:

样本InputFilter

代码语言:javascript
复制
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);
            }
        }
    }
 }

我的配置:

代码语言:javascript
复制
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,
        ),
    ),
);

我的工厂:

代码语言:javascript
复制
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 (在这里,我添加了表单所需的所有内容):

代码语言:javascript
复制
class RegisterFilter extends InputFilter
{
    public function __construct(InputFilter $myEmailFilter)
    {
        $this->add($myEmailFilter, 'email');
    }
}

现在,将过滤器添加到我的寄存器控制器中的表单中:

代码语言:javascript
复制
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直接添加到表单时,它可以工作,如果我添加了寄存器过滤器,就会得到一个异常。

[附加信息]:Zend\InputFilter\Exception\InvalidArgumentException [File]:/home/vagrant/project/vendor/zendframework/zendframework/library/Zend/InputFilter/BaseInputFilter.php:137 [Message]:BaseInputFilter\BaseInputFilter::setData需要数组或可遍历参数;接收到的字符串[堆栈跟踪]:#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_func(Array,对象(Zend\Mvc\MvcEvent)) #7 /home/vagrant/project/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php(207):Zend\EventManager\EventManager->triggerListeners('dispatch',对象(Zend\Mvc\MvcEvent),对象(闭包) #8 /home/vagrant/project/vendor/zendframework/zendframework/library/Zend/Mvc/Controller/AbstractController.php(117):Zend\EventManager\EventManager->trigger('dispatch',对象(Zend\Mvc\MvcEvent),对象(闭包) #9 /home/vagrant/project/vendor/zendframework/zendframework/library/Zend/Mvc/DispatchListener.php(114):Zend\Mvc\Controller\AbstractController->dispatch(Object(Zend\Http\PhpEnvironment\Request),对象(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(/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',对象(Zend\Mvc\MvcEvent),对象(闭包) #13 /home/vagrant/project/vendor/zendframework/zendframework/library/Zend/Mvc/Application.php(309):Zend\EventManager\EventManager->trigger('dispatch',对象(Zend\Mvc\MvcEvent),对象(闭包) #14 /home/迷走/project/public/index.php(17):Zend\Mvc\Application->run() #15 {main}

如何以正确的方式叠加单个过滤器?虽然add()函数也接受InputFilters,但是它看起来很像。

thx求助:-)

EN

回答 1

Stack Overflow用户

发布于 2015-07-10 19:03:41

你的问题很有说服力。你需要重新考虑你的方法。我有一篇可以考虑的文章和工具,在这里:

http://circlical.com/blog/2015/7/6/zend-framework-2-forms-factories-inputfilters-and-hydration

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28623678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档