【问题标题】:FatalErrorException: Error: Call to a member function has() on a non-object symfonyFatalErrorException:错误:在非对象 symfony 上调用成员函数 has()
【发布时间】:2014-05-05 22:05:32
【问题描述】:

我使用 symfony 控制器作为服务。但是当我在控制器中调用教义管理器时,它会给出错误 FatalErrorException: Error: Call to a member function has() on a non-object.

这是我的控制器:

命名空间 Acme\StoreBundle\Controller; 使用 Doctrine\ORM\EntityManager; 类 ServiceController 扩展控制器 { /** * * @var 实体管理器 */ 受保护的$em; 公共函数 __construct(EntityManager $em) { $this->em = $em; } }

我的 services.yml 是这样的:

服务:

 service_controller:

      class:  Acme\StoreBundle\Controller\ServiceController

      arguments: ["@doctrine.orm.entity_manager"]

我在另一个 DbController 控制器中调用实体管理器:

<?php


public function users()

{
    $query = $this->em->createQuery('select u from AcmeStoreBundle:User u');

    $user = $query->getResult();

}

【问题讨论】:

  • 请在此处添加您的控制器代码

标签: symfony doctrine


【解决方案1】:

可以在ServiceController中获取EntityManager,如下:

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

所以下面的代码没有意义:

service_controller:

  class:  Acme\StoreBundle\Controller\ServiceController

  arguments: ["@doctrine.orm.entity_manager"]

我真的很想看看你的 DbController 代码,你能展示一下吗?

我的 DbController 是这样的:

<?php

namespace Acme\StoreBundle\Controller;

use Acme\StoreBundle\Entity\UserCategoryTag;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class DbController extends Controller

{
//Suppose you want get all users you can do some like this..
  public function Users() {

       $em = $this->getDoctrine()->getManager();
       $repository = $em->getRepository('AcmeStoreBundle:User'); 
       $user = $repository->findAll();
  }

}

【讨论】:

  • 我尝试使用 $em = $this->getDoctrine()->getManager();但它没有奏效。我想使用实体管理器作为服务。你能告诉我该怎么做吗?
  • @user3467205 认真的吗?不能……你能先显示你所有的 DbController 代码吗?
  • 控制器里有2500行,你想看看控制器里的所有代码吗?
  • 谢谢,但没用。当我使用它时显示错误: FatalErrorException: Error: Call to a member function has() on a non-object in /var/www/Mifilters/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller .php 第 202 行
  • @Randhir Symfony2 控制器没有 __construct 方法,删除你的 serviceController 和 service.yml 中的服务
【解决方案2】:

您还可以使用 per-execute 方法,如下所示:

1] 为预执行方法创建新的监听类

namespace Acme\Listener;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
/**
 * Acme\Listener\ControllerListener
 */
class ControllerListener
{
    /**
     * On Core Controller this is used to set pre execute
     *
     * @param  GetResponseEvent $event
     */
    public function onCoreController(FilterControllerEvent $event)
    {
        if (HttpKernelInterface::MASTER_REQUEST === $event->getRequestType()) {
            $_controller = $event->getController();
            if (isset($_controller[0])) {
                $controller = $_controller[0];
                if (method_exists($controller, 'preExecute')) {
                    $controller->preExecute();
                }
            }
        }
    }
}

2] 在你的配置文件 app/config/config.yml 中配置监听器

services:
    controller.pre_execute_listener: 
            class: Acme\Listener\ControllerListener
            tags:
                -  { name: kernel.event_listener, event: kernel.controller, method: onCoreController }

3] 控制器文件

namespace Acme\StoreBundle\Controller;

use Doctrine\ORM\EntityManager;

class ServiceController extends Controller {
     public function preExecute()
        {
        $this->em = $this->getDoctrine()->getEntityManager();
        }
}

4] 你的功能

<?php
public function users()
{
    $query = $this->em->createQuery('select u from AcmeStoreBundle:User u');
    $user = $query->getResult();

}

【讨论】:

    【解决方案3】:

    我通过尝试很多方法解决了这个问题。 这是解决方案:

    您必须将控制器用作服务。我使用 TagClass 控制器作为服务。这是我的控制器代码:

    <?php
    namespace Acme\StoreBundle\Controller;
    class TagClassController extends Controller
    {
       public $em;
    public function __construct(Entity Manager $em)
    {
        $this->em = $em;
    }
    public function ParseWebsite($categoryid){
     }
    } 
    ?> 
    

    要使用它,您必须在 services.yml 中将控制器定义为服务,如下所示:

    parameters:
    
        acme.controller.tagclass.class: Acme\StoreBundle\Controller\TagClassController
    
    services:
    
        acme.controller.tagclass:
            class: "%acme.controller.tagclass.class%"
            arguments: [ @doctrine.orm.entity_manager ]
    

    你可以像这样在 TagClass 中调用任何方法:

      $this->forward('acme.controller.tagclass:ParseWebsite',array($categoryid));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-29
      • 1970-01-01
      相关资源
      最近更新 更多