如何在zend框架2中从控制器添加表单验证

时间:2013-04-24 05:36:01

标签: zend-framework2 zend-validate

我尝试从我的控制器添加验证,如下所示。但它总是显示这个

 if ($request->getPost('ownerType') == "Company") {

        $form->getInputFilter()->get('companyName')->getValidatorChain()->addValidator('required');
    }

显示错误。我对以下错误感到困惑。

Catchable fatal error: Argument 1 passed to Zend\Validator\ValidatorChain::addValidator() must implement interface Zend\Validator\ValidatorInterface, string given, called in E:\xampp\htdocs\hossbrag\module\WebApp\src\WebApp\Controller\JobController.php on line 177 and defined in E:\xampp\htdocs\hossbrag\vendor\zendframework\zendframework\library\Zend\Validator\ValidatorChain.php on line 100

我的控制器在这里

<?php

namespace WebApp\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use WebApp\Entity\User;
use Zend\View\Model\JsonModel;
use vendor\mpdf\mpdf;

class JobController extends AuthenticatedController
{
public function createAction()
    {
$form = new \WebApp\Form\JobpostingForm();
        $form->get('companyName')->setValueOptions($company);

        $checkAgreement = true;

        $request = $this->getRequest();
        if ($request->getPost('ownerType') == "Company") {

            $form->getInputFilter()->get('companyName')->getValidatorChain()->addValidator('required');
        }
}
}

我的控制器应该更改什么才能获得适当的解决方案。

1 个答案:

答案 0 :(得分:0)

如果您遇到这样明确的错误,只需查看来源;)

首先要检查的是Zend\Validator\ValidatorInterface。错误显示,实现此接口的类是例外。查看您将看到的代码,该函数需要一个Class,而不仅仅是一个字符串。

但是,由于你已经习惯了ZF,很明显你知道还有其他方法可以添加东西。那么让我们来看看Zend\InputFilter\InputFilter#add()。您将看到add()函数的第一个参数确实要求实现ValidatorInterface的类。但它也接受了其他一些东西:

/**
 * Add an input to the input filter
 *
 * @param  array|Traversable|InputInterface|InputFilterInterface $input
 * @param  null|string $name
 * @return InputFilter
 */
public function add($input, $name = null)
{
    //...
}

它还接受arrayTraversableInputInterfaceInputFilterInterface。所以有选择。

现在,我自己从未这样做过,我真诚地希望这有效(如果不是我很糟糕!),但假设您使用的是数组语法,那么您所要做的就是:

[...]->getValidatorChain()->add(array(
    'type' => 'Zend\Validator\NotEmpty'
));

请告诉我这是否适合您;)