更新情報
2020/09/09 getter
とsetter
の両方に型情報が無い場合にPOSTパラメータに表示されない現象を確認。
はじめに
API Platformを使っていて若干ハマった部分の備忘録
問題
以下のような設定を行っている時に、Bookリソースを取得した時のレスポンスにisPublished
が含まれない。
/**
* @ApiResource(
* normalizationContext={"groups"={"book:read"}},
* denormalizationContext={"groups"={"book:write"}},
* collectionOperations={
* "get"={},
* "post"={},
* },
* itemOperations={
* "get"={},
* "delete"={},
* },
* )
*
* @ORM\Entity(repositoryClass=UserRepository::class)
*/
class Book
{
...
/**
* @Groups({"book:read"})
*/
private $isPublished = false;
...
}
原因
Getterの名前がプロパティ名とズレていた。どうやらAPI PlatformではisPublished
に対するGetterはgetIsPublished
でなければいけない模様。下記のように修正する事で無事レスポンスにisPublished
が含まれました。(どちらかと言うとSymfonyのシリアライザの仕様?)
Phpstormを使っていて、cmd + n
からGetterを生やすと、is〇〇
系はデフォルトでgetが省略されるのでハマってしまいました...。
Phpstormを使っている方はご注意を。
class Book
{
...
public function isPublished()
{
return $this->isPublished;
}
...
}
↓
class Book
{
...
public function getIsPublished()
{
return $this->isPublished;
}
...
}
getter/setterに型が無い場合
getterかsetterのどちらかに型情報があればいい模様。
型情報なし
User.php
...
/**
* @Groups({"user:write"})
*/
private $plainPassword;
public function getPlainPassword()
{
return $this->plainPassword;
}
public function setPlainPassword($plainPassword): self
{
$this->plainPassword = $plainPassword;
return $this;
}
...
型情報あり
User.php
...
/**
* @Groups({"user:write"})
*/
private $plainPassword;
public function getPlainPassword(): ?string
{
return $this->plainPassword;
}
public function setPlainPassword(?string $plainPassword): self
{
$this->plainPassword = $plainPassword;
return $this;
}
...