通过服务将Symfony EntityManager注入表单类型 [英] Inject Symfony EntityManager into Form Type via Services

查看:116
本文介绍了通过服务将Symfony EntityManager注入表单类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要修改我的表单中的某些字段(标签和类),根据实体是否是最新发布的版本。所以我需要能够将实体管理器注入到我的formType中,这样在事件侦听器中,我可以将当​​前版本与实体的已发布版本进行比较。但是,我不能将_ code> entityManager 以__construct()开头。也许有一个更好的方式来实现我的大目标(例如修改树枝模板中的表单),但是我需要了解如何做这个基本的依赖注入。



我以为如果我在我的服务中声明(如文档介绍基本的服务容器,特别是构造函数注入方法),它将作为我的构造中的一个参数。但是当我这样做,我得到错误:



可追踪的致命错误:参数1传递到Gutensite\CmsBundle\Form\Type \ViewType :: __ construct()必须是Doctrine\ORM\EntityManager的一个实例,没有给出,在222上的/var/www/core/cms/src/Gutensite/ArticleBundle/Controller/AdminEditController.php中调用,在第15行的/var/www/core/cms/src/Gutensite/CmsBundle/Form/Type/ViewType.php中定义



这里是我的代码片段:



Gutensite / CmsBundle / Resources / config / service.yml

  gutensite_cms.form.type.view:
class:Gutensite\CmsBundle\Form\Type\ViewType
arguments:[@ doctrine.orm.entity_manager]

Gutensite / CmsBundle / Form / Type / ViewType.php

 命名空间Gutensite\CmsBundle\Form\Type; 
使用Doctrine\ORM\EntityManager;
使用Symfony\Component\Form\AbstractType;

class ViewType extends AbstractType
{

private $ em;

public function __construct(EntityManager $ entityManager){
$ this-> em = $ entityManager;
}
}

Gutensite / ArticleBundle / Controller / AdminEditController。 php

  //获取查看实体
$ em = $ this-> getDoctrine() - > getManager();
$ viewRepo = $ em-> getRepository(GutensiteCmsBundle:View\View);
$ view = $ viewRepo-> find($ request-> query-> get('id'));

//创建用于编辑任何View的通用表单,使用构造的视图实体
$ form = $ this-> createForm(new ViewType(),$ view);



注意:



我正在使用两个实体管理器,所以我的config.yml看起来像这样。我不知道这是否会在我注入的内容上有任何区别,即我可以注入 @ doctrine.orm.entity_manager 或者我应该注入还有什么东西?@ doctrine.orm.default_entity_manager 我已经尝试了各种各样的选择,没有工作。

 #Doctrine配置
原则:
dbal :
default_connection:cms
连接:
cms:
驱动程序:%db.cms.driver%
主机:%db.cms.host%
port:%db.cms.port%
dbname:%db.cms.name%
user:%db.cms.user%
password :%db.cms.password%
charset:%db.cms.charset%
billing:
driver:%db.billing.driver%
主机:%db.billing.host%
port:%db.billing.port%
dbname:%db.billing.name%
user:%db .billing.user%
password:%db.billing.password%
charset:%db.billing.charset%
orm:
default_entity_manager:cms
entity_managers:
cms:
连接:cms
映射:
GutensiteCmsBundle:〜
GutensiteArticleBundle:〜
结算:
连接:计费
映射:
GutensiteBillingBundle:〜
auto_generate_proxy_classes:%kernel.debug%



已引用:





解决方案:



我不需要将ViewType定义为服务,我只需要通过新的viewType($ em)传入实体管理器, 当我创建新的ViewType表单时:



Gutensite / ArticleBundle / Controller / AdminEditController.php

  //获取查看实体
$ em = $ this-> getDoctrine() - > getManager();
$ viewRepo = $ em-> getRepository(GutensiteCmsBundle:View\View);
$ view = $ viewRepo-> find($ request-> query-> get('id'));

//创建用于编辑任何View的通用表单,使用视图实体构造
$ form = $ this-> createForm(new ViewType($ em),$ view);


解决方案

您的错误是因为您创建表单类型像这样:

  $ form = $ this-> createForm(new ViewType(),$ view); 

您没有任何参数创建新对象 ViewType 并且它需要使用 EntityManager 调用。您可以简单地从控制器传递实体管理器,如下所示:

  $ em = $ this-> get('doctrine.orm .entity_manager'); //或doctrine.orm.billing_entity_manager 
$ form = $ this-> createForm(new ViewType($ em),$ view);

在这种情况下,您甚至不需要将此表单类型定义为服务。 >

使用 doctrine.orm.entity_manager doctrine.orm.billing_entity_manager 取决于您在 ViewType - (从巫婆数据库)中获取的内容。



更新:



将表单类型定义为服务。

将这两个服务添加到您的配置中( services.yml ):

  services 
gutensite_cms.form.view:
factory_method:createNamed
factory_service:form.factory
class:Symfony\Component\ Form \Form
参数:
- view_form#
- 视图的名称#表单类型的别名
- null#要绑定的数据,这是您的实体可以如果你有这个定义为一个服务的话
- {validation_groups:[Default]}#验证组

gutensite_cms.form.type.view:
class:Gutensite\CmsBundle \Form\Type\ViewType
参数:[@ doctrine.orm.entity_manager]
标签:
- {name:form.type,alias:view}

