Source of file MakeEntity.php

Size: 4,731 Bytes - Last Modified: 2023-11-16T22:56:03+01:00

/home/websites/teicee/packagist/site/phpdoc/conf/../vendor/teicee/make-bundle/src/Maker/MakeEntity.php

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
<?php
namespace TIC\MakeBundle\Maker;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputOption;
use Doctrine\Common\Annotations\Annotation;

use Symfony\Bundle\MakerBundle\Maker\MakeEntity as OriginalMaker;
use Symfony\Bundle\MakerBundle\Util\ClassNameDetails;
use Symfony\Bundle\MakerBundle\Exception\RuntimeCommandException;
use Symfony\Bundle\MakerBundle\Doctrine\DoctrineHelper;
#use Symfony\Bundle\MakerBundle\Doctrine\EntityClassGenerator;
use TIC\MakeBundle\Doctrine\EntityClassGenerator;

/**
 *
 */
final class MakeEntity extends BaseMaker
{
	private $doctrineHelper;
	private $entityClassGenerator;
	private $originalEntityMaker;


	public function __construct(DoctrineHelper $doctrineHelper, EntityClassGenerator $entityClassGenerator, OriginalMaker $originalEntityMaker)
	{
		parent::__construct();
		$this->doctrineHelper       = $doctrineHelper;
		$this->entityClassGenerator = $entityClassGenerator;
		$this->originalEntityMaker  = $originalEntityMaker;
	}

	protected $dependencies = array(
		['class' => Annotation::class, 'value' => 'doctrine/annotations'],
	);

	/**
	 * Configure the command: set description, input arguments, options, etc.
	 */
	protected function ticConfigure(Command $command)
	{
		$command
			->addArgument('name',      InputArgument::OPTIONAL, "Nom, chemin ou classname de l'entité")
			->addOption('regenerate',  null, InputOption::VALUE_NONE, "Regénération des méthodes (e.g. getter/setter) des champs")
			->addOption('overwrite',   null, InputOption::VALUE_NONE, "Regénération des méthodes existantes (sinon seulement manquantes")
			->addOption('broadcast',    'b', InputOption::VALUE_NONE, "(inutilisé)")
			->addOption('api-resource', 'a', InputOption::VALUE_NONE, "(inutilisé)")
		;
	}

	/**
	 * Called after normal code generation: allows you to do anything.
	 */
	protected function ticGenerate(InputInterface $input)
	{
		$inputName = $this->fixClassName($input->getArgument('name'), true);
		$this->io->title("Construction de l'entité : '$inputName'");
		
		// détermination des variables à utiliser
		$variables = $this->getVariablesFromName($inputName, "Entity");
		$tableBase   = str_replace("\\", "", str_replace("\\Entity\\", "", $variables['item_class']));
		$variables['table_name'] = $this->doctrineHelper->getPotentialTableName($tableBase);
		$entityDetails = $this->generator->createClassNameDetails($inputName, "Entity\\");
		$repoDetails   = $this->generator->createClassNameDetails($entityDetails->getRelativeName(), "Repository\\", "Repository");
		
		// affichage des valeurs des variables
		$this->io->section("Paramètres utilisés :");
		$this->io->table(["Variable","Valeur"], self::hash2list($variables));
		
		// vérifications
		$classExists = $repoExists = false;
		try {
			$classExists = class_exists($variables['item_class']);
			$repoExists  = class_exists($repoDetails->getFullName());
		} catch (\ErrorException $e) {
		}
		if ($entityDetails->getFullName() !== $variables['item_class'])
			throw new RuntimeCommandException("Le namespace de l'entité ne correspond pas à ce qui est attendu : " . $entityDetails->getFullName());
		if ($classExists && !$this->doctrineHelper->isClassAnnotated($variables['item_class']))
			throw new RuntimeCommandException("L'entité doit utiliser les annotations pour son mapping ORM");
		if ($this->test) return;
		if (! $this->confirm("Lancer la construction ?")) return;
		
		// construction (ou chargement) Entity et Repository
		$newPaths = array();
		if (! $classExists) {
			$this->io->section("Construction de l'entité...");
			$entityPath = $this->entityClassGenerator->generateEntityClass($entityDetails, $variables['table_name']);
			$newPaths[] = $entityPath;
		} else $this->io->warning("Entité déjà existante");
		if (! $repoExists) {
			$this->io->section("Construction du repository...");
			$repoPath   = $this->entityClassGenerator->generateRepositoryClass($repoDetails, $entityDetails);
			$newPaths[] = $repoPath;
		}
		if (! empty($newPaths)) $this->generator->writeChanges();
		$this->io->listing( $newPaths );
		
		// appel au maker d'origine pour la suite...
		if ($classExists) $entityPath = (new \ReflectionClass($entityDetails->getFullName()))->getFileName();
		$input->setArgument('name', $variables['item_name']);
		$input->setOption('api-resource', false);
		$input->setOption('broadcast',    false);
		if (! $classExists) require($entityPath);
		self::indentFile($entityPath, true);
		$this->originalEntityMaker->generate($input, $this->io, $this->generator);
		self::indentFile($entityPath, false);
		
		return true;
	}

}