Symfony 2.8 SyliusRecourceBundle 路由标准

Symfony 2.8 SyliusRecourceBundle routing criteria

现在我有一个奇怪的问题。最近我开始使用 Symfony 2.8 进行开发。为了在这个框架中学习,我用 API 做了一个自己的项目。一切正常,直到我遇到带有条件的路线。

根据documentation我只需要在路由文件中添加"criteria"。但它没有显示出任何区别。但是当我也添加 "limit" 时。然后就可以了。

路由文件(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

这是默认 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());
}