API平台:将许多资源关联到同一实体

时间:2019-06-05 12:17:49

标签: symfony4 api-platform.com

我想创建2个不同的资源App \ Resource \ Category et App \ Resource \ Classification,它们将与同一实体App \ Entity \ Classification关联。我们有2个不同的端点v1 /分类和v2 /类别。我希望这两种资源都可以扩展同一实体。

伪代码示例:

<?php
// src/Entity/Classification.php
namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\ClassificationRepository")
 */
class Classification
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $code;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $label;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\ClassificationAttribute", mappedBy="classification")
     */
    private $classificationAttributes;

    public function __construct()
    {
        $this->classificationAttributes = new ArrayCollection();
    }

    public function getId()
    {
        return $this->id;
    }

    // ... getter and setter methods
}
<?php
// src/Resource/Classification.php
namespace App\Resource;

use ApiPlatform\Core\Annotation\ApiResource;
use App\Entity\Classification as ClassificationEntity;

/**
 * ...
 * @ApiResource(
 *     collectionOperations={"get"},
 *     itemOperations={"get"}
 * )
 */
class Classification extends ClassificationEntity
{
    // ...
}
<?php
// src/Resource/Category.php
namespace App\Resource;

use ApiPlatform\Core\Annotation\ApiResource;
use App\Entity\Classification as ClassificationEntity;

/**
 * ...
 * @ApiResource(
 *     collectionOperations={"get"},
 *     itemOperations={"get"}
 * )
 */
class Category extends ClassificationEntity
{
    // ...
}

每个资源将具有其端点,其序列化器,其规范化器等,等等……总之,每个资源将以其自己的方式进行定制。

除了不能同时使用注释和继承:不使用扩展实体的注释。

我可以将不同的DataProvider关联到每个资源,然后将这些DataProvider插入存储库中。但是这样做,我失去了Doctrine ORM扩展的所有本机功能,而不得不重新实现我使用的每一个功能(例如:@ApiFilter)

有没有更简单的方法将许多资源关联到同一实体?

谢谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您需要将Resource文件夹添加到api / config / packages / api_platform.yaml中的映射路径:

api_platform:
    mapping:
        paths:
            - '%kernel.project_dir%/src/Entity'
            - '%kernel.project_dir%/src/Resource'

不在这些路径中的资源将被忽​​略。

相关问题