首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony2容器感知表单类型

Symfony2容器感知表单类型
EN

Stack Overflow用户
提问于 2014-01-10 14:57:24
回答 2查看 8.5K关注 0票数 5

是否有一种方法可以使表单类型容器感知?

作为一个例子,我有3个实体帐户,用户和事件。用户有ManyToMany关系,以便将许多用户与许多其他用户(称为审批人)联系起来,原因是这样做的原因是,用户创建的事件可以有一个能够批准它的用户列表。在用户编辑表单中,我有一个审批人多个select字段,这个列表需要通过帐户过滤,所以我需要我的表单类型是容器感知的,以便通过帐户ID过滤可用用户列表。

我是否正确地认为让表单类型容器知道是正确的方法?我想使用实体管理器按帐户过滤用户列表。

EN

回答 2

Stack Overflow用户

发布于 2015-11-27 01:30:57

此解决方案允许您将容器注入多个表单中,而不必将每种表单类型都作为服务:

创建一个新的表单类型:

代码语言:javascript
复制
class ContainerAwareType extends AbstractType implements ContainerAwareInterface
{

    protected $container;

    public function setContainer(ContainerInterface $container = null) {
        $this->container = $container;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver) {
        $resolver->setDefaults(array(
            'container' => $this->container
        ));
    }

    public function getName() {
        return 'container_aware';
    }

    public function getParent() {
        return 'form';
    }
}

宣布为服务:

代码语言:javascript
复制
services:
    app.container_aware_type:
        class: Burgerfuel\CmsBundle\Form\Type\ContainerAwareType
        calls:
          - [setContainer, ['@service_container']]
        tags:
            - { name: form.type, alias: 'container_aware' }

该类型现在可以作为任何其他窗体类型的“父”类型--无论它是否是服务。在这种情况下,重要的部分是这个类中的setDefaultOptions将用于帮助构建将传递到任何‘子’窗体类型的$options参数。

在任何表单类型中,您都可以这样做:

代码语言:javascript
复制
class MyType extends AbstractType
{
    public function getParent() {
        return 'container_aware';
    }

    public function buildForm(FormBuilderInterface $builder, array $options) {
        $container = $options['container'];
        $builder->add( ...

如果由于某些原因无法使表单类型成为服务,则此解决方案将是有益的。或者,如果要创建许多需要访问容器的类型,则可以节省时间。

票数 5
EN

Stack Overflow用户

发布于 2016-06-26 02:36:30

--一种无需执行任何依赖项注入/声明服务的简单方法来执行此

在FormType文件中,强制表单需要EntityManager

代码语言:javascript
复制
//..    
use Doctrine\ORM\EntityManager;

class YourFormType extends AbstractType
{
    //...
    //...
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Acme\YourBundle\Entity\YourEntity',
        ));
        $resolver->setRequired('entity_manager');
        $resolver->setAllowedTypes('entity_manager', EntityManager::class);
    }
}

然后,您将能够(并且强制-重要的测试),从控制器.传递实体管理器。

代码语言:javascript
复制
public function yourControllerAction(Request $request)
{
    //..
    $em = $this->getDoctrine()->getManager();
    $form = $this->createForm('Acme\YourBundle\Form\YourEntityType', $yourEntityObject, array(
                'entity_manager'=>$em,
            )); 
    $form->handleRequest($request);
    //..
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21047431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档