willdurand hateoas捆绑的分页路线问题

时间:2016-11-09 16:43:08

标签: php symfony pagination fosrestbundle hateoas

我目前正在使用Hateoas开发一些REST Web服务,我想为更长的列表显示实现分页。

注意:数据库检索逻辑尚未实现

这是我的控制者:

use Hateoas\Representation\PaginatedRepresentation;
use Hateoas\Representation\CollectionRepresentation;

/**
 * @Rest\View(serializerGroups={"details"})
 * @Doc\ApiDoc(
 *     section="User",
 *     resource=true,
 *     description="Get all catalogs accessible by a User",
 *     requirements={
 *          {
 *          "name"="id",
 *          "dataType"="integer",
 *          "requirement"="\d+",
 *          "description"="The id of the user from which to retrieve"
 *          }
 *     },
 *     output={
 *          "class"="\CatalogV2",
 *          "groups"={"details"}
 *     }
 * )
 */
public function getUserLicencesAction($id, $page = 1, $limit = 10) {
    $service_rustine = $this->container->get('rustine_core.link');
    // Get User corresponding to id
    $user = $service_rustine->getUser($id);

    // Get licences
    $licences = $user->getLicencesRight();

    $offset = ($page - 1) * $limit;
    $pages = (int)ceil(count($licences) / $limit);

    $collection = new CollectionRepresentation(
        array_slice($licences, $offset, $page * $limit),
        'licences',
        'licences',
        new Exclusion(array("details"))
        );
    $paginated = new PaginatedRepresentation(
        $collection,
        'get_user_licences',
        array("id" => $id),
        $page,
        $limit,
        $pages
        );

    // JSON output
    return $paginated;
}

我一直存在的错误是:

“缺少某些必需参数(”id“)以生成路径”get_user_licences“的网址

关于路由参数的文档不是很清楚,我找不到任何使用非空数组的例子。

在UrlGenerator中始终忽略parameters数组中给出的routeparam id。 我已经尝试了数组($ id),但它也没有工作。

当我尝试在相同的控制器中生成这样的路线时,没有问题:

$this->get('router')->generate('get_user_licences', array('id' => $id));

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

我发现了问题:实际上有一个YML配置文件重新定义了Hateoas \ Representation \ PaginatedRepresentation元数据......用于路径定义中的参数的表达式是不正确的。对于“下一个”链接,例如我有:

expr(object.getPage() + 1)

而不是

expr(object.getParameters(object.getPage() + 1))

也许有一天这会帮助别人!