簡體   English   中英

Laminas Fieldset 有 static InputFilterSpecification

[英]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;
    }
}

解決問題的兩件事:

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

因此 object ID 始終相同,並且值與預期一致。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM