Php 试图调用类的名为“getEntityManager”的未定义方法

Php 试图调用类的名为“getEntityManager”的未定义方法,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我正在学习symfony,我想有一个搜索栏显示用户的电子邮件。但我犯了错误 Attempted to call an undefined method named "getEntityManager" of class "App\Repository\SearchRepository". 如果有人能帮助我或解释我该怎么做,那就太好了。谢谢 在SearchRepository中 class SearchRepository { public function findAllWithSe

我正在学习symfony,我想有一个搜索栏显示用户的电子邮件。但我犯了错误

Attempted to call an undefined method named "getEntityManager" of class "App\Repository\SearchRepository".
如果有人能帮助我或解释我该怎么做,那就太好了。谢谢

在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>

根据条令文件:

repository对象提供了许多检索存储库实体的方法 指定的类型。默认情况下,存储库实例的类型为 条令\ORM\EntityRepository。您还可以使用自定义存储库 上课

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

您的用例不需要自定义存储库,但如果您想创建一个存储库并将其用于自动连接,则必须扩展ServiceEntityRepository,这是Symfony提供的一个容器友好的基本存储库类。您可以在中获得更多详细信息。在这种情况下,您可能还需要查看以告知EntityManager您将使用自定义存储库

<?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();
}

旁注:默认情况下,表单的action属性默认为您正在访问的同一路径,因此如果该片段是布局的一部分,您必须将其显式设置为您的SearchController action:action={{path'admin_search'}}

来自条令文档:

repository对象提供了许多检索存储库实体的方法 指定的类型。默认情况下,存储库实例的类型为 条令\ORM\EntityRepository。您还可以使用自定义存储库 上课

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

您的用例不需要自定义存储库,但如果您想创建一个存储库并将其用于自动连接,则必须扩展ServiceEntityRepository,这是Symfony提供的一个容器友好的基本存储库类。您可以在中获得更多详细信息。在这种情况下,您可能还需要查看以告知EntityManager您将使用自定义存储库

<?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();
}
旁注:默认情况下,表单的action属性默认为您正在访问的同一路由,因此如果该片段是布局的一部分,则必须将其显式设置为SearchController操作:action={path'admin_search'}}

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

<?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();
}
如果不是,您的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]);
    }
}
如果UserRepository已存在并扩展ServiceEntityRepository,请尝试将findAllWithSearch移动到UserRepository

<?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();
}
如果不是,您的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();
}
在控制器中,这将返回 匹配您的电子邮件地址

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

有关存储库如何工作的更多信息,请使用并试用此链接中的文档: 快速回答

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();
}
在控制器中,这将返回 匹配您的电子邮件地址

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

有关存储库如何工作的更多信息,请使用并试用此链接中的文档:

这就是您的SearchRepository的确切定义吗?您在该类中的何处定义了getEntityManager方法?这是SearchRepository的确切定义吗?在该类中,您在哪里定义了getEntityManager方法?