Php Symfony 5带微内核的微应用程序抛出错误“;控制器没有容器集“;
我正在尝试用Symfony 5构建一个微型应用程序,单文件方法是可行的,但使用Twig等的高级示例却不行 我按照此处发布的确切描述构建了一个测试项目:,我拥有与示例中相同的目录结构和文件内容: 这是启动应用程序的index.php:Php Symfony 5带微内核的微应用程序抛出错误“;控制器没有容器集“;,php,symfony,symfony5,Php,Symfony,Symfony5,我正在尝试用Symfony 5构建一个微型应用程序,单文件方法是可行的,但使用Twig等的高级示例却不行 我按照此处发布的确切描述构建了一个测试项目:,我拥有与示例中相同的目录结构和文件内容: 这是启动应用程序的index.php: // public/index.php use App\Kernel; use Doctrine\Common\Annotations\AnnotationRegistry; use Symfony\Component\HttpFoundation\Request
// 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);
这是具有(示例)动作的微控制器:
调用Kernel.php中的“configureContainer”方法并运行时不会出错:
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,
]);
}
}
但是项目仍然没有运行,调用有效的路由(如示例中的“/random/10”)会产生错误:“”App\Controller\microcontroler“没有容器集,您是否忘记将其定义为服务订户?”
my composer.json如下所示:
"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",
我错过了什么?任何提示都非常感谢。找到了:所提到的教程在配置文件中缺少一些条目
# config/framework.yaml
framework:
secret: S0ME_SECRET
profiler: { only_exceptions: false }
是原始版本,请将其添加到文件中以使微应用程序正常工作:
services:
_defaults:
autowire: true
autoconfigure: true
public: false
App\:
resource: '../src/*'
exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'
上面的部分取自常规的symfony配置文件,在micro应用程序教程中不知怎么丢失了
App\Controller\microcontroler“没有容器集,您忘记将其定义为服务订户了吗?”
它告诉你,微控制器需要像服务一样定义。根据,微控制器不应扩展AbastracController
使用定义为服务的控制器时,仍然可以扩展AbstractController基本控制器并使用其快捷方式。但是,你不需要!您可以选择不扩展任何内容,并使用依赖项注入来访问不同的服务
因此,控制器的定义如下:
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,
]);
}
}
找到了解决方案(无法回答问题,因为它已关闭):教程缺少重要的配置条目(添加服务/u默认值/autowire和App\/resource等,就像在常规Symfony项目中一样)。我无法在此处发布,因为他们太想发表评论了:(感谢您的回答。如果微控制器不应该扩展AbstractController,那么Micro应用程序的文档是错误的,请参阅-此处微控制器扩展AbstractController,但要使其工作,您必须在framework.yaml中应用我的修复。无论哪种方法都是一种解决方法,我认为首先应该修复官方页面 :)
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,
]);
}
}