zend framework 2 过滤器的使用

数据过滤是phper一大硬问题.  zf2提供了一套过滤的功能即inputFilter. 


使用方式有两种

在zf2提供的例子中filter 和form交替使用, 这当然算是一种使用方法. 但是当我们使用zf2于接口的项目中时, 就不会涉及form的部分, 故此时我们单独使用filter.

以下是zf2提供的方式. Form相当于容器, 并且托管了filter的过滤功能.

$album = new AlbumFilter();
$form->setInputFilter($album->getInputFilter());
$form->setData($request->getPost());
if ($form->isValid())
{
    $fields = $album->exchangeArray($form->getData());
    $result = $albumModel->insert($fields);
    return $this->redirect()->toRoute('album');
}

其实查看$form->isValid()方法时, 就会发现form的验证实际上是使用了InputFilter的验证功能.


public function isValid()
{

        ...

    $filter = $this->getInputFilter();
    if (!$filter instanceof InputFilterInterface) {
        throw new Exception\DomainException(sprintf(
            '%s is unable to validate as there is no input filter present',
            __METHOD__
        ));
    }

    $filter->setData($this->data);
    $filter->setValidationGroup(InputFilterInterface::VALIDATE_ALL);

    $validationGroup = $this->getValidationGroup();
    if ($validationGroup !== null) {
        $this->prepareValidationGroup($this, $this->data, $validationGroup);
        $filter->setValidationGroup($validationGroup);
    }

    $this->isValid = $result = $filter->isValid();
    $this->hasValidated = true;



所以, 若在API中使用时, 即可不需要使用form 而直接用filter


$filter = new UserFilter();
$inputFilter = $filter->getInputFilter();
$inputFilter->setData($data);
if (!$inputFilter->isValid())
{
	$err = $this->getErr('request_paramErr');
	$this->log('request_paramErr', '', array($err, $inputFilter->getMessages()));
	return $this->response('', $err['errno'], $err['error']);
}
$data = $inputFilter->getValues();

配置filter

下面说说filter配置文件. 因为规则很多, 而团队成员不可能都要去学习这些规则, 故把这些规则封装了一下.

在使用的时候如下所示.


public function getInputFilter()
{
    if (!$this->inputFilter) {
	$filter = new InputFilter();
			
	$filter->add($this->int('ID', false, ''));
	$filter->add($this->string('Username', false, '', array('stripTags' => true, 'length' => array(0, 20))));
	$filter->add($this->string('Identifier', false, '', array('stripTags' => true, 'length' => array(0, 20))));
	$filter->add($this->password('Cipher', false, '', array('stripTags' => true, 'length' => array(0, 30))));
	$filter->add($this->string('Purview', false, '', array('stripTags' => true, 'length' => array(0, 100))));
	$filter->add($this->email('Email', false, '', array('stripTags' => true, 'length' => array(0, 50))));
	$filter->add($this->string('Mobile', false, '', array('stripTags' => true, 'length' => array(0, 20))));

	$this->inputFilter = $filter;
    }

    return $this->inputFilter;
}

此处把密码, 邮件 用户名中文词语做了封装. 用起来比较简洁.


封装的代码见附件


附件地址:点我




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章