Php API平台不可变属性

Php API平台不可变属性,php,symfony,api-platform.com,Php,Symfony,Api Platform.com,我在Symfony 4.3项目上使用API平台,我只想拥有一个不可变的属性(userId,在本例中),它可以在POST上设置,但不能用PUT更改。到目前为止,实现这一点的唯一方法是删除userIdsetter并使用构造函数最初设置值 此设置仍然以Swagger for PUT(下图)的形式显示属性,但更麻烦的是,它在不修改记录的情况下接受该属性。这是一个沉默的忽略,我更喜欢400个错误的请求返回代码,让客户知道他的请求没有按预期处理 有没有其他方法可以通过API平台实现类似的行为?已尝试序列化

我在Symfony 4.3项目上使用API平台,我只想拥有一个不可变的属性(
userId
,在本例中),它可以在POST上设置,但不能用PUT更改。到目前为止,实现这一点的唯一方法是删除
userId
setter并使用构造函数最初设置值

此设置仍然以Swagger for PUT(下图)的形式显示属性,但更麻烦的是,它在不修改记录的情况下接受该属性。这是一个沉默的忽略,我更喜欢400个错误的请求返回代码,让客户知道他的请求没有按预期处理

有没有其他方法可以通过API平台实现类似的行为?已尝试序列化组,但可能设置错误

<?php
declare(strict_types = 1);

namespace App\Entity;

use ApiPlatform\Core\Annotation\ApiFilter;
use ApiPlatform\Core\Annotation\ApiResource;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\NumericFilter;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\SubscriptionRepository")
 *
 * @UniqueEntity("userId")
 *
 * @ApiResource()
 */
class Subscription
{
    /**
     * @var int
     *
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @var int
     *
     * @ORM\Column(type="integer")
     *
     * @ApiFilter(NumericFilter::class)
     */
    private $userId;

    /**
     * Subscription constructor.
     *
     * @param int $userId
     */
    public function __construct(int $userId)
    {
        $this->userId = $userId;
    }

    ...
?>


我认为您需要显式设置
规范化\u context.groups
,以便将请求放入
{“read”}
(或其他内容,取决于您的配置)。
请参见

如果应用程序而不是用户设置了
$id
,则可以在中查看序列化组。您可以向我们展示您使用序列化组所做的尝试吗?另一方面,如果API需要接收
$id
,则需要查找输入DTO,也需要在中查找所涉及的
$userId
,而不是
$id
。如果使用
normalizationContext={“groups”={“read”}
(根据文档)并在
$userId
上设置
read
组,则在创建订阅资源时将不允许设置userId。我希望能够在创建资源时设置它,但不能通过PUT更改它。我认为您需要显式地为
PUT
请求
{“read”}
(或其他一些,取决于您的配置)设置
规范化\u上下文。请参阅感谢@IonBazan,文档中没有提到这一点。请随意提交您的评论作为答复,我很乐意接受