ZF3 中 src/ 文件夹中的自定义目录

Custom directory in src/ folder in ZF3

我有带表单的 mvc zf3 框架。表单和字段集 类 位于 src/Form 目录中。

以上工作正常。

我试图使 Form 目录更轻便、更清晰,所以我创建了 src/Fieldset 目录并将字段集 类 移到了那里。现在字段集 类 未通过表单 类.

找到
<?php

namespace Application\Form;

use Zend\Form\Element;
use Zend\Form\Form;
use Zend\Hydrator\ClassMethods as ClassMethodsHydrator;
use Zend\InputFilter\InputFilter;

class MyForm extends Form
{
    public function __construct()
    {
        parent::__construct('my_form');

        $this->setAttribute('method', 'post');
        $this->setHydrator(new ClassMethodsHydrator(false));
        $this->setInputFilter(new InputFilter());

        $this->add([
            'type' => AbcFieldset::class,
            'name' => 'abcEntity',
            'options' => [
                'use_as_base_fieldset' => true,
            ],
        ]);

错误信息是

A plugin by the name "Application\Form\AbcFieldset" was not found in the plugin manager Zend\Form\FormElementManager\FormElementManagerV3Polyfill

如何使表单在​​新位置看到字段集 类?

第一个问题是 PSR-4 自动加载器正在文件 src/Form/AbcFieldset.php 目录中寻找 Application\Form\AbcFieldset class。

你可以编写一个自定义的自动加载器,它会在 src/Fieldset 目录中查找,但最好坚持 PSR 标准,而不是将字段集的命名空间更改为 Application\Fieldset(然后你将在您的示例中,需要在表单 class 的顶部添加 use Application\Fieldset\AbcFieldset;

第二个 'problem',错误消息的来源是字段集 class 尚未明确注册到表单元素管理器,因此您也可以添加到 module.config.php

'form_elements' => [
    'factories' => [
        \Application\Fieldset\AbcFieldset::class => \Zend\ServiceManager\Factory\InvokableFactory::class,
    ]
]

但这不是必需的,除非您需要为字段集编写自定义工厂 - 上面的名称空间更改应该可以解决问题。