ZF3中module.config.php中忽略了form_元素键

ZF3中module.config.php中忽略了form_元素键,php,zend-framework,zend-form,zend-framework3,Php,Zend Framework,Zend Form,Zend Framework3,我无法理解工厂实际上是如何运作的。我准备了一些短文件来测试表单元素 Application/config/module.config.php <?php namespace Application; use Zend\Router\Http\Literal; use Zend\Router\Http\Segment; use Zend\ServiceManager\Factory\InvokableFactory; use Application\Route\StaticRoute; u

我无法理解工厂实际上是如何运作的。我准备了一些短文件来测试表单元素

Application/config/module.config.php

<?php
namespace Application;

use Zend\Router\Http\Literal;
use Zend\Router\Http\Segment;
use Zend\ServiceManager\Factory\InvokableFactory;
use Application\Route\StaticRoute;
use Doctrine\ORM\Mapping\Driver\AnnotationDriver;
use Application\Form\Factory\AbcFormFactory;
use Application\Form\AbcForm;

return [
    'form_elements' => [
        'factories' => [
            AbcForm::class => AbcFormFactory::class,
        ],
    ],
//(...)
];
<?php

namespace Application\Form\Factory;

use Interop\Container\ContainerInterface;
use Zend\ServiceManager\Factory\FactoryInterface;
use Application\Form\AbcForm;

class AbcFormFactory implements FactoryInterface
{
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
    {
        return new AbcForm("It works");
    }
}

工厂调用方法的触发器是什么?我认为,当表单类通过new实现时,表单工厂调用方法应该运行。是否?

您可以通过
new
操作符直接实例化表单。在zend framework 3中有一个服务容器,其中包含您在模块配置中记录的所有类。在这种情况下,它是
AbcForm
类,应该在工厂上创建。在这种情况下,还应使用工厂创建控制器类。使用依赖项注入告诉控制器要使用哪种表单是一种常见的做法

看看下面的例子

控制器工厂

namespace Application\Controller\Service;

use Application\Form\AbcForm;
use Interop\Container\ContainerInterface;
use Zend\ServiceManager\Factory\FactoryInterface;

class AbcControllerFactory implements FactoryInterface
{
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
    {
        $form = $container->get('FormElementManager')->get(AbcForm::class);
        $controller = new AbcController($form);
        return $controller;
    }
}
控制器本身

namespace Application\Controller;

use Application\Form\AbcForm;
use Zend\Mvc\Controller\AbstractActionController;

class AbcController extends AbstractActionController
{
    protected $form;

    public function __construct(AbcForm $form)
    {
        $this->form = $form;
    }

    public function indexAction()
    {
        if ($this->form->isValid()) {
            // ... and so on
        }
    }
}
您的模块配置

return [
    'controllers' => [
        'factories' => [
            AbcController::class => AbcControllerFactory::class,
        ],
    ],
    'form_elements' => [
        'factories' => [
            AbcForm::class => AbcFormFactory::class,
        ],
    ],
    'router' => [
        'routes' => [
            'your-abcform-application' => [
                'type' => Literal::class,
                'options' => [
                    'route' => '/application/abcform/',
                    'defaults' => [
                        'controller' => AbcController::class,
                    ],
                ],
            ],
        ],
    ],
];

您必须通过依赖项注入将表单移交给控制器的构造函数。因此,我们创建了控制器工厂,它实例化表单类并将其提供给控制器。在控制器本身中,您可以使用protected form属性访问表单。

您可以通过
new
操作符直接实例化表单。在zend framework 3中有一个服务容器,其中包含您在模块配置中记录的所有类。在这种情况下,它是
AbcForm
类,应该在工厂上创建。在这种情况下,还应使用工厂创建控制器类。使用依赖项注入告诉控制器要使用哪种表单是一种常见的做法

看看下面的例子

控制器工厂

namespace Application\Controller\Service;

use Application\Form\AbcForm;
use Interop\Container\ContainerInterface;
use Zend\ServiceManager\Factory\FactoryInterface;

class AbcControllerFactory implements FactoryInterface
{
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
    {
        $form = $container->get('FormElementManager')->get(AbcForm::class);
        $controller = new AbcController($form);
        return $controller;
    }
}
控制器本身

namespace Application\Controller;

use Application\Form\AbcForm;
use Zend\Mvc\Controller\AbstractActionController;

class AbcController extends AbstractActionController
{
    protected $form;

    public function __construct(AbcForm $form)
    {
        $this->form = $form;
    }

    public function indexAction()
    {
        if ($this->form->isValid()) {
            // ... and so on
        }
    }
}
您的模块配置

return [
    'controllers' => [
        'factories' => [
            AbcController::class => AbcControllerFactory::class,
        ],
    ],
    'form_elements' => [
        'factories' => [
            AbcForm::class => AbcFormFactory::class,
        ],
    ],
    'router' => [
        'routes' => [
            'your-abcform-application' => [
                'type' => Literal::class,
                'options' => [
                    'route' => '/application/abcform/',
                    'defaults' => [
                        'controller' => AbcController::class,
                    ],
                ],
            ],
        ],
    ],
];

您必须通过依赖项注入将表单移交给控制器的构造函数。因此,我们创建了控制器工厂,它实例化表单类并将其提供给控制器。在控制器本身中,您可以使用protected form属性访问表单。

在何处以及如何调用表单?您知道吗,您必须使用
$container->get('FormElementManager')->get(AbcForm::class)调用它?@Marcel谢谢你的回答。你能告诉我为什么工厂调用方法不能启动吗。如何让它运行?我在控制器中调用表单,因为我已经更新了问题。在哪里以及如何调用表单?您知道吗,您必须使用
$container->get('FormElementManager')->get(AbcForm::class)调用它?@Marcel谢谢你的回答。你能告诉我为什么工厂调用方法不能启动吗。如何让它运行?我在控制器中调用表单,因为我已经更新了问题。