Zend3 InputFilter 不验证表单
Zend3 InputFilter not validating Form
我找到了另一个 post(ZF2 InputFilter not validating fieldset)来解决我的问题,但没有用。
我有一个类别实体,我想验证标题的长度。
所以我的模型(没有现有的 getter 和 setter)
class Category
{
/**
* @var int
*/
private $id;
/**
* @var string
*/
private $name;
}
我的 Category
表格:
class CategoryForm extends Form
{
public function init()
{
$this->setHydrator(new ClassMethods(false));
$this->setObject(new Category());
$this->setInputFilter(new CategoryFilter());
$this->add([
'name' => 'id',
'type' => 'hidden'
]);
$this->add([
'name' => 'name',
'type' => 'text'
]);
$this->add([
'name' => 'submit',
'type' => 'submit'
]);
}
}
以及当前不工作的过滤器。
class CategoryFilter extends InputFilter
{
public function init()
{
$this->add([
'name' => 'name',
'required' => true,
'filters' => [
['name' => StringTrim::class]
],
'validators' => [
[
'name' => StringLength::class,
'options' => [
'min' => 5
]
]
]
]);
}
}
如果有人需要我在控制器中的 addAction:
public function addAction()
{
$request = $this->getRequest();
if ($request->isPost()) {
$this->form->setData($request->getPost());
if ($this->form->isValid()) {
$this->mapper->save($this->form->getData());
$this->redirect()->toRoute('categories');
}
}
return [
'form' => $this->form
];
}
在我发现的每个示例中,它都应该有效。但是我的表单从未经过验证或过滤(使用 trim)。
我是不是忘记了什么?为什么它不起作用?
所以我有点变了。
类别表转到:
class CategoryForm extends Form
{
public function init()
{
$this->add(array(
'type' => CategoryFieldSet::class,
'options' => array(
'use_as_base_fieldset' => true,
),
));
$this->add([
'name' => 'submit',
'type' => 'submit'
]);
}
}
我也更改了过滤器
class CategoryFilter extends InputFilter
{
public function __construct()
{
$this->add([
'name' => 'name',
'required' => true,
'filters' => [
['name' => StringTrim::class]
],
'validators' => [
[
'name' => StringLength::class,
'options' => [
'min' => 5
]
]
]
]);
}
}
然后我用验证器定义了 FieldSet:
class CategoryFieldSet extends Fieldset implements InputFilterProviderInterface
{
/**
*
*/
public function init()
{
$this->setHydrator(new ClassMethods(false));
$this->setObject(new Category());
$this->add([
'name' => 'id',
'type' => 'hidden'
]);
$this->add([
'name' => 'name',
'type' => 'text',
]);
}
/**
* Should return an array specification compatible with
* {@link Zend\InputFilter\Factory::createInputFilter()}.
*
* @return array
*/
public function getInputFilterSpecification()
{
$filter = new CategoryFilter();
return $filter->getInputs();
}
}
更改此设置后,我收到预期的错误消息,如:
The input is less than 5 characters long
我找到了另一个 post(ZF2 InputFilter not validating fieldset)来解决我的问题,但没有用。
我有一个类别实体,我想验证标题的长度。 所以我的模型(没有现有的 getter 和 setter)
class Category
{
/**
* @var int
*/
private $id;
/**
* @var string
*/
private $name;
}
我的 Category
表格:
class CategoryForm extends Form
{
public function init()
{
$this->setHydrator(new ClassMethods(false));
$this->setObject(new Category());
$this->setInputFilter(new CategoryFilter());
$this->add([
'name' => 'id',
'type' => 'hidden'
]);
$this->add([
'name' => 'name',
'type' => 'text'
]);
$this->add([
'name' => 'submit',
'type' => 'submit'
]);
}
}
以及当前不工作的过滤器。
class CategoryFilter extends InputFilter
{
public function init()
{
$this->add([
'name' => 'name',
'required' => true,
'filters' => [
['name' => StringTrim::class]
],
'validators' => [
[
'name' => StringLength::class,
'options' => [
'min' => 5
]
]
]
]);
}
}
如果有人需要我在控制器中的 addAction:
public function addAction()
{
$request = $this->getRequest();
if ($request->isPost()) {
$this->form->setData($request->getPost());
if ($this->form->isValid()) {
$this->mapper->save($this->form->getData());
$this->redirect()->toRoute('categories');
}
}
return [
'form' => $this->form
];
}
在我发现的每个示例中,它都应该有效。但是我的表单从未经过验证或过滤(使用 trim)。
我是不是忘记了什么?为什么它不起作用?
所以我有点变了。
类别表转到:
class CategoryForm extends Form
{
public function init()
{
$this->add(array(
'type' => CategoryFieldSet::class,
'options' => array(
'use_as_base_fieldset' => true,
),
));
$this->add([
'name' => 'submit',
'type' => 'submit'
]);
}
}
我也更改了过滤器
class CategoryFilter extends InputFilter
{
public function __construct()
{
$this->add([
'name' => 'name',
'required' => true,
'filters' => [
['name' => StringTrim::class]
],
'validators' => [
[
'name' => StringLength::class,
'options' => [
'min' => 5
]
]
]
]);
}
}
然后我用验证器定义了 FieldSet:
class CategoryFieldSet extends Fieldset implements InputFilterProviderInterface
{
/**
*
*/
public function init()
{
$this->setHydrator(new ClassMethods(false));
$this->setObject(new Category());
$this->add([
'name' => 'id',
'type' => 'hidden'
]);
$this->add([
'name' => 'name',
'type' => 'text',
]);
}
/**
* Should return an array specification compatible with
* {@link Zend\InputFilter\Factory::createInputFilter()}.
*
* @return array
*/
public function getInputFilterSpecification()
{
$filter = new CategoryFilter();
return $filter->getInputs();
}
}
更改此设置后,我收到预期的错误消息,如:
The input is less than 5 characters long