Я создаю специальную PUT
операцию.
Не использовать встроенные операции, потому что затронутое свойство не включено в нормализацию по умолчанию для этой сущности, а также потому, что эта операция имеет несколько побочных эффектов, выходящих за рамки этой сущности / модели.
Кроме того, операция обновления должна быть успешной только в том случае, если текущее состояние объекта в БД соответствует определенным ожиданиям.
Например. для юридического лица
class Lead {
/**
* @ORM\Column(type="integer", nullable=true)
* @Groups({"lead", "leadReject" })
**/
private $rejectionReason
public function isRejected() {
return $this->rejectionReason !== null;
}
Я создаю специальную операцию PUT /lead/{id}/reject
.
class LeadReject {
public function __invoke( Lead $data ): Lead {
// if lead is rejected, we need not only to update its status
// but create an entry in a LeadLog table, and update the state
// for the Lead owner
}
}
Проблема в том, что к тому времени, когда мы дойдем до __invoke()
, $data
, который я получаю, уже объединил введенные пользователем данные со значениями из базы данных. Таким образом, любой вызов $data->isRejected()
возвращает истину, даже если он все еще null
в базе данных.
И прежде чем я сохраню объект и выполню все остальные операции, мне нужно убедиться, что Lead
не был отклонен ранее.
Как я могу это сделать? Можно ли это сделать на уровне операционного контроллера? Думаю, я мог бы ввести EntityManager и снова получить объект, но это кажется расточительным, учитывая, что на данный момент объект уже был получен.