ZF3中module.config.php中忽略了form_元素键
我无法理解工厂实际上是如何运作的。我准备了一些短文件来测试表单元素 Application/config/module.config.phpZF3中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
<?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谢谢你的回答。你能告诉我为什么工厂调用方法不能启动吗。如何让它运行?我在控制器中调用表单,因为我已经更新了问题。