试图调用名为 "getEntityManager" 的未定义方法 class

Attempted to call an undefined method named "getEntityManager" of class

我正在学习 symfony,我想要一个搜索栏来向用户显示电子邮件。但是我得到了错误

Attempted to call an undefined method named "getEntityManager" of class "App\Repository\SearchRepository".

如果有人可以帮助我或向我解释如何操作,那就太好了。谢谢

在搜索库中

class SearchRepository
{

    public function findAllWithSearch($email){
        $entityManager = $this->getEntityManager();

        $query = $entityManager->createQuery(
            'SELECT u
            FROM App\Entity\User u
            WHERE u.email :email'
        )->setParameter('email', $email);
        return $query->execute();
    }
}

在搜索控制器中

class SearchController extends AbstractController
{
    /**
     * @Route("/admin/search/", name="admin_search")
     * @Security("is_granted('ROLE_ADMIN')")
     */
    public function searchUser(SearchRepository $repository, Request $request)
    {
        $q = $request->query->get('search');
        $comments = $repository->findllWithSearch($q);
        return $this->render('admin/search/search.html.twig',
        [            'user' => $repository,
        ]);
    }
}

和search.twig.html

    <form action="" method="get">
        <input type="search" name="search" value="" placeholder="Recherche.." />
        <input type="submit" value="Valider" />
    </form>

来自学说文档:

A repository object provides many ways to retrieve entities of the specified type. By default, the repository instance is of type Doctrine\ORM\EntityRepository. You can also use custom repository classes.

因此,如果您的搜索要处理 User 对象,您可以通过在 Controller 中执行以下操作来使用标准 UserRepository:

/**
 * @Route("/admin/search/", name="admin_search")
 * @Security("is_granted('ROLE_ADMIN')")
 */
public function searchUser(Request $request)
{
    $q = $request->query->get('search');
    // Get standard repository
    $user = $this->getDoctrine()->getManager()
        ->getRepository(User::class)
        ->findBy(['email' => $q]); // Or use the magic method ->findByEmail($q);

    // Present your results
    return $this->render('admin/search/search_results.html.twig', 
        ['user' => $user]);
}

您的用例不需要自定义存储库,但如果您想创建一个并将其用于自动装配,则必须扩展 ServiceEntityRepository,一个容器友好的基础存储库 class由 Symfony 提供。您可以在 the documentation. In this case you might want to also review how to annotate your entity 中获取更多详细信息以告知 EntityManager 您将使用自定义存储库。

旁注:默认情况下,formaction 属性默认为您正在访问的相同路线,因此如果该片段是布局的一部分,您必须明确设置它到您的 SearchController 操作:action="{{ path('admin_search') }}"

如果 UserRepository 已经存在并扩展 ServiceEntityRepository 尝试将 findAllWithSearch 移动到 UserRepository

如果不是,您的 SearchRepository 必须如下所示

 /**
 * @method User|null find($id, $lockMode = null, $lockVersion = null)
 * @method User|null findOneBy(array $criteria, array $orderBy = null)
 * @method User[]    findAll()
 * @method User[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
 */

class UserSearchRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, User::class);
    }

    public function findByEmail(string $email)
    {
        return $this->findBy(['email' => $email]);
    }
}

快速解答

SearchRepository 需要扩展 \Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository。

<?php

namespace App\Repository;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
class SearchRepository extends ServiceEntityRepository
public function findAllWithSearch($email)
{
    $entityManager = $this->getEntityManager();

    $query = $entityManager->createQuery(
        'SELECT u
        FROM App\Entity\User u
        WHERE u.email :email'
    )->setParameter('email', $email);
    return $query->execute();
}

修复应用程序的架构

看来您的旅程才刚刚开始。上面的代码可以解决你的问题,但是你需要注意代码的架构。

  • 存储库 类 就像您的实体的容器。
  • 您不会有搜索存储库(除非您存储搜索实体)。
  • 您通常会将其放入 UserRepository 中。哪个应该负责成为用户实体对象的回购协议。
  • 存储库中有一些神奇的方法可以让您找到实体。

使用您的具体示例,您可以使用

$repoInstance->findByEmail($email);

在您的控制器中,这将 return 所有记录实体 匹配您的电子邮件地址。

更多关于使用 Doctrine 存储库的信息

有关存储库如何工作的更多信息,请使用并试验此 link 中的文档: https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/working-with-objects.html