Аргумент 2 должен быть экземпляром paginator в symfony.

У меня возникает ошибка при использовании пакета paginator внутри цикла ветки, я думаю, что missions ожидает sliddingpagination, а не persistentcollection, я думаю, что это в контроллере в FindAllVisibleQuery, например, ожидание массива, но IDK..

Это ошибка, которую я получаю:

Аргумент 2, переданный в Knp\Bundle\PaginatorBundle\Twig\Extension\PaginationExtension::render(), должен быть экземпляром Knp\Bundle\PaginatorBundle\Pagination\SlidingPaginationInterface, заданным массивом, вызываемым в /Applications/MAMP/htdocs/MySUPER/var /cache/dev/twig/12/12cef122792496c7b8dbcf0cc1f03b575f10f859de41093d7a8fd223b1623d7d.php в строке 176

MissionController.php

<?php

namespace App\Controller;


use App\Entity\Mission;
use App\Entity\MissionSearch;
use App\Form\MissionSearchType;
use App\Repository\MissionRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Component\HttpFoundation\Request;

class MissionController extends AbstractController {

    /**
     * @var MissionRepository
     */
    private $repository;
    /**
     * @var EntityManagerInterface
     */
    private $em;

    public function __construct(MissionRepository $repository, EntityManagerInterface $em)
    {
        $this->repository = $repository;
        $this->em = $em;
    }

    /**
     * @return Response
     * @throws \Twig\Error\LoaderError
     * @throws \Twig\Error\RuntimeError
     * @throws \Twig\Error\SyntaxError
     * @Route ("/missions" , name="Missions")
     */
    public function index(PaginatorInterface $paginator, Request $request): Response
    {
        $search = new MissionSearch();
        $form = $this->createForm(MissionSearchType::class, $search);
        $form->handleRequest($request);

        $missions = $paginator->paginate(
            $this->repository->findAllVisibleQuery($search),
            $request->query->getInt('page', 1),
            18
        );
        return $this->render('lesmissions/index.html.twig', [
            'current_menu' => 'missions',
            'missions'   => $missions,
            'form'         => $form->createView()
        ]);
    }


    /**
     * @Route("/missions/{slug}-{id}", name="mission.show", requirements={"slug": "[a-z0-9\-]*"})
     * @param Mission $mission
     * @return Response
     */
    public function show(Mission $mission, string $slug): Response
    {
        if ($mission->getSlug() !== $slug) {
            return $this->redirectToRoute('mission.show', [
                'id' => $mission->getId(),
                'slug' => $mission->getSlug()
            ], 301);
        }
        return $this->render('lesmissions/show.html.twig', [
            'mission' => $mission,
            'current_menu' => 'missions'
        ]);
    }


}


?>

Фрагмент ветки

{% extends 'base.html.twig' %}

{% block title 'Missions' %}

{% block body %}
    <div class="jumbotron text-center">
        <h1>Trouvez une mission qui vous correspond</h1>
        <p>My super est encore en developpement , vous pouvez apporter vos idées via le formulaire de contact</p>
    </div>

    <div class="jumbotron">
        <div class="container">
            {% if form is defined %}
            {{ form_start(form) }}
            <div class="form-row align-items-end">
                <div class="col">
                    {{ form_row(form.maxGain) }}
                </div>
                <div class="col">
                    {{ form_row(form.deltaVille) }}
                </div>
                <div class="col">
                    {{ form_row(form.options) }}
                </div>
                <div class="col">
                    <div class="form-group">
                        <button class="btn btn-primary">Rechercher</button>
                    </div>
                </div>
            </div>
            {{ form_end(form) }}
            {% endif %}
        </div>
    </div>

    <div class="container">
        <h2>Les dernieres missions</h2>
        <div class="row flex">

            {% for mission in missions %}
                <div class="col-3">
                    <div class="card mb-4">
                        <div class="card-body">
                            <h5 class="card-title">
                                <a href="{{ path('mission.show', {id: mission.id, slug: mission.slug}) }}">{{ mission.titre }}</a>
                            </h5>
                            <p class="card-text">{{ mission.adresse }} {{ mission.ville }}</p>
                            <div class="text-primary" style="font-weight: bold;font-size: 2rem;">{{ mission.gain }} €</div>
                        </div>
                    </div>
                </div>

                <div class="pagination">
                    {{ knp_pagination_render(missions) }}
                </div>
            {% endfor %}

        </div>
    </div>
{% endblock %}

