Laminas Fieldset有静态的InputFilterSpecification。

问题描述 投票:0回答:1

我有一个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();
    }
}

如果我在控制器中调试我的表单,我看到了我在工厂中设置的正确值。debug output

无论我在哪里调试,我总是看到预期的值。

为什么要使用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;
    }
}
zend-framework zend-framework3 laminas
1个回答
0
投票

有两件事可以解决这个问题。

  1. 在FileFieldset中设置名称
    public function init()
    {
        $this->setName('file_fieldset');
  1. 在FileForm中添加FileFieldset实例,而不是用 $this->add(['type' => FileFieldset::class]);
$this->add($this->fileFieldset);

所以对象的ID总是一样的,数值也是预期的。

© www.soinside.com 2019 - 2024. All rights reserved.