0

inputFilterSpecification のクラス メンバーを持つ 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();
    }
}

コントローラーでフォームをデバッグすると、工場で設定した正しい値が表示されます。 デバッグ出力

どこでデバッグしても、常に期待値が表示されます。

初期値にラミナを使用する理由 初期値がまだ存在するのはなぜですか?

[+++編集+++]

興味深い:Fieldset関数内ののオブジェクト ID を確認しますFileFieldset()->getInputFilterSpecification()。この関数は 3 回呼び出されます。最初の 2 回は、期待される値と同じオブジェクト ID です。3 回目は、オブジェクト 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;
    }
}
4

1 に答える 1