在ZF3的module.config.php中,form_elements键被忽略

By simon at 2018-02-28 • 0人收藏 • 63人看过

我无法理解工厂的工作方式。我准备了短文件 测试它的表单元素。 应用/配置/模件e.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,
        ],
    ],
//(...)
];
*应用/ src目录/表格/工厂/ AbcFormFactory.php *
<?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");
    }
}
*
应用/ src目录/表格/ AbcForm.php *
<?php

namespace Application\Form;

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

class AbcForm extends Form
{

    public function __construct($letter='no factory')
    {
        die($letter);
    }
}
上面的代码显示no factory,所以工厂被忽略。如果没有 被忽略,它会显示d It works。 如何为form_elements创建合适的工厂? *
更新
我在控制器中调用窗体:
<?php

namespace Application\Controller;

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

class AbcController extends AbstractActionController
{
    public function indexAction()
    {
        $form = new AbcForm();
    }
}
什么三格格工厂invoke方法?我认为,当表格课堂是 通过new表单工厂invoke方法来实现运行。或不?

1 个回复 | 最后更新于 2018-02-28
2018-02-28   #1

您可以通过new操作员直接实例化您的表单。在zend 框架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,
                    ],
                ],
            ],
        ],
    ],
];
你必须通过依赖交出你的表格向构造函数注入密码 你的控制器。因此我们创建了控制器工厂,其中 实例化你的形式类并将其提供给控制器。在控制器中 本身,您可以使用受保护的表单属性访问您的表单。

登录后方可回帖

Loading...