Критерии маршрутизации Symfony 2.8 SyliusRecourceBundle

Сейчас у меня странная проблема. Недавно я начал разрабатывать на Symfony 2.8. Чтобы учиться в этом фреймворке, я сделал собственный проект с API. Все работает, пока я не столкнусь с маршрутом с критериями.

Согласно документации Мне нужно только добавить "критерии" в файл маршрута. Но он не показывает никакой разницы. Но когда я тоже добавляю «лимит». Тогда это работает.

Файл маршрута (A и B поддельные):

api_A_B:
 path: /A/{id}/B
 methods: [GET]
 defaults:
   _controller: api.controller.B:indexAction
   _sylius:
     paginate: false
     #limit: 900 #WHY?
     criteria:
       A: $id

Я читал что-то о «filterable: true», но это было много лет назад, и его нет в документации.

Ответ на запрос с ограничением:

FROM 
  B t0 
WHERE 
  t0.A_id = ? 
LIMIT 
  900

Ответ на запрос без ограничений:

FROM 
  B t0

person ItsJohnB    schedule 22.05.2016    source источник


Ответы (1)


Это ошибка в распознавателе ресурсов Sylius по умолчанию, он игнорирует критерии и сортировку, когда вы не разбиваете на страницы или limit не установлено. Чтобы решить эту проблему, вы должны переопределить параметр sylius.resource_controller.resources_resolver.class и использовать следующую реализацию для метода getResources:

public function getResources(RequestConfiguration $requestConfiguration, RepositoryInterface $repository)
{
    if (null !== $repositoryMethod = $requestConfiguration->getRepositoryMethod()) {
        $callable = [$repository, $repositoryMethod];
        $resources = call_user_func_array($callable, $requestConfiguration->getRepositoryArguments());

        return $resources;
    }

    // this has changed!
    if (!$requestConfiguration->isPaginated() && !$requestConfiguration->isLimited()) {
        return $repository->findBy($requestConfiguration->getCriteria(), $requestConfiguration->getSorting(), $requestConfiguration->getLimit());
    }

    if (!$requestConfiguration->isPaginated()) {
        return $repository->findBy($requestConfiguration->getCriteria(), $requestConfiguration->getSorting(), $requestConfiguration->getLimit());
    }

    return $repository->createPaginator($requestConfiguration->getCriteria(), $requestConfiguration->getSorting());
}
person Steffen Brem    schedule 22.05.2016