简体   繁体   中英

Symfony 2 dependency injection

I'm learning symfony 2 dependency injection system. I'm trying to inject Response object in a controller.

ServiceController.php

namespace LD\LearnBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class ServiceController extends Controller
{
    public function indexAction(Response $response)
    {
    }
}

Here is the content of services.yml file (please note that it's included in app/config/config.yml

services:
  ld_response:
    class: Symfony\Component\HttpFoundation\Response
  ld_bla:
    class: LD\LearnBundle\ServiceController 
    arguments: ["@ld_response"]

When I try to access ServiceController I get

Class LD\LearnBundle\Controller\Response does not exist
500 Internal Server Error - ReflectionException

What I'm doing wrong?

There are 2 things wrong here:

1: "Class LD\\LearnBundle\\Controller\\Response does not exist"

The class doesn't exist. You used Response without importing the namespace, so the error message is quite explicit here.

2: You shouldn't inject the response. It doesn't make any sense at all. The response is not a service, it's a value that should be passed down through method parameters.

Here's the fix:

namespace LD\LearnBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response; // was missing

class ServiceController extends Controller
{
    public function indexAction()
    {
        return new Response(); // The Controller is responsible of creating the Response.
    }
}

Generally, Class <current-namespace>\\class does not exist errors hint to a missing use statement.

May I add that:

  • you shouldn't declare your services in the app/config/config.yml file (create a specific services.yml file. Even better: create it in a bundle)
  • you shouldn't inject the Response object: it is the responsibility of the controller to create it

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM