2
votes

I had the following controller:

<?php

namespace AppBundle\Controller;

use AppBundle\Controller\BaseController;
use Symfony\Component\HttpFoundation\Request;

class UserController extends BaseController 
{
    public function allAction(Request $request)
    {
        $users = $this->getDoctrine()
                      ->getRepository('AppBundle:User')
                      ->findAll();

        return $this->respond(['users' => $users], 200);
    } 
}

And I would like to inject the repository into the controller (for testing purposes)

Controller:

<?php

namespace AppBundle\Controller;

use AppBundle\Controller\BaseController;
use Doctrine\ORM\EntityRepository;
use Symfony\Component\HttpFoundation\Request;

class UserController extends BaseController 
{
    private $userrepository;

    public function __construct(EntityRepository $userrepository)
    {
        $this->userrepository = $userrepository;
    }

    public function allAction(Request $request)
    {
        $users = $this->userrepository->findAll();
        return $this->respond(['users' => $users], 200);
    } 
}

services.yml

services:

    userrepository:
        class: Doctrine\ORM\EntityRepository
        factory_service: doctrine.orm.entity_manager
        factory_method: getRepository
        arguments:
            - AppBundle\Entity\User

    usercontroller:
        class: AppBundle\Controller\UserController
        arguments:
            - "@userrepository"

routing.yml

api_users_all:
    path: /api/users.{_format}
    defaults: { _controller: usercontroller:allAction, _format: json }
    requirements:
        _method: GET

I keep facing the following error:

PHP Fatal error: Call to a member function get() on a non-object in /Applications/MAMP/htdocs/api/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php on line 350

line 350

return $this->container->get($id);

So my guess is that the controller is no longer 'ContainerAware' or something like that.

But I can't seem to figure this out.

I am working with symfony 2.7

1

1 Answers

4
votes

After you configure the router to call controller via service, controller is not created directly but requested from the Dependency Injection container. And yes, there is no longer container because you inject only one parameter to it: user repository.

If you want whole container (which is not recommended) and you extending Symfony Controller in your BaseController set it in your service:

services:
    usercontroller:
        class: AppBundle\Controller\UserController
        calls: 
            - [setContainer, ["@service_container"]]
        arguments:
            - "@userrepository"

If you not extending Symfony Controller, inject container as argument:

services:
    usercontroller:
        class: AppBundle\Controller\UserController
        arguments:
            - "@userrepository"
            - "@service_container"

Controller:

class UserController extends BaseController 
{
private $userrepository;
private $container;

public function __construct(EntityRepository $userrepository, $container)
{
    $this->userrepository = $userrepository;
    $this->container = $container;
}

It's not recommended, inject only what you want eg. if you use in your controller only repository and mailer inject only them not the whole container.