如何通过ZF2 FormElementManager将Doctrine ObjectManager传递给表单

克罗普

我想在需要FormElementManager的ZF2中创建自定义表单元素。我目前正在本教程中所示的表单创建中使用Doctrine Hydrator 在此方法中,在控制器中创建一个ObjectManager对象,并在实例化该对象时将其传递给新表单:

public function editAction()
{
    // Get your ObjectManager from the ServiceManager
    $objectManager = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager');

    // Create the form and inject the ObjectManager
    $form = new UpdateBlogPostForm($objectManager);

    // …

更新表格:

namespace Application\Form;

use Doctrine\Common\Persistence\ObjectManager;
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator;
use Zend\Form\Form;

class UpdateBlogPostForm extends Form
{
    public function __construct(ObjectManager $objectManager)
    {
        parent::__construct('update-blog-post-form');

        // The form will hydrate an object of type "BlogPost"
        $this->setHydrator(new DoctrineHydrator($objectManager));

        // Add the user fieldset, and set it as the base fieldset
        $blogPostFieldset = new BlogPostFieldset($objectManager);
        $blogPostFieldset->setUseAsBaseFieldset(true);
        $this->add($blogPostFieldset);

        // … add CSRF and submit elements …

        // Optionally set your validation group here
    }
}

BlogPost字段集:

namespace Application\Form;

use Application\Entity\BlogPost;
use Doctrine\Common\Persistence\ObjectManager;
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator;
use Zend\Form\Fieldset;
use Zend\InputFilter\InputFilterProviderInterface;

class BlogPostFieldset extends Fieldset implements InputFilterProviderInterface
{
    public function __construct(ObjectManager $objectManager)
    {
        parent::__construct('blog-post');

        $this->setHydrator(new DoctrineHydrator($objectManager))
             ->setObject(new BlogPost());

        // … add fieldset elements …

    }

    // … public function getInputFilterSpecification() …

}

不幸的是,为了使用ZF2的FormElementManager,ZF2手册说:“第二个陷阱是,您不能直接实例化表单类,而必须通过Zend \ Form \ FormElementManager获取它的实例;” 所以我必须得到这样的表格:

 public function editAction()
 {
     $sl = $this->getServiceLocator();
     $form = $sl->get('FormElementManager')->get('\Application\Form\UpdateBlogPostForm');

有没有一种方法可以通过将ObjectManager对象传递$objectManager给表单FormElementManager,或者有没有办法在表单内创建对象,以便水化器和字段集可以使用它?

亚历克斯

DoctrineEntityHydratorFactory

创建水化器并注入对象管理器的工厂。

namespace MyModule\Stdlib\Hydrator;

use DoctrineORMModule\Stdlib\Hydrator\DoctrineEntity;

class DoctrineEntityHydratorFactory
{
    public function __invoke($hydratorPluginManager, $name, $requestedName)
    {
        $serviceManager = $hydratorPluginManager->getServiceLocator();
        $objectManager  = $serviceManager->get('Doctrine\ORM\EntityManager');

        return new DoctrineEntity($objectManager);
    }
}

BlogPostFieldset

可重用的字段集,其中包含Blog帖子的所有元素,并使用EntityHydrator来水合BlogPost实体。

namespace MyModule\Form;

use Zend\Form\Fieldset;

class BlogPostFieldsetFactory
{
    public function __invoke($formElementManager, $name, $requestedName)
    {
        $serviceManager = $formElementManager->getServiceLocator();
        $hydrator = $serviceManager->get('HydratorManager')->get('DoctrineEntityHydrator');

        $fieldset = new Fieldset('blog_post');
        $fieldset->setHydrator($hydrator);
        $fieldset->setObject(new BlogPost);

        //... add fieldset elements.
        $fieldset->add(['...']);
        //...

        return $fieldset;
    }
}

UpdateBlogPostFormFactory

用于创建博客文章更新表单的工厂。这将附加字段集并设置允许其使用字段集hydratoruse_as_base_fieldset选项

namespace MyModule\Form;

class UpdateBlogPostFormFactory
{
    public function __invoke($formElementManager, $name, $requestedName)
    {
        $form = new Form('update_blog_post);

        //...
        $factory = new \Zend\Form\Factory($formElementManager);
        $form->setFormFactory($factory);
        $form->add([
            'name' => 'blog_post',
            'type' => 'BlogPostFieldset',
            'options' => [
                'use_as_base_fieldset' => true,   
            ]
        ]);
        //...

        return $form;
    }
}

您还需要在中向所需的经理注册服务module.config.php

return [
    'form_elements' => [
        'factories' => [
            'UpdateBlogPostForm' => 'MyModule\Form\UpdateBlogPostFormFactory',
            'BlogPostFieldset' => 'MyModule\Form\BlogPostFieldsetFactory',
        ],
    ],
    'hydrators' => [
        'factories' => [
            'DoctrineEntityHydrator' => 'MyModule\Stdlib\Hydrator\DoctrineEntityHydratorFactory',
        ],
    ],
];

因此,通过上述内容,您可以在控制器中请求表格。

$form = $formElementManager->get('UpdateBlogPostForm');

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

ZF2如何将变量传递给表单

来自分类Dev

如何在ZF2中将语言变量传递给布局?

来自分类Dev

Zend Framework(zf2)如何将输入值传递给模型?

来自分类Dev

如何将ZF2表单对象序列化为JSON?

来自分类Dev

如何在ZF2中全局将变量传递到layout.phtml?

来自分类Dev

ZF2:如何翻译表单注释?

来自分类Dev

如何通过选择表单将参数传递给URL?

来自分类Dev

使用ZF2框架将选项传递给php脚本

来自分类Dev

ZF2将0传递到所需的表单字段

来自分类Dev

ZF2表单集合Zend \ Form \ FormElementManager :: get无法获取以下内容或为其创建实例

来自分类Dev

如何在ZF2中将侦听器代码从闭包移动到方法并将参数传递给它?

来自分类Dev

通过Web表单将数据传递给对象

来自分类Dev

通过AJAX将PHP表单变量传递给Google Chart

来自分类Dev

通过AJAX将表单值传递给php

来自分类Dev

通过HTML表单将JavaScript变量传递给视图

来自分类Dev

通过表单将唯一的PHP变量传递给Javascript

来自分类Dev

通过表单将javascript / jquery数组传递给php

来自分类Dev

通过AJAX将PHP表单变量传递给Google Chart

来自分类Dev

ZF2学说:何时刷新ObjectManager

来自分类Dev

ZF2学说:何时刷新ObjectManager

来自分类Dev

如何将参数传递给调用表单?

来自分类Dev

如何将隐藏的值传递给jQuery中的表单

来自分类Dev

如何将默认值传递给Redux表单

来自分类Dev

如何将参数传递给调用表单?

来自分类Dev

Symfony:如何将非实体变量传递给表单

来自分类Dev

如何使用angularjs服务将表单参数传递给Rest?

来自分类Dev

如何将请求传递给 Django 表单?

来自分类Dev

如何将值表单 db 传递给弹出窗口

来自分类Dev

如何将参数传递给 Django 中的表单类?

Related 相关文章

热门标签

归档