Reputation: 12628
I'm trying to build a micro application with Symfony 5, the single-file approach works, but the advanced example using Twig, etc. does not.
I built a test-project following the exact description as published here: https://symfony.com/doc/current/configuration/micro_kernel_trait.html, I have the same directory structure and the same file contents as in the example:
This is the index.php to get the application started:
// public/index.php
use App\Kernel;
use Doctrine\Common\Annotations\AnnotationRegistry;
use Symfony\Component\HttpFoundation\Request;
$loader = require __DIR__.'/../vendor/autoload.php';
// auto-load annotations
AnnotationRegistry::registerLoader([$loader, 'loadClass']);
$kernel = new Kernel('dev', true);
$request = Request::createFromGlobals();
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);
And this is the MicroController with the (sample) action:
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
class MicroController extends AbstractController
{
/**
* @Route("/random/{limit}")
*/
public function randomNumber($limit)
{
$number = random_int(0, $limit);
return $this->render('micro/random.html.twig', [
'number' => $number,
]);
}
}
The method "configureContainer" in Kernel.php is called and runs without error:
protected function configureContainer(ContainerBuilder $c, LoaderInterface $loader)
{
$loader->load(__DIR__.'/../config/framework.yaml');
// configure WebProfilerBundle only if the bundle is enabled
if (isset($this->bundles['WebProfilerBundle'])) {
$c->loadFromExtension('web_profiler', [
'toolbar' => true,
'intercept_redirects' => false,
]);
}
}
but still the project does not run, calling a valid route (e.g. "/random/10" as in the example) gives me the error: ""App\Controller\MicroController" has no container set, did you forget to define it as a service subscriber?"
my composer.json looks like this:
"doctrine/annotations": "^1.8",
"symfony/config": "^5.0",
"symfony/dependency-injection": "^5.0",
"symfony/framework-bundle": "^5.0",
"symfony/http-foundation": "^5.0",
"symfony/http-kernel": "^5.0",
"symfony/routing": "^5.0",
"symfony/twig-bundle": "^5.0",
"symfony/web-profiler-bundle": "^5.0",
"symfony/yaml": "^5.0",
What am I missing? Any hint is appreciated.
Upvotes: 1
Views: 2284
Reputation: 17
App\Controller\MicroController" has no container set, did you forget to define it as a service subscriber?"
It say you, the MicroController need be defined like a Service. According to the documentation, MicroController should not extend AbastracController.
When using a controller defined as a service, you can still extend the AbstractController base controller and use its shortcuts. But, you don't need to! You can choose to extend nothing, and use dependency injection to access different services. Read more
So your controller should be defined as follows:
namespace App\Controller;
use Symfony\Component\Routing\Annotation\Route;
class MicroController
{
/**
* @Route("/random/{limit}")
*/
public function randomNumber($limit)
{
$number = random_int(0, $limit);
return $this->render('micro/random.html.twig', [
'number' => $number,
]);
}
}
Upvotes: -1
Reputation: 12628
Found it: The mentioned tutorial is missing some entries in the configuration-file.
# config/framework.yaml
framework:
secret: S0ME_SECRET
profiler: { only_exceptions: false }
is the original one, add this to the file to get the micro application working:
services:
_defaults:
autowire: true
autoconfigure: true
public: false
App\:
resource: '../src/*'
exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'
the above part is taken from the regular symfony-config-files and is somehow missing in the micro application-tutorial.
Upvotes: 3