[英]Laminas, problem with passing filtered fieldset inputs values to validator factory
[英]Laminas Fieldset has static InputFilterSpecification
对于 inputFilterSpecification,我有一个包含 class 个成员的 Fieldset:
class FileFieldset extends Fieldset implements InputFilterProviderInterface
{
protected $mimeTypes = ['image/jpg', 'image/png', 'application/pdf'];
protected $fileSizeMin = 0;
protected $fileSizeMax = 1;
public function setMimeTypes(array $mimeTypes): void
{
$this->mimeTypes = $mimeTypes;
}
public function setFileSizeMin($fileSizeMin): void
{
$this->fileSizeMin = $fileSizeMin;
}
public function setFileSizeMax($fileSizeMax): void
{
$this->fileSizeMax = $fileSizeMax;
}
public function init()
{
$this->add([
'name' => 'file_file',
'type' => File::class,
'options' => [
'label' => 'Datei',
],
]);
}
public function getInputFilterSpecification()
{
$filter = [];
$filter['file_file'] = [
'required' => true,
'filters' => [
],
'validators' => [
[
'name' => MimeType::class,
'break_chain_on_failure' => true,
'options' => [
'enableHeaderCheck' => true,
'disableMagicFile' => true,
'magicFile' => null,
'mimeType' => $this->mimeTypes,
]
],
[
'name' => Size::class,
'options' => [
'min' => $this->fileSizeMin,
'max' => $this->fileSizeMax,
'useByteString' => true,
],
],
],
];
return $filter;
}
}
这是我的表格,我在其中整合了字段集:
class FileForm extends AbstractForm implements InputFilterProviderInterface
{
protected $fileFieldset;
public function setFileFieldset(FileFieldset $fileFieldset): void
{
$this->fileFieldset = $fileFieldset;
}
public function init()
{
$this->add([
'type' => FileFieldset::class,
'options' => [
'use_as_base_fieldset' => true,
],
]);
$this->add([
'type' => 'submit',
'name' => 'submit',
'attributes' => [
'value' => 'los',
],
]);
}
public function getInputFilterSpecification()
{
return $this->fileFieldset->getInputFilterSpecification();
}
}
如果我在 controller 中调试我的表单,我会看到我在工厂中设置的正确值:
无论我在哪里调试,我总能看到预期的值。
为什么要用laminas的初始值? 为什么初始值仍然存在?
[+++编辑+++]
有趣:我在 function FileFieldset FileFieldset()->getInputFilterSpecification()
中查看 Fieldset 的Fieldset
ID。 这个function被调用了三次。 前两次具有预期值和相同的 object ID。 第三次,object ID不一样,都是初始值。
为什么不是 singleton?
为什么会有一个不是用工厂创建的FileFieldset
实例?
FileFieldsetFactory
:
class FileFieldsetFactory implements FactoryInterface
{
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
$fieldset = new FileFieldset();
$config = $container->get('config')['my_files'];
$fieldset->setFileSizeMin($config['files_size_min']);
$fieldset->setFileSizeMax($config['files_size_max']);
$fieldset->setMimeTypes($config['files_mimetypes']);
$fieldset->init();
return $fieldset;
}
}
解决问题的两件事:
public function init()
{
$this->setName('file_fieldset');
$this->add(['type' => FileFieldset::class]);
$this->add($this->fileFieldset);
因此 object ID 始终相同,并且值与预期一致。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.