【问题标题】:How to instance doctrine entity manager in a symfony2 class如何在 symfony2 类中实例化学说实体管理器
【发布时间】:2015-09-10 16:47:14
【问题描述】:

我是 Symfony 2 和 Doctrine 的新手。

我在我的 symfony 项目中创建了一个新类,它位于:

project_folder/src/Libraries/Validarcontenido/Validarcontenido.php

我需要在这个类中获取 Doctrine Entity Manager 实例。

我已经阅读了有关它的文档,每个人都说我必须将该类添加到 services.yml 文件中,但是没有用。

这是我的代码:

<?php

namespace Libraries\Validarcontenido;

use AdminBundle\Entity\Aportes;

use Doctrine\ORM\EntityManager;
use Symfony\Component\HttpFoundation\Request;

class Validarcontenido
{
    private $request, $post, $em;

    public function __construct()
    {
        $this->request = Request::createFromGlobals();
        $this->post = $this->request->request->all();

        // gets doctrine instance
        $this->em = $this->getContainer()->get('doctrine');
    }

}

还有 services.yml

# Learn more about services, parameters and containers at
# http://symfony.com/doc/current/book/service_container.html
parameters:
#    parameter_name: value

services:
    validarcontenido.service:
        class: Libraries\Validarcontenido\Validarcontenido
        arguments: [@doctrine.orm.entity_manager]

但是 Symfony 给我返回了这个错误信息:

 Attempted to call an undefined method named "getContainer" of class "Libraries\Validarcontenido\Validarcontenido".
500 Internal Server Error - UndefinedMethodException 

我做错了什么?非常感谢。

【问题讨论】:

    标签: class symfony doctrine instance entitymanager


    【解决方案1】:

    你必须使用构造函数来设置实体管理器:

    class Validarcontenido
    {
        private $request, $post, $em;
    
        public function __construct(EntityManager $em)
        {
            $this->request = Request::createFromGlobals();
            $this->post = $this->request->request->all();
            $this->em = $em;
        }
    
    }
    

    【讨论】:

    • 顺便说一句,您不能像那样重新创建Request 的新实例。请改用request_stack 服务:symfony.com/blog/new-in-symfony-2-4-the-request-stack
    • 我完全同意,@KévinDunglas。在我的回复中,我只是指出了如何解决他提出的问题。
    【解决方案2】:

    您需要在 service.yml 中创建您的类作为服务,就像您已经做的那样,只是您几乎在那里。

    你需要这样改变你的班级:

    <?php
    
    namespace Libraries\Validarcontenido;
    
    use AdminBundle\Entity\Aportes;
    
    use Doctrine\ORM\EntityManager;
    use Symfony\Component\HttpFoundation\Request;
    
    class Validarcontenido
    {
        private $request, $post, $em;
    
    public function __construct(EntityManager $em)
    {
        $this->request = Request::createFromGlobals();
        $this->post = $this->request->request->all();
    
        // gets doctrine instance
        $this->em = $em;
    }
    
    }
    

    这是一个工作示例(提供容器):https://codedump.io/share/tpxgpEMJnaiW

    【讨论】:

      【解决方案3】:

      好的,问题是当我在控制器中创建服务实例时,我使用了这个:

      $my_class = new My_class();
      

      现在我知道我必须使用这个:

      $my_class = $this->get('service_name');
      

      非常感谢!

      【讨论】:

        猜你喜欢
        • 2013-05-03
        • 1970-01-01
        • 2011-12-03
        • 1970-01-01
        • 2014-05-13
        • 2016-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多