繁体   English   中英

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

[英]Attempted to call an undefined method named “getEntityManager” of class

我正在学习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();
    }
}

在SearchController中

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>

快速回答

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

修复您的应用程序架构

看起来您才刚刚开始。 上面的代码将解决您的问题,但是您需要注意代码的体系结构。

  • 存储库类就像实体的容器。
  • 您将没有用于Search的存储库(除非您要存储Search实体)。
  • 您通常会将其放入UserRepository。 应该负责充当用户实体对象的回购协议。
  • 存储库中有魔术方法,可让您查找实体。

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

$repoInstance->findByEmail($email);

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

有关使用主义存储库的更多信息

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

从原则文档中:

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

因此,如果您的搜索要处理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: 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]);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM