我想在需要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
}
}
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
,或者有没有办法在表单内创建对象,以便水化器和字段集可以使用它?
创建水化器并注入对象管理器的工厂。
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);
}
}
可重用的字段集,其中包含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;
}
}
用于创建博客文章更新表单的工厂。这将附加字段集并设置允许其使用字段集hydrator的use_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] 删除。
我来说两句