У меня есть проект Symfony с Doctrine. В доктрине есть команда doctrine:schema:update
.
К нему слишком часто привыкают, скажем так, по привычке. После запуска doctrine:schema:update
все миграции испорчены, и мне приходится приходить и чинить их машину разработки.
Я хочу отключить эту команду (или, по крайней мере, сделать ее не самым простым маршрутом), но не могу понять, как (или даже ЕСЛИ) я могу это сделать.
Я пробовал:
UpdateSchemaCommand
, дайте ему ту же КОМАНДУ и создайте исключение.services.yaml
как public:false
services.yaml
с помощью несуществующего класса (некрасиво, но работает).Все это ничего не дает, каждый раз команда обновления возвращает результат по умолчанию.
@Cerad Согласно вопросу, команда выполнена по ошибке и не реализована проектом. Кроме того, я не думаю, что разумно использовать менеджер пакетов, а затем вручную возиться с файлами, которые он создает, независимо от того, Composer или нет.
Вы пробовали использовать EventListener? Например, прослушивать консольные команды с помощью ConsoleCommandEvent, а затем отключать выполнение команды?
По большей части это самый простой способ исправить БД разработки. Вот только нет, потому что это делается быстро, но требуется время, чтобы навести порядок. Это привычка, от которой, по мнению пользователей, следует избавиться. См. мое переопределение как напоминание :) Исключением будет что-то вроде «Нет, вместо этого используйте миграции»
Обратите внимание на разницу между UpdateSchemaDoctrineCommand и UpdateSchemaCommand.
Вы можете отключить команду таким образом с помощью EventListener:
namespace App\EventListener;
use Symfony\Component\Console\Event\ConsoleCommandEvent;
use Symfony\Component\Console\ConsoleEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class CommandListener implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [
ConsoleEvents::COMMAND => 'onConsoleCommand',
];
}
public function onConsoleCommand(ConsoleCommandEvent $event)
{
if ($event->getCommand()->getName() === 'doctrine:schema:update') {
$event->getOutput()->writeln('<error>The command doctrine:schema:update is disabled.</error>');
$event->disableCommand();
}
}
}
А затем включите его:
services:
App\EventListener\DisableDoctrineSchemaUpdateListener:
tags: [{name: 'kernel.event_subscriber'}]
Требовалось добавление сервисов, но тогда всё заработало как положено :) А если кому-то очень надо, то включить легко, если знать как
Я согласен! Но когда кто-то хочет обойти ограничения, я думаю, всегда есть способ;) По крайней мере, это первый «мягкий» уровень для отключения команды.
💡 <error>Command doctrine:schema:update is not supported in this project. Do blah blah instead.</error>
Хм. Пробовали ли вы просто удалить
vendor/doctrine/doctrine-bundle/Command/Proxy/UpdateSchemaDoctrineCommand.php
? А если серьезно, если команда разработчиков настаивает на использовании команд, которые им не положены, то у вас возникают более серьезные проблемы. Вы пытались объяснить, почему вы считаете команду плохой идеей? Или спрашиваете, почему им нравится его использовать? Миграции переоценены.