0

私はいくつかの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 [[メッセージ]]: 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->


単一のフィルターを正しい方法で積み重ねるにはどうすればよいですか? add() 関数も InputFilters を受け入れると思っていましたが、似ていません。

助けてthx :-)

4

1 に答える 1

1

あなたの質問はかなりロードされています。アプローチを再考する必要があります。ここに、検討できる小さな記事とツールがあります。

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

于 2015-07-10T19:03:41.673 に答える