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;
}

此處把密碼, 郵件 用戶名中文詞語做了封裝. 用起來比較簡潔.


封裝的代碼見附件


附件地址:點我




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