然后,您可以通过执行此命令创建新表单在控制器内部(或任何容器),无需手动传递任何参数(将自动注入):

  public function newAction()
{
$ view = ...;
$ form = $ this-> get('gutensite_cms.form.view');

//如果需要,设置初始表单数据
$ form-> setData($ view);
}


I need to modify some fields in my form (label and class), based on whether the entity is the latest published version or not. So I need to be able to inject the entity manager into my formType so that in an event listener I can compare the current version with the published version of the entity. But I can't even get the entityManager into the __construct() to begin with. Maybe there is a better way of achieving my big goal as well (e.g. modify the form in the twig template), but I NEED to understand how to do this basic dependency inject as well.

I thought that if I declare it in my service (like the documentation describes for basic Service Container and specifically Constructor Injection methods), it will be available as an argument in my construct. But when I do this, I get the error:

Catchable fatal error: Argument 1 passed to Gutensite\CmsBundle\Form\Type\ViewType::__construct() must be an instance of Doctrine\ORM\EntityManager, none given, called in /var/www/core/cms/src/Gutensite/ArticleBundle/Controller/AdminEditController.php on line 222 and defined in /var/www/core/cms/src/Gutensite/CmsBundle/Form/Type/ViewType.php on line 15

Here are the snippets from my code:

Gutensite/CmsBundle/Resources/config/service.yml

gutensite_cms.form.type.view:
    class: Gutensite\CmsBundle\Form\Type\ViewType
    arguments: [ "@doctrine.orm.entity_manager" ]

Gutensite/CmsBundle/Form/Type/ViewType.php

namespace Gutensite\CmsBundle\Form\Type;
use Doctrine\ORM\EntityManager;
use Symfony\Component\Form\AbstractType;

class ViewType extends AbstractType
{

    private $em;

    public function __construct(EntityManager $entityManager) {
        $this->em = $entityManager;
    }
}

Gutensite/ArticleBundle/Controller/AdminEditController.php

// Get the View Entity
$em = $this->getDoctrine()->getManager();
$viewRepo = $em->getRepository("GutensiteCmsBundle:View\View");
$view = $viewRepo->find($request->query->get('id'));

// Create the generic form for editing any View, using the view entity constructed
$form = $this->createForm(new ViewType(), $view);

NOTE:

I am using two entity managers, so my config.yml looks something like this. I don't know if that makes any difference in what I inject, i.e. can I inject @doctrine.orm.entity_manager or am I supposed to inject @doctrine.orm.default_entity_manager or something? I've tried all sorts of options and none work.

# Doctrine Configuration
doctrine:
    dbal:
        default_connection: cms
        connections:
            cms:
                driver:   "%db.cms.driver%"
                host:     "%db.cms.host%"
                port:     "%db.cms.port%"
                dbname:   "%db.cms.name%"
                user:     "%db.cms.user%"
                password: "%db.cms.password%"
                charset:  "%db.cms.charset%"
            billing:
                driver:   "%db.billing.driver%"
                host:     "%db.billing.host%"
                port:     "%db.billing.port%"
                dbname:   "%db.billing.name%"
                user:     "%db.billing.user%"
                password: "%db.billing.password%"
                charset:  "%db.billing.charset%"
    orm:
        default_entity_manager: cms
        entity_managers:
            cms:
                connection: cms
                mappings:
                    GutensiteCmsBundle: ~
                    GutensiteArticleBundle: ~
            billing:
                connection: billing
                mappings:
                    GutensiteBillingBundle: ~
        auto_generate_proxy_classes: "%kernel.debug%"

Referenced Already:

Solution:

I didn't need to define ViewType as a service, I just needed to pass in the entity manager via new viewType($em) when I created the new ViewType form:

Gutensite/ArticleBundle/Controller/AdminEditController.php

// Get the View Entity
$em = $this->getDoctrine()->getManager();
$viewRepo = $em->getRepository("GutensiteCmsBundle:View\View");
$view = $viewRepo->find($request->query->get('id'));

// Create the generic form for editing any View, using the view entity constructed
$form = $this->createForm(new ViewType($em), $view);

解决方案

You got that error because you`re creating form type like this:

$form = $this->createForm(new ViewType(), $view);

You create new object ViewType without any arguments and it needs to be called with EntityManager. You can simply pass entity manager from controller, like this:

$em = $this->get('doctrine.orm.entity_manager'); // or doctrine.orm.billing_entity_manager
$form = $this->createForm(new ViewType($em), $view);

In this case you don't even need to define this form type as a service.

Use of doctrine.orm.entity_manager or doctrine.orm.billing_entity_manager depends on what you need to fetch inside ViewType - (from witch database).

UPDATE:

Define form type as a service.

Add this two services to your configuration (services.yml):

services
    gutensite_cms.form.view:
        factory_method: createNamed
        factory_service: form.factory
        class: Symfony\Component\Form\Form
        arguments:
            - view_form                        # name of the form
            - view                             # alias of the form type
            - null                             # data to bind, this is where your entity could go if you have that defined as a service
            - { validation_groups: [Default] } # validation groups

    gutensite_cms.form.type.view:
        class: Gutensite\CmsBundle\Form\Type\ViewType
        arguments: [ "@doctrine.orm.entity_manager" ]
        tags:
            - { name: form.type, alias: view }

Then you can create new form by executing this inside your controller (or whatever has container) without manualy passing any arguments (they will be injected automaticly):

public function newAction()
{
    $view = ...;
    $form = $this->get( 'gutensite_cms.form.view' );

    // set initial form data if needed
    $form->setData( $view );
}

这篇关于通过服务将Symfony EntityManager注入表单类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