Php API平台不可变属性
我在Symfony 4.3项目上使用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平台实现类似的行为?已尝试序列化
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,文档中没有提到这一点。请随意提交您的评论作为答复,我很乐意接受