Description
Q | A |
---|---|
Bug report? | yes |
Feature request? | no |
BC Break report? | yes |
RFC? | no |
Symfony version | 4.0.0-RC2 |
Looks like a controller requiring values in the constructor do not ends in the container.
I hadded a dump($this->container->has($class))
here: https://github.com/symfony/symfony/blob/master/src/Symfony/Component/HttpKernel/Controller/ContainerControllerResolver.php#L85
Case 1
<?php
namespace App\Controller;
use App\Repository\AccountRepository;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class MainController
{
/**
* @var string
*/
private $environment;
/**
* MainController constructor.
*
* @param string $environment
*/
public function __construct(AccountRepository $accountRepository)
{
$this->environment = "dev";
}
/**
* @Route("", name="home")
*
* @return Response
*/
public function home(): Response
{
return new Response('<html><body><h1>Welcome in ' . $this->environment . ' environment</h1></body></html>');
}
}
Dump: true
Error: NONE
Case 2
# services.yaml
services:
App\Controller\MainController:
arguments:
$environment: "dev"
<?php
namespace App\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class MainController
{
/**
* @var string
*/
private $environment;
/**
* MainController constructor.
*
* @param string $environment
*/
public function __construct(string $environment)
{
$this->environment = $environment;
}
/**
* @Route("", name="home")
*
* @return Response
*/
public function home(): Response
{
return new Response('<html><body><h1>Welcome in ' . $this->environment . ' environment</h1></body></html>');
}
}
Dump: false
Error: Type error: Too few arguments to function App\Controller\MainController::__construct(), 0 passed in /***/vendor/symfony/http-kernel/Controller/ControllerResolver.php on line 111 and exactly 1 expected
Stack trace:
Symfony\Component\Debug\Exception\FatalThrowableError:
Type error: Too few arguments to function App\Controller\MainController::__construct(), 0 passed in /***/vendor/symfony/http-kernel/Controller/ControllerResolver.php on line 111 and exactly 1 expected
at src/Controller/MainController.php:20
at App\Controller\MainController->__construct()
(vendor/symfony/http-kernel/Controller/ControllerResolver.php:111)
at Symfony\Component\HttpKernel\Controller\ControllerResolver->instantiateController('App\\Controller\\MainController')
(vendor/symfony/http-kernel/Controller/ContainerControllerResolver.php:90)
at Symfony\Component\HttpKernel\Controller\ContainerControllerResolver->instantiateController('App\\Controller\\MainController')
(vendor/symfony/framework-bundle/Controller/ControllerResolver.php:57)
at Symfony\Bundle\FrameworkBundle\Controller\ControllerResolver->instantiateController('App\\Controller\\MainController')
(vendor/symfony/http-kernel/Controller/ControllerResolver.php:99)
at Symfony\Component\HttpKernel\Controller\ControllerResolver->createController('App\\Controller\\MainController::home')
(vendor/symfony/http-kernel/Controller/ContainerControllerResolver.php:62)
at Symfony\Component\HttpKernel\Controller\ContainerControllerResolver->createController('App\\Controller\\MainController::home')
(vendor/symfony/framework-bundle/Controller/ControllerResolver.php:43)
at Symfony\Bundle\FrameworkBundle\Controller\ControllerResolver->createController('App\\Controller\\MainController::home')
(vendor/symfony/http-kernel/Controller/ControllerResolver.php:69)
at Symfony\Component\HttpKernel\Controller\ControllerResolver->getController(object(Request))
(vendor/symfony/http-kernel/Controller/ContainerControllerResolver.php:40)
at Symfony\Component\HttpKernel\Controller\ContainerControllerResolver->getController(object(Request))
(vendor/symfony/http-kernel/Controller/TraceableControllerResolver.php:38)
at Symfony\Component\HttpKernel\Controller\TraceableControllerResolver->getController(object(Request))
(vendor/symfony/http-kernel/HttpKernel.php:134)
at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), 1)
(vendor/symfony/http-kernel/HttpKernel.php:66)
at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), 1, true)
(vendor/symfony/http-kernel/Kernel.php:190)
at Symfony\Component\HttpKernel\Kernel->handle(object(Request))
(public/index.php:28)
Case 2
# services.yaml
services:
App\Controller\MainController:
arguments:
$environment: "dev"
<?php
namespace App\Controller;
use App\Repository\AccountRepository;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class MainController
{
/**
* @var string
*/
private $environment;
/**
* MainController constructor.
*
* @param string $environment
*/
public function __construct(AccountRepository $repository, string $environment)
{
$this->environment = $environment;
}
/**
* @Route("", name="home")
*
* @return Response
*/
public function home(): Response
{
return new Response('<html><body><h1>Welcome in ' . $this->environment . ' environment</h1></body></html>');
}
}
Dump: false
Error: Type error: Too few arguments to function App\Controller\MainController::__construct(), 0 passed in /***/vendor/symfony/http-kernel/Controller/ControllerResolver.php on line 111 and exactly 2 expected
Stack trace:
Symfony\Component\Debug\Exception\FatalThrowableError:
Type error: Too few arguments to function App\Controller\MainController::__construct(), 0 passed in /***/vendor/symfony/http-kernel/Controller/ControllerResolver.php on line 111 and exactly 2 expected
at src/Controller/MainController.php:21
at App\Controller\MainController->__construct()
(vendor/symfony/http-kernel/Controller/ControllerResolver.php:111)
at Symfony\Component\HttpKernel\Controller\ControllerResolver->instantiateController('App\\Controller\\MainController')
(vendor/symfony/http-kernel/Controller/ContainerControllerResolver.php:90)
at Symfony\Component\HttpKernel\Controller\ContainerControllerResolver->instantiateController('App\\Controller\\MainController')
(vendor/symfony/framework-bundle/Controller/ControllerResolver.php:57)
at Symfony\Bundle\FrameworkBundle\Controller\ControllerResolver->instantiateController('App\\Controller\\MainController')
(vendor/symfony/http-kernel/Controller/ControllerResolver.php:99)
at Symfony\Component\HttpKernel\Controller\ControllerResolver->createController('App\\Controller\\MainController::home')
(vendor/symfony/http-kernel/Controller/ContainerControllerResolver.php:62)
at Symfony\Component\HttpKernel\Controller\ContainerControllerResolver->createController('App\\Controller\\MainController::home')
(vendor/symfony/framework-bundle/Controller/ControllerResolver.php:43)
at Symfony\Bundle\FrameworkBundle\Controller\ControllerResolver->createController('App\\Controller\\MainController::home')
(vendor/symfony/http-kernel/Controller/ControllerResolver.php:69)
at Symfony\Component\HttpKernel\Controller\ControllerResolver->getController(object(Request))
(vendor/symfony/http-kernel/Controller/ContainerControllerResolver.php:40)
at Symfony\Component\HttpKernel\Controller\ContainerControllerResolver->getController(object(Request))
(vendor/symfony/http-kernel/Controller/TraceableControllerResolver.php:38)
at Symfony\Component\HttpKernel\Controller\TraceableControllerResolver->getController(object(Request))
(vendor/symfony/http-kernel/HttpKernel.php:134)
at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), 1)
(vendor/symfony/http-kernel/HttpKernel.php:66)
at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), 1, true)
(vendor/symfony/http-kernel/Kernel.php:190)
at Symfony\Component\HttpKernel\Kernel->handle(object(Request))
(public/index.php:28)