首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laminas有静态InputFilterSpecification

Laminas有静态InputFilterSpecification
EN

Stack Overflow用户
提问于 2020-06-11 14:17:57
回答 1查看 148关注 0票数 0

我有一个包含inputFilterSpecification类成员的字段集:

代码语言:javascript
复制
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;
    }
}

这是我的表单,在这里我集成了字段集:

代码语言:javascript
复制
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();
    }
}

如果我在控制器中调试我的表单,我会看到我在工厂中设置的正确值:

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

为什么要用层序作为初始值?为什么初始值仍然存在?

+++EDIT+++

有趣:我在函数Fieldset中查看FileFieldset()->getInputFilterSpecification()中的对象ID。这个函数被调用三次。前两次使用期望值和相同的对象ID。第三次,对象ID是不同的,值是初始值。

为什么不是单身人士?

为什么没有用工厂创建FileFieldset实例?

FileFieldsetFactory

代码语言:javascript
复制
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;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-12 08:28:10

解决问题的两件事:

  1. 在FileFieldset

中设置名称

代码语言:javascript
复制
    public function init()
    {
        $this->setName('file_fieldset');

  1. 在FileForm中添加FileFieldset实例,而不是在FileForm中添加

代码语言:javascript
复制
$this->add($this->fileFieldset);

因此,对象ID总是相同的,值与预期相同。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62326506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档