![](/img/trans.png)
[英]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.