我是 Symfony 6 的初学者,我被阻止了,因为我收到一条错误消息:“Undefined method getDoctrine” with Intelephense
这是我的代码:
#[Route('/recettes', name: 'app_recettes')]
public function index(int $id): Response
{
$em = $this->getDoctrine()->getManager();
$recette = $em->getRepository(Recettes::class)->findBy(['id' => $id]);
return $this->render('recettes/index.html.twig', [
'RecettesController' => 'RecettesController',
]);
}
您的控制器应该从
AbstractController
扩展
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
您不应该在 symfony 6 中使用
getDoctrine()->getManager()
。如果您查看 AbstractController
中的方法,您可以看到:
trigger_deprecation('symfony/framework-bundle', '5.4', 'Method "%s()" is deprecated, inject an instance of ManagerRegistry in your controller instead.', __METHOD__);
您应该在方法或构造函数中自动装配实体管理器并直接使用它。
private EntityManagerInterface $entityManager;
public function __construct(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
}
#[Route('/recettes', name: 'app_recettes')]
public function index(int $id): Response
{
$recette = $this->entityManager->getRepository(Recettes::class)->findBy(['id' => $id]);
return $this->render('recettes/index.html.twig', [
'RecettesController' => 'RecettesController',
]);
}
如果您只想获取一些数据,您还可以直接自动装配 RecettesRepository 而不是实体管理器。
我猜测您想通过使用其 id 显示特定资源。您可能想在路线中添加一些内容
/{id}
:
#[Route('/recettes/{id}', name: 'app_recettes')]
迪伦的反应真的很好!
如果您想影响特定的recette(美食博客?),您可以自动装配“recette”作为参数:
#[Route('/recettes/{id}', name: 'app_recettes')]
public function index(Recette $recette): Response
{
return $this->render('recettes/index.html.twig', [
'recette' => $recette,
]);
}
为此,请不要忘记安装并导入:
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Entity;
在 Symfony 6 中,
getDoctrine()
方法已被删除。您可以使用 $doctrine
变量代替它。要使用它,请按照以下步骤操作。
在你的控制器中使用它
use Doctrine\Persistence\ManagerRegistry as PersistenceManagerRegistry;
将此参数传递到索引函数中
public function index(int $id, PersistenceManagerRegistry $doctrine): Response
像这样访问
$doctrine
变量。
$em = $doctrine->getManager();
从 Symfony 5.4 开始,抽象控制器中的 getDoctrine() 方法已被弃用,并在 Symfony 6 中被删除。
您已经将管理器注册表注入到控制器操作中,因此请将 $this->getDoctrine() 调用替换为 $doctrine 变量。