数据过滤是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;
}
此处把密码, 邮件 用户名中文词语做了封装. 用起来比较简洁.
封装的代码见附件