issues/27: Harden ContentFilterDto query parsing; use DateTimeImmutable in UpdateTimestampTrait

This commit is contained in:
Valery Petrov
2026-05-15 16:29:30 +03:00
committed by Valeriy Petrov
parent 7a4fda31a4
commit 4f76693fe1
2 changed files with 18 additions and 3 deletions
+11 -1
View File
@@ -34,9 +34,12 @@ final readonly class ContentFilterDto
);
}
/**
* Symfony QueryBag может отдать массив при ?regionId[]=… — не передаём его в is_numeric (TypeError в PHP 8).
*/
private static function positiveInt(mixed $value): ?int
{
if ($value === null || $value === '' || !is_numeric($value)) {
if ($value === null || $value === '' || !is_scalar($value) || !is_numeric($value)) {
return null;
}
@@ -45,12 +48,19 @@ final readonly class ContentFilterDto
return $value > 0 ? $value : null;
}
/**
* При ?active[]=… query->get вернёт массив — отбрасываем без вызова filter_var по нему.
*/
private static function nullableBool(mixed $value): ?bool
{
if ($value === null || $value === '') {
return null;
}
if (!is_scalar($value)) {
return null;
}
if (is_bool($value)) {
return $value;
}
+7 -2
View File
@@ -6,19 +6,24 @@ namespace App\Entity\Behavior;
use Doctrine\ORM\Mapping as ORM;
/**
* Требует у класса-сущности свойство `$updateAt` (mapped column).
*
* @property \DateTimeInterface|null $updateAt
*/
trait UpdateTimestampTrait
{
#[ORM\PrePersist]
public function setInitialUpdateAt(): void
{
if ($this->updateAt === null) {
$this->updateAt = new \DateTime();
$this->updateAt = new \DateTimeImmutable();
}
}
#[ORM\PreUpdate]
public function refreshUpdateAt(): void
{
$this->updateAt = new \DateTime();
$this->updateAt = new \DateTimeImmutable();
}
}