尝试调用名为类"getEntityManager"的未定义方法



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

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

如果有人可以帮助我或解释我该怎么做,那就太好了。谢谢

在搜索存储库中

class SearchRepository
{
public function findAllWithSearch($email){
$entityManager = $this->getEntityManager();
$query = $entityManager->createQuery(
'SELECT u
FROM AppEntityUser 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,
]);
}
}

和搜索.twig.html

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

快速回答

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

<?php
namespace AppRepository;
use DoctrineBundleDoctrineBundleRepositoryServiceEntityRepository;
class SearchRepository extends ServiceEntityRepository
public function findAllWithSearch($email)
{
$entityManager = $this->getEntityManager();
$query = $entityManager->createQuery(
'SELECT u
FROM AppEntityUser u
WHERE u.email :email'
)->setParameter('email', $email);
return $query->execute();
}

修复应用程序的体系结构

看起来您正处于旅程的开始。上面的代码将解决您的问题,但您需要注意代码的体系结构。

  • 存储库类类似于实体的容器。
  • 您将没有用于搜索的存储库(除非您存储搜索实体(。
  • 您通常会将其放入UserRepository中。这应该负责作为用户实体对象的存储库。
  • 存储库中有一些神奇的方法可以让您找到实体。

使用您的特定示例,您可以使用类似

$repoInstance->findByEmail($email);

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

有关使用原则存储库的更多信息

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

从教义文档中:

存储库对象提供了多种方法来检索 指定的类型。默认情况下,存储库实例的类型为DoctrineORMEntityRepository.您还可以使用自定义存储库 类。

因此,如果您的搜索要处理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,这是Symfony提供的容器友好型基本存储库类。您可以在文档中获取更多详细信息。在这种情况下,您可能还需要查看如何批注您的实体,以告知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]);
}
}

相关内容

  • 没有找到相关文章

最新更新