FatalErrorException:错误:在非对象 symfony 上调用成员函数 has()

Posted

技术标签:

【中文标题】FatalErrorException:错误:在非对象 symfony 上调用成员函数 has()【英文标题】:FatalErrorException: Error: Call to a member function has() on a non-object symfony 【发布时间】: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();


【问题讨论】:

请在此处添加您的控制器代码 【参考方案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));

【讨论】:

以上是关于FatalErrorException:错误:在非对象 symfony 上调用成员函数 has()的主要内容,如果未能解决你的问题,请参考以下文章

我得到了 FatalErrorException: 试图在奏鸣曲管理员中创建自定义操作

HtmlServiceProvider.php 第 36 行中的 FatalErrorException:laravel

php artisan 抛出 FatalErrorException 类未找到

Laravel 5.4 上 Manager.php 第 139 行中的 FatalErrorException

RedirectResponse.php 第 75 行中的 Lumen FatalErrorException:在 null 上调用成员函数 flashInput()

Laravel 4刀片模板导致FatalErrorException?