【问题标题】:Symfony2 - How do i set the entity manager that the controller createForm function uses?Symfony2 - 如何设置控制器 createForm 函数使用的实体管理器?
【发布时间】:2013-12-30 20:24:19
【问题描述】:

我有一个表单类型,它使用带有实体字段的查询构建器来获取相关选项。但是因为我正在为实体使用自定义实体管理器,所以它似乎无法识别这些选项。我得到了错误:

Entities passed to the choice field must be managed. Maybe persist them in the entity manager? 

控制器动作:

/**
 * @Route("/edit/{keyword_rank_id}/", name="lg.keywordrank.campaign.edit")
 * @Template
 */
public function editAction(Request $request, Company $company, $client_slug, $keyword_rank_id)
{
    $em = $this->getDoctrine()->getManager($company->getEntityManagerName());
    $client = $this->getEntityOrNotFound($em, 'LGClientBundle:Client', 'client_slug', $client_slug);
    $kr = $this->getEntityOrNotFound($em, 'LGKeywordRankBundle:KeywordRank', 'keyword_rank_id', $keyword_rank_id);
    $form = $this->createForm(new KeywordRankForm(), $kr, array('client'=>$client,'em'=>$em));
    ...
}

以及表单类型:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('name','text',array(
        'label'=>'Campaign Name'
    ))
    ->add('client_domain', 'entity', array(
        'class' => 'LGClientBundle:ClientDomain',
        'choices'=> $this->getClientDomains($options['em'], $options['client']),
        'property' => 'domain',
        'label' => 'Domain: '
     ));
}

private function getClientDomains($em, $client)
{
    $domains = $em->getRepository('LGClientBundle:ClientDomain')->findBy(array('client'=>$client));
    return $domains;
}


public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'LG\KeywordRankBundle\Entity\KeywordRank',
        'client' => null,
        'em' => null
    ));
}

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

任何人有类似的问题或知道如何解决这个问题会很棒

【问题讨论】:

    标签: php mysql symfony


    【解决方案1】:

    您可以在添加字段时指定要使用的实体管理器:

    ->add('client_domain', 'entity', array(
        'class' => 'LGClientBundle:ClientDomain',
        'choices'=> $this->getClientDomains($options['em'], $options['client']),
        'em' => $options['em'],
        'property' => 'domain',
        'label' => 'Domain: '
     ));
    

    此选项采用实体管理器名称,而不是选项本身,因此您必须更改

    $em = $this->getDoctrine()->getManager($company->getEntityManagerName());
    

    进入

    $em = $company->getEntityManagerName();
    

    在此处查看文档:http://symfony.com/doc/current/reference/forms/types/entity.html#em

    【讨论】:

    • 谢谢,不知道我是如何在文档中错过的 XD。
    • 是的,我需要快速得到答案,所以值得。
    【解决方案2】:

    我在我的应用程序上遇到了同样的问题,事实上,如果我通过实体管理器实例来形成它就可以工作。

    在我的情况下,问题是在 config.yml 文件中,我想在全球范围内解决这个问题。

    我将“mymodule”作为默认实体管理器,但在 FormType 中使用了不同的实体管理器。 这是我的配置

    orm:
        auto_generate_proxy_classes: "%kernel.debug%"
        default_entity_manager: mymodule
        entity_managers:
          mymodule:
            auto_mapping: true
            connection: mymodule
            mappings:
              AppBundle: ~
              XBundle: ~
    

    当我在配置文件中将 default_entity_manager 更改为默认值时:

    orm:
        auto_generate_proxy_classes: "%kernel.debug%"
        default_entity_manager: default
        entity_managers:
          default:
            connection: mymodule
            mappings:
              AppBundle: ~
              XBundle: ~
    

    我在控制器中进行了更改:

    $em = $this->getDoctrine()->getManager('mymodule');
    

    到:

    $em = $this->getDoctrine()->getManager('default');
    

    它无需将实体管理器传递给 FormType 即可工作,因此在我的情况下,它与 orm 实体管理器配置有关。

    【讨论】:

      猜你喜欢
      • 2012-08-04
      • 1970-01-01
      • 2012-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多