我有一个带有两个自定义可重用包的 Symfony 5.3 项目。
我在bundle1中创建了一个实体,我希望能够从bundle2中读取和写入它
但是,我无法成功地将 Doctrine 包含在我的任何捆绑控制器中。
我已经尝试了一切:扩展控制器,扩展AbstractController
,添加构造函数来传递教义,将控制器定义为服务,但我无法得到任何工作。
项目/bundle1/src/Controller/testController.php:
namespace Bundle1\TestController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Doctrine\ORM\EntityManagerInterface;
use Bundle1\Entity;
class TestController
{
private $entityManager;
public function __construct( EntityManagerInterface $entityManager) {
$this->em = $entityManager;
}
/**
* @Route("/list", name="list")
*/
public function listingsAction(): Response
{
//$this->em = $this->getDoctrine()->getManager();
return new Response(
'<html><body><h1>List from DB</h1>
</body></html>'
);
}
}
错误:
URI "/list" 的控制器不可调用:控制器 "Bundle1\TestController\TestController" 具有必需的构造函数参数并且在容器中不存在。您是否忘记将控制器定义为服务?
编辑** 以下内容已根据@Cerad 的帮助进行了修改,但不幸的是相同的错误消息仍然存在。
我正在使用自动装配,并且通过依赖注入加载了以下 services.xml:
项目/bundle1/Resources/config/services.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services
https://symfony.com/schema/dic/services/services-1.0.xsd">
<services>
<service
id="Bundle1\Controller\TestController\TestController"
public="true">
<call method="setContainer">
<argument type="service" id="doctrine.orm.entity_manager"/>
</call>
<tag name="controller.service_arguments"/>
</service>
</services>
</container>
我已经使用注释进行路由
项目/config/routes/annotations.yaml 文件:
controllers-bundle1:
resource: ../../bundle1/src/Controller/
type: annotation
当我php bin/console debug:container 'bundle1.controller.test_controller'
在控制台中运行时,我得到:
未找到与“bundle1.controller.test_controller”匹配的服务。
项目/bundle1/src/Bundle1.php
namespace Bundle1;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class Bundle1 extends Bundle
{
public function getPath(): string
{
return \dirname(__DIR__);
}
}
项目/配置/bundles.php
return [
Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true],
Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true],
Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true],
Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true],
Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true],
Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true],
Bundle1\Bundle1::class => ['all' => true],
];
似乎我没有正确地将我的控制器定义为服务,但在文档中找不到有关如何执行此操作的明确信息。
**更新:
刚刚在错误堆栈中找到了这个**
ArgumentCountError 函数 Bundle1\TestController\TestController::__construct() 的参数太少,在第 147 行的 /home/Project/vendor/symfony/http-kernel/Controller/ControllerResolver.php 中传递了 0,而预期的正好是 1
在 bundle1/src/Controller/TestController.php(第 17 行)类 TestController { private $entityManager; 公共函数 __construct(EntityManagerInterface $entityManager) { $this->em = $entityManager;