未定义的方法 getDoctrine

问题描述 投票:0回答:4

我是 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',
        ]);
    }
php symfony controller doctrine undefined
4个回答
3
投票

您的控制器应该从

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')]

0
投票

迪伦的反应真的很好!

如果您想影响特定的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;


0
投票

在 Symfony 6 中,

getDoctrine()
方法已被删除。您可以使用
$doctrine
变量代替它。要使用它,请按照以下步骤操作。

在你的控制器中使用它

use Doctrine\Persistence\ManagerRegistry as PersistenceManagerRegistry;

将此参数传递到索引函数中

public function index(int $id,  PersistenceManagerRegistry $doctrine): Response

像这样访问

$doctrine
变量。

$em = $doctrine->getManager();

0
投票

从 Symfony 5.4 开始,抽象控制器中的 getDoctrine() 方法已被弃用,并在 Symfony 6 中被删除。

您已经将管理器注册表注入到控制器操作中,因此请将 $this->getDoctrine() 调用替换为 $doctrine 变量。

© www.soinside.com 2019 - 2024. All rights reserved.