/(.*)<FooBar>/s
s вызывает Dot (.) для соответствия возврату каретки
Мне удалось решить проблему, добавив пользовательский слушатель. Он ловит ModelManagerException
при удалении ограниченного объекта. Это работает для всех зарегистрированных администраторов. Вот класс:
<?php
namespace App\EventListener;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Sonata\AdminBundle\Exception\ModelManagerException;
class ModelManagerExceptionResponseListener
{
private $session;
private $router;
private $em;
public function __construct(SessionInterface $session, UrlGeneratorInterface $router, EntityManagerInterface $em)
{
$this->session = $session;
$this->router = $router;
$this->em = $em;
}
public function onKernelException(GetResponseForExceptionEvent $event)
{
// get the exception
$exception = $event->getException();
// we proceed only if it is ModelManagerException
if (!$exception instanceof ModelManagerException) {
return;
}
// get the route and id
// if it wasn't a delete route we don't want to proceed
$request = $event->getRequest();
$route = $request->get('_route');
$id = $request->get('id');
if (substr($route, -6) !== 'delete') {
return;
}
$route = str_replace('delete', 'edit', $route);
// get the message
// we proceed only if it is the desired message
$message = $exception->getMessage();
$failure = 'Failed to delete object: ';
if (strpos($message, $failure) < 0) {
return;
}
// get the object that can't be deleted
$entity = str_replace($failure, '', $message);
$repository = $this->em->getRepository($entity);
$object = $repository->findOneById($id);
$this->session->getFlashBag()
->add(
'sonata_flash_error',
sprintf('The item "%s" can not be deleted because other items depend on it.', $object)
)
;
// redirect to the edit form of the object
$url = $this->router->generate($route, ['id' => $id]);
$response = new RedirectResponse($url);
$event->setResponse($response);
}
}
И мы регистрируем службу:
app.event_listener.pdoexception_listener:
class: App\EventListener\ModelManagerExceptionResponseListener
arguments:
- '@session'
- '@router'
- '@doctrine.orm.entity_manager'
tags:
- { name: kernel.event_listener, event: kernel.exception }
public: true # this maybe isn't needed
Вероятно, удаление любого объекта за пределами администратора не будет разрешено в моем конкретном случае. Поэтому это решение удовлетворяет требованиям. Я надеюсь, что этот пример может помочь другим. Вам придется адаптировать некоторые детали в соответствии с вашими потребностями.
Я считаю, что то, что вы пытаетесь сделать, описано здесь:
Symfony + Doctrine - определите сообщение об ошибке при ошибке ограничения целостности
Я не буду копировать - вставьте сообщение целиком, но концепция состоит в том, чтобы создать onKernelResponse
слушателя и прослушать PDOException
. Как это сделать, есть много статей, я думаю, что вы можете легко найти в Интернете, я выбрал одну из первых, которые я нашел.
В этом Слушателе вы можете определить, что это за исключение, и использовать flashbag либо по умолчанию Symfony:
https://symfony.com/doc/current/components/http_foundation/sessions.html
$session->getFlashBag()->add('notice', 'Profile updated');
Или вы можете использовать Sonata Core Flashbag:
https://sonata-project.org/bundles/core/master /doc/reference/flash_messages.html
Чтобы использовать эту функцию в ваших классах / контроллерах PHP:
$flashManager = $this->get('sonata.core.flashmessage.manager');
$messages = $flashManager->get('success');
Кому используйте эту функцию в своих шаблонах, включите следующий шаблон (с необязательным параметром домена):
{% include '@SonataCore/FlashMessage/render.html.twig' %}
Примечание. При необходимости вы также можете указать домен перевода для переопределения конфигурации:
blockquote>
{% include '@SonataCore/FlashMessage/render.html.twig' with { domain: 'MyCustomBundle' } %}
Вы также можете взглянуть на эту статью https://tocacar.com/symfony2-how-to-modify-sonataadminbundles-error -message-on-entity-deletion-ca77cac343fa и переопределить
CRUDController::deleteAction
, чтобы вы могли обрабатывать такие ошибки.И здесь вы можете найти код, немного связанный с вашей проблемой, на странице Sonata Admin GitHub https://github.com/sonata-project/SonataAdminBundle/issues/4485 , который он перехватывает.
PDOException
, так что также проверьте, какую версию вы используете, возможно, вам нужно обновление.