Я пытаюсь отфильтровать коллекцию, возвращенную родительской базой сущностей, по нескольким условиям, относящимся к другой сущности (пользователю).
По сути, я хочу, чтобы API PLATFORM возвращал сообщения только от текущего подключенного пользователя.
Вот мой объект с именем File (очень упрощенный для глобального понимания)
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Symfony\Component\Serializer\Annotation\Groups;
use ApiPlatform\Core\Annotation\ApiFilter;
use ApiPlatform\Core\Annotation\ApiResource;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\DateFilter;
use App\Controller\FileCreatePdfController;
use Ramsey\Uuid\Uuid;
use Gedmo\Mapping\Annotation as Gedmo;
/**
* @ApiResource(
*
* normalizationContext={"groups"={"file"},"enable_max_depth"=true},
* denormalizationContext={"groups"={"file-write"},"enable_max_depth"=true},
* attributes={"force_eager"=false},
* )
* @ApiFilter(SearchFilter::class, properties={"status": "exact"})
* @ApiFilter(DateFilter::class, properties={"updatedAt"})
* @ORM\Entity
* @ORM\Table(name="cases")
*/
class File
{
public function __construct()
{
$this->id = Uuid::uuid4();
$this->messages = new ArrayCollection();
}
public function getId()
{
return $this->id;
}
/**
* @ORM\Id
* @ORM\Column(type="uuid", unique=true)
*/
private $id;
/**
* @var Collection|FileMessage[]
*
* @Groups({"file"})
* @ORM\OneToMany(targetEntity="App\Entity\FileMessage", mappedBy="file")
*/
private $messages;
/**
* @return Collection|FileMessage[]
*/
public function getMessages(): Collection
{
return $this->messages;
}
/**
* @param FileMessage $message
* @return File
*/
public function addMessage(FileMessage $message): self
{
if (false === $this->messages->contains($message)) {
$this->messages->add($message);
}
return $this;
}
}
Мой файл содержит несколько сообщений из FileMessage (очень упрощенный для общего понимания
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use ApiPlatform\Core\Annotation\ApiResource;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints as Assert;
use Ramsey\Uuid\Uuid;
/**
* @ApiResource(
* normalizationContext={"groups"={"file-message"}, "enable_max_depth"=true},
* denormalizationContext={"groups"={"file-message-write"}, "enable_max_depth"=true},
* attributes={"force_eager"=false}
* )
* @ORM\Entity
* @ORM\Table(name="`file_messages`")
*/
class FileMessage {
/**
*
* @ORM\Id
* @ORM\Column(type="uuid", unique=true)
*/
private $id;
/**
* @var File
*
* @ORM\ManyToOne(targetEntity="File", cascade={"persist"}, inversedBy="messages")
* @Assert\Valid
* @Groups({"file-message", "file-message-write","file"})
*/
private $file;
/**
* @var User
*
* @ORM\ManyToOne(targetEntity="User", cascade={"persist"}, inversedBy="messages")
* @Assert\Valid
* @Groups({"file-message", "file-message-write","file"})
*/
private $user;
public function __construct()
{
$this->id = Uuid::uuid4();
}
public function getId()
{
return $this->id;
}
public function getFile(): ?File
{
return $this->file;
}
public function setFile(?File $file): self
{
$this->file = $file;
return $this;
}
public function getUser(): ?User
{
return $this->user;
}
public function setUser(?User $user): self
{
$this->user = $user;
return $this;
}
}
Каждый сообщение отправлено указанным c пользователем (другой пользователь сущности), я не думаю, что необходимо публиковать содержимое этой сущности.
Когда я получаю указанный файл c, url / files / [file_id]
Отображаются все сообщения для всех пользователей, я хочу скрыть все сообщения, которые не относятся к подключенному пользователю
Решение, которое я пробовал до сих пор:
- Расширения , я фильтрую только файлы /, которые я получаю, но не коллекцию сообщений
- Пользовательский фильтр s , кажется, не присваивается
- Фильтрация коллекций , кажется идеальной только при фильтрации по свойствам текущего класса, в моем случае мне нужно отфильтровать свойства на основе другого класса content (Пользователь).
Есть ли у меня какое-либо решение? Я подумал, может быть, использовать слушатель событий