【问题标题】:Symfony Api Platform return data not converted to hydra responseSymfony Api Platform 返回数据未转换为 hydra 响应
【发布时间】:2020-08-19 07:50:36
【问题描述】:

我在我的应用程序中使用 API 平台,我创建了 API 平台的自定义分页器,但响应没有转换为 hydra 响应:

代码库:

use ApiPlatform\Core\Bridge\Doctrine\Orm\Paginator as Paginator;
use Doctrine\ORM\Tools\Pagination\Paginator as DoctrinePaginator;

public function findByExampleField($page, $items)
{
    $firstResult = ($page - 1) * $items;

    $queryBuilder = $this->createQueryBuilder('c')
        ->orderBy('c.id', 'ASC');

    $query = $queryBuilder->getQuery()
        ->setFirstResult($firstResult)
        ->setMaxResults($items);


    $dp = new DoctrinePaginator($query);
    $po = new Paginator($dp);

    return $po;
}

使用此代码,响应是正常数据而不是 hydra 响应

【问题讨论】:

  • 看起来几乎api-platform.com/docs/core/pagination/#custom-controller-action,但最终,它是不同的。也许您想更紧密地重新创建它...?具体来说,该链接上的示例代码不调用 getQuery ...
  • @Jakumi 也直接返回数据而不是 hydra 响应
  • 你有Content-Type application/ld+json header吗?
  • @shvv 是的,我将 application/ld+json 添加到标题中,但也有错误
  • 你想达到什么目的?您的自定义分页器为现有分页器添加了什么?能举个例子吗?

标签: symfony doctrine-orm doctrine api-platform.com


【解决方案1】:

基于comment部分,既然要扩展GET集合操作,我认为创建自定义分页器不是一个好方法:

扩展系统示例:

(注意操作名)

// src/Entity/Data.php

namespace App\Entity;

/**
 * @ApiResource(
 *     collectionOperations = {
 *          "get_only_status_true" = {
 *              "method" = "get"
 *          }
 *     }
 * )
 * @ORM\Entity(repositoryClass=DataRepository::class)
 */
class Data
{
    /**
     * @var int
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @var boolean
     * @ORM\Column(type="boolean")
     */
    private $status;
    
    // getter and setters there
}
// src/Doctrine/DataExtensions.php

namespace App\Doctrine;

class DataExtension implements QueryCollectionExtensionInterface
{
    public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator,
                                      string $resourceClass, string $operationName = null)
    {
        if ($resourceClass === Data::class && $operationName === 'get_only_status_true') {
            $data = $queryBuilder->getRootAliases()[0];
            $queryBuilder->andWhere("$data.status = 1");
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    相关资源
    最近更新 更多