數據過濾是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;
}
此處把密碼, 郵件 用戶名中文詞語做了封裝. 用起來比較簡潔.
封裝的代碼見附件