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

Tags: , ,



I’m learning symfony and I would like to have a search bar to show user with email. But I got and error

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

If someone can help me or explain me how to do it’s would be very nice. Thanks

In SearchRepository

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

In 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,
        ]);
    }
}

and search.twig.html

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

Answer

From the doctrine documentation:

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

So, if your search is going to deal with User objects, you can use the standard UserRepository by doing the following in your Controller:

/**
 * @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]);
}

There is no need for a custom repository for your use case, but if you want to create one and use it for autowiring you must extend ServiceEntityRepository, a container-friendly base repository class provided by Symfony. You can get more details in the documentation. In this case you might want to also review how to annotate your entity to tell the EntityManager that you’ll be using a custom repository.

Sidenote: By default, the action attribute of the form defaults to the same route you are visiting, so if that fragment is part of a layout you’ll have to set it explicitly to your SearchController action: action="{{ path('admin_search') }}"



Source: stackoverflow