Команда Doctrine generate entity создает дополнительные файлы src / Gedmo, в результате чего команда перестает работать до удаления папки

Я использую Доктрину с Расширение Gedmo в автономном приложении.
Автозагрузка осуществляется через контент composer, composer.json:

{
"autoload": {
"psr-0": {
"App": "src"}
},
"require": {
"doctrine/orm": "^2.5",
"gedmo/doctrine-extensions": "^2.4"}
}

Основные классы приложения находятся в каталоге / src, файлы композитора — в / vendor
Доктрина настраивается через фабрику, основной код которой приведен ниже:

<?php

namespace App\Factory;

use Doctrine\Common\Annotations\AnnotationReader;
use Doctrine\Common\Annotations\AnnotationRegistry;
use Doctrine\Common\Annotations\CachedReader;
use Doctrine\Common\Cache\CacheProvider;
use Doctrine\Common\Cache\FileCache;
use Doctrine\Common\EventManager;
use Doctrine\Common\Persistence\Mapping\Driver\MappingDriverChain;
use Doctrine\ORM\Configuration;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Mapping\Driver\AnnotationDriver;

class DoctrineFactory implements FactoryInterface
{
/**
* @param ContainerInterface $c
* @return mixed
*/
public function __invoke(ContainerInterface $c)
{
// Set up caches
$cache = new FileCache('runtime/cache/doctrine');

// Annotation reader
$annotationReader = new AnnotationReader;
$cachedAnnotationReader = new CachedReader($annotationReader, $cache);
AnnotationRegistry::registerLoader(array(require 'vendor/autoload.php', 'loadClass'));

// Add Gedmo extensions
$driverChain = new MappingDriverChain();
\Gedmo\DoctrineExtensions::registerAbstractMappingIntoDriverChainORM($driverChain, $cachedAnnotationReader);

// Set up driver to read annotations from entities
$annotationDriver = new AnnotationDriver($cachedAnnotationReader, 'src'));
$driverChain->addDriver($annotationDriver, 'App\Entity');

// General doctrine configuration
$doctrineConfig = new Configuration;
$doctrineConfig->setProxyDir(sys_get_temp_dir()));
$doctrineConfig->setProxyNamespace('App\Entity\Proxy');
$doctrineConfig->setAutoGenerateProxyClasses(false);
$doctrineConfig->setMetadataDriverImpl($driverChain);
$doctrineConfig->setMetadataCacheImpl($cache);
$doctrineConfig->setQueryCacheImpl($cache);

// Event manager to hook extensions
$evm = new EventManager();

// Tree extension
$treeListener = new \Gedmo\Tree\TreeListener;
$treeListener->setAnnotationReader($cachedAnnotationReader);
$evm->addEventSubscriber($treeListener);

// Create EntityManager
// $config['conn'] is connection credentials
return EntityManager::create($config['conn'], $doctrineConfig, $evm);
}
}

Моя сущность это:

<?php

namespace App\Entity;

use \Doctrine\ORM\Mapping as ORM;
use \Gedmo\Mapping\Annotation as Gedmo;

/**
* Class ProductCategory2
* @package App\Entity
*
* @Gedmo\Tree(type="nested")
* @ORM\Entity(repositoryClass="Gedmo\Tree\Entity\Repository\NestedTreeRepository")
*/
class ProductCategory2
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue
*/
private $id;

/**
* @ORM\Column(type="string", length=50)
*/
private $name;

/**
* @Gedmo\TreeLeft
* @ORM\Column(type="integer")
*/
private $lft;

/**
* @Gedmo\TreeLevel
* @ORM\Column(type="integer")
*/
private $lvl;

/**
* @Gedmo\TreeRight
* @ORM\Column(type="integer")
*/
private $rgt;

/**
* @Gedmo\TreeRoot
* @ORM\Column(type="integer", nullable=true)
* @var
*/
private $root;

/**
* @Gedmo\TreeParent
* @ORM\ManyToOne(targetEntity="ProductCategory2", inversedBy="children")
*/
private $parent;
}

Мой cli-config.php настроен правильно.
Я запускаю инструмент doctrine cli для генерации стандартного кода сущностей с помощью команды:

«Vendor / bin / doctrine» orm: generate-entity src

Это отвечает мне:

Обрабатывающий объект
«Gedmo \ Translatable \ Entity \ MappedSuperclass \ AbstractPersonal \ Перевод»

Обрабатывающий объект
«Gedmo \ Translatable \ Entity \ MappedSuperclass \ AbstractTranslation»

Обработка сущности «Gedmo \ Loggable \ Entity \ MappedSuperclass \ AbstractLogEntry»

Обработка сущности «Gedmo \ Tree \ Entity \ MappedSuperclass \ AbstractClosure»

Обработка сущности «App \ Entity \ ProductCategory2»

Сущность работает нормально, но команда добавляет дополнительные файлы в мою папку src:

src\Gedmo
├───Loggable
│   └───Entity
│       └───MappedSuperclass/AbstractLogEntry.php
├───Translatable
│   └───Entity
│       └───MappedSuperclass/AbstractTranslation.php
└───Tree
└───Entity
└───MappedSuperclass/AbstractClosure.php

Если я генерирую сущности еще раз с помощью вышеупомянутой команды, я получаю ошибку.

Неустранимая ошибка PHP: невозможно повторно объявить класс
Gedmo \ Loggable \ Entity \ MappedSuperclass \ AbstractLogEntry в
\ SRC \ Gedmo \ Loggable \ Entity \ MappedSuperclass \ AbstractLogEntry.php
на линии 9

Чтобы это исправить, мне нужно удалить <ROOT>/src/Gedmo Дир раньше.

Может кто-нибудь помочь найти ошибку в конфигурации, чтобы предотвратить появление этих надоедливых дополнительных файлов?

Спасибо за помощь

1

Решение

Я добавил хак для очистки надоедливого каталога после команды doctrine generate-entity. Полный список cli-config.php приведен ниже:

<?php

use Doctrine\ORM\Tools\Console\ConsoleRunner;
use Interop\Container\ContainerInterface;
use Symfony\Component\Console\Application;
use Symfony\Component\Console\ConsoleEvents;
use Symfony\Component\Console\Event\ConsoleTerminateEvent;
use Symfony\Component\EventDispatcher\EventDispatcher;

require "vendor/autoload.php";

/** @var ContainerInterface $container */
$container = require 'app/bootstrap.php';

$dispatcher = new EventDispatcher();
// Post terminate cli command listener
$dispatcher->addListener(ConsoleEvents::TERMINATE, function(ConsoleTerminateEvent $event) {
$commandName = $event->getCommand()->getName();
switch($commandName) {
case 'orm:generate-entities':
// clear /src/Gedmo dir
\App\Utils\FilesystemUtils::removeDir('src/Gedmo');
break;
}
});

// Create doctrine cli environment via helper
$helperSet = ConsoleRunner::createHelperSet($container->get(\Doctrine\ORM\EntityManager::class));

// Wrap it into Symfony Console App and add some extra commands
$app = new Application('Doctrine Command Line Interface', \Doctrine\ORM\Version::VERSION);
$app->setDispatcher($dispatcher);
$app->setCatchExceptions(true);
$app->setHelperSet($helperSet);
// add default commands
ConsoleRunner::addCommands($app);
// here you may add extra commadts via $app->add(..)
$app->run();

Официальные документы:

  1. Как обернуть команду doctrine в консольное приложение Symfony

  2. Как внедрить систему событий в консольное приложение Symfony

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]