我有一个Fieldset,它的类成员是inputFilterSpecification。
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();
}
}
如果我在控制器中调试我的表单,我看到了我在工厂中设置的正确值。
无论我在哪里调试,我总是看到预期的值。
为什么要使用laminas的初始值?为什么初始值仍然存在?
[++++编辑+++]
有意思。我看了一下对象的ID Fieldset
在函数中 FileFieldset()->getInputFilterSpecification()
. 这个函数被调用三次。前两次调用的是预期值和相同的对象ID。第三次,对象ID不同,值是初始值。
为什么不是单子?
为什么会有一个 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);
所以对象的ID总是一样的,数值也是预期的。