1
votes

I am using a symfony controller as a service.But when I call doctrine manager in the controller it gives the error FatalErrorException: Error: Call to a member function has() on a non-object.

Here is my controller:

    namespace Acme\StoreBundle\Controller;

    use Doctrine\ORM\EntityManager;

    class ServiceController extends Controller {

    /**
     *
     * @var EntityManager 
     */
    protected $em;


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


}

and my services.yml is like:

services:

 service_controller:

      class:  Acme\StoreBundle\Controller\ServiceController

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

I am calling the entity manager in an other controller which DbController:

<?php


public function users()

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

    $user = $query->getResult();

}
3
please add your controller code here - Ashok Chitroda

3 Answers

1
votes

You can get the EntityManager in ServiceController like:

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

so the following codes make no sense:

service_controller:

  class:  Acme\StoreBundle\Controller\ServiceController

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

And i really want to see your DbController codes, can you show that?

My DbController is like:

<?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();
  }

}
0
votes

You can also get using per-execute method like follow:

1] Create new listener class for pre-execute method

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] configure listener in your config file app/config/config.yml

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

3] controller file

namespace Acme\StoreBundle\Controller;

use Doctrine\ORM\EntityManager;

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

4] your function

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

}
0
votes

I solved this by trying a lot of things. Here is the solution for this :

You have to use your controller as service.I used TagClass Controller as a service.Here is my controller code:

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

For using this you have to define the controller as service in your services.yml like this:

parameters:

    acme.controller.tagclass.class: Acme\StoreBundle\Controller\TagClassController

services:

    acme.controller.tagclass:
        class: "%acme.controller.tagclass.class%"
        arguments: [ @doctrine.orm.entity_manager ]

And you can call any method with in TagClass like this:

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