Исключение ORMInvalidArgumentException
Исключение ORMInvalidArgumentException относится к классу
Doctrine\ORM\ORMInvalidArgumentException и наследуется
от стандартного InvalidArgumentException языка PHP.
Оно выбрасывается ORM-слоем Doctrine, когда в методы
EntityManager, UnitOfWork или репозитория передаются
некорректные аргументы: null вместо сущности, массив
без обязательных ключей, объект неподходящего типа или
сущность без настроенного маппинга. Чаще всего исключение
возникает при вызове методов persist, remove,
merge, refresh и find. Сообщение исключения
содержит подсказку о том, какой именно аргумент был передан
неверно.
Синтаксис
<?php
namespace Doctrine\ORM;
class ORMInvalidArgumentException extends \InvalidArgumentException
{
public static function newInvalidArgumentException(string $message): self;
public static function entityNotManaged(object $entity): self;
public static function entityHasNoIdentity(object $entity, string $operation): self;
public static function invalidFlushMode(string $mode): self;
public static function invalidOrientation(string $orientation): self;
public static function invalidHydrationMode(string $mode): self;
public static function newInvalidArgumentExceptionWithEntities(string $message, array $entities): self;
}
?>
Пример
Давайте попробуем передать в метод persist не сущность,
а обычную строку и поймаем исключение:
<?php
namespace App\Controller;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\ORMInvalidArgumentException;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
class ArticleController extends AbstractController
{
public function index(EntityManagerInterface $em): Response
{
try {
$em->persist('abcde');
} catch (ORMInvalidArgumentException $e) {
return new Response($e->getMessage());
}
return new Response('ok');
}
}
?>
Результат выполнения кода:
"Entity passed to persist() is not a valid entity object. Got string"
Пример
Давайте попробуем вызвать remove для сущности,
которая не управляется текущим EntityManager:
<?php
namespace App\Controller;
use App\Entity\Article;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\ORMInvalidArgumentException;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
class ArticleController extends AbstractController
{
public function index(EntityManagerInterface $em): Response
{
$article = new Article();
try {
$em->remove($article);
} catch (ORMInvalidArgumentException $e) {
return new Response($e->getMessage());
}
return new Response('ok');
}
}
?>
Результат выполнения кода:
"Removal of an entity that is not managed by this EntityManager is not allowed. Entity App\Entity\Article is not managed"
Пример
Давайте обработаем исключение и вернём пользователю понятный ответ через JSON:
<?php
namespace App\Controller;
use App\Entity\Article;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\ORMInvalidArgumentException;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
class ArticleController extends AbstractController
{
public function index(EntityManagerInterface $em): JsonResponse
{
$article = new Article();
$article->setTitle('abcde');
try {
$em->persist($article);
$em->flush();
} catch (ORMInvalidArgumentException $e) {
return new JsonResponse([
'error' => 'orm_invalid_argument',
'message' => $e->getMessage(),
], 400);
}
return new JsonResponse(['status' => 'created']);
}
}
?>
Результат выполнения кода при корректных данных:
{"status":"created"}
Смотрите также
-
исключение
EntityNotFoundException,
которое выбрасывается, когда сущность не найдена -
исключение
UniqueConstraintViolationException,
которое возникает при нарушении уникального индекса -
исключение
InvalidArgumentException,
родительский класс для ORMInvalidArgumentException -
класс
FlattenException,
который сериализует исключения для ответа