MissionRepository.php

<?php

namespace App\Repository;

use App\Entity\Mission;
use App\Entity\MissionSearch;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\ORM\Query;
use Doctrine\Persistence\ManagerRegistry;
use Doctrine\ORM\QueryBuilder;


/**
 * @method Mission|null find($id, $lockMode = null, $lockVersion = null)
 * @method Mission|null findOneBy(array $criteria, array $orderBy = null)
 * @method Mission[]    findAll()
 * @method Mission[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
 */
class MissionRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, Mission::class);
    }

    /**
     * @return Query
     */
    public function findAllVisibleQuery(MissionSearch $search): Query
    {
        $query = $this->findVisibleQuery();

        if ($search->getMaxGain()) {
            $query = $query
                ->andWhere('p.price <= :maxgain')
                ->setParameter('maxgain', $search->getMaxGain());
        }

        if ($search->getDeltaVille()) {
            $query = $query
                ->andWhere('m.ville = :deltaville')
                ->setParameter('deltaville', $search->getDeltaVille());
        }

        if ($search->getOptions()->count() > 0) {
            $k = 0;
            foreach($search->getOptions() as $option) {
                $k++;
                $query = $query
                    ->andWhere(":option$k MEMBER OF m.options")
                    ->setParameter("option$k", $option);
            }
        }

        return $query->getQuery();
    }


    /**
     * @return Mission[]
     */
    public function findLatest(): array
    {
        return $this->findVisibleQuery()
            ->setMaxResults(30)
            ->getQuery()
            ->getResult();
    }

    private function findVisibleQuery(): QueryBuilder
    {
        return $this->createQueryBuilder('m')
            ->where('m.Accepted = false');
    }

    // /**
    //  * @return Mission[] Returns an array of Mission objects
    //  */
    /*
    public function findByExampleField($value)
    {
        return $this->createQueryBuilder('m')
            ->andWhere('m.exampleField = :val')
            ->setParameter('val', $value)
            ->orderBy('m.id', 'ASC')
            ->setMaxResults(10)
            ->getQuery()
            ->getResult()
        ;
    }
    */

    /*
    public function findOneBySomeField($value): ?Mission
    {
        return $this->createQueryBuilder('m')
            ->andWhere('m.exampleField = :val')
            ->setParameter('val', $value)
            ->getQuery()
            ->getOneOrNullResult()
        ;
    }
    */
}

person Community    schedule 26.05.2020    source источник
comment
Я не уверен, но попробуйте return $query->getQuery()->getResult();   -  person hous    schedule 26.05.2020
comment
@hous нет, это не сработало, спасибо   -  person    schedule 26.05.2020
comment
Вы очистили кеш?   -  person ehymel    schedule 27.05.2020
comment
Вероятно, это не связано, но разве вызов knp_pagination_render() не должен быть вне цикла ваших миссий?   -  person Tom Tom    schedule 27.05.2020
comment
Для вашей проблемы вы хотите попытаться распечатать размер коллекции миссий, которую вы возвращаете, за которой следует die(), чтобы вы не получили исключение. Вы также можете проверить, пусты ли миссии или нет, прежде чем вызывать разбиение на страницы, я думаю, что это стандартная практика (хотя не совсем уверен в KNP).   -  person Tom Tom    schedule 27.05.2020
comment
Попробуйте отладить переменную $missions и опубликуйте ее здесь для получения дополнительной информации.   -  person Samuel Breu    schedule 27.05.2020


Ответы (1)


вам нужно отредактировать класс репозитория, чтобы он возвращал QueryBuilder вместо самого Query.

Ваша функция должна быть примерно такой:

public function findAllVisibleQuery(MissionSearch $search): Query
{
    $query = $this->findVisibleQuery();

    if ($search->getMaxGain()) {
        $query = $query
            ->andWhere('p.price <= :maxgain')
            ->setParameter('maxgain', $search->getMaxGain());
    }

    if ($search->getDeltaVille()) {
        $query = $query
            ->andWhere('m.ville = :deltaville')
            ->setParameter('deltaville', $search->getDeltaVille());
    }

    if ($search->getOptions()->count() > 0) {
        $k = 0;
        foreach($search->getOptions() as $option) {
            $k++;
            $query = $query
                ->andWhere(":option$k MEMBER OF m.options")
                ->setParameter("option$k", $option);
        }
    }

    return $query;
}
person G. Mansour    schedule 27.05.2020