2010-04-08 00:47:42 -03:00
< ? php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* " AS IS " AND ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT
* LIMITED TO , THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT , INDIRECT , INCIDENTAL ,
* SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT NOT
* LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE ,
* DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
* ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
*
* This software consists of voluntary contributions made by many individuals
2012-05-26 14:37:00 +02:00
* and is licensed under the MIT license . For more information , see
2010-04-08 00:47:42 -03:00
* < http :// www . doctrine - project . org >.
*/
namespace Doctrine\ORM\Tools\Console\Command ;
2012-12-14 12:49:05 +00:00
use Doctrine\ORM\Tools\Console\MetadataFilter ;
use Doctrine\ORM\Tools\DisconnectedClassMetadataFactory ;
2017-11-23 11:18:08 +01:00
use Doctrine\ORM\Tools\EntityGenerator ;
2012-10-22 01:58:31 +02:00
use Symfony\Component\Console\Command\Command ;
2017-11-23 11:18:08 +01:00
use Symfony\Component\Console\Input\InputArgument ;
use Symfony\Component\Console\Input\InputInterface ;
use Symfony\Component\Console\Input\InputOption ;
use Symfony\Component\Console\Output\OutputInterface ;
2017-11-23 11:18:21 +01:00
use Symfony\Component\Console\Style\SymfonyStyle ;
2010-04-08 00:47:42 -03:00
/**
* Command to generate entity classes and method stubs from your mapping information .
*
* @ link www . doctrine - project . org
* @ since 2.0
* @ author Benjamin Eberlei < kontakt @ beberlei . de >
* @ author Guilherme Blanco < guilhermeblanco @ hotmail . com >
* @ author Jonathan Wage < jonwage @ gmail . com >
* @ author Roman Borschel < roman @ code - factory . org >
*/
2012-10-22 01:58:31 +02:00
class GenerateEntitiesCommand extends Command
2010-04-08 00:47:42 -03:00
{
/**
2012-12-14 12:49:05 +00:00
* { @ inheritdoc }
2010-04-08 00:47:42 -03:00
*/
protected function configure ()
{
2017-11-23 11:18:08 +01:00
$this -> setName ( 'orm:generate-entities' )
-> setAliases ([ 'orm:generate:entities' ])
-> setDescription ( 'Generate entity classes and method stubs from your mapping information' )
-> addArgument ( 'dest-path' , InputArgument :: REQUIRED , 'The path to generate your entity classes.' )
-> addOption ( 'filter' , null , InputOption :: VALUE_REQUIRED | InputOption :: VALUE_IS_ARRAY , 'A string pattern used to match entities that should be processed.' )
-> addOption ( 'generate-annotations' , null , InputOption :: VALUE_OPTIONAL , 'Flag to define if generator should generate annotation metadata on entities.' , false )
-> addOption ( 'generate-methods' , null , InputOption :: VALUE_OPTIONAL , 'Flag to define if generator should generate stub methods on entities.' , true )
-> addOption ( 'regenerate-entities' , null , InputOption :: VALUE_OPTIONAL , 'Flag to define if generator should regenerate entity if it exists.' , false )
-> addOption ( 'update-entities' , null , InputOption :: VALUE_OPTIONAL , 'Flag to define if generator should only update entity if it exists.' , true )
-> addOption ( 'extend' , null , InputOption :: VALUE_REQUIRED , 'Defines a base class to be extended by generated entity classes.' )
-> addOption ( 'num-spaces' , null , InputOption :: VALUE_REQUIRED , 'Defines the number of indentation spaces' , 4 )
-> addOption ( 'no-backup' , null , InputOption :: VALUE_NONE , 'Flag to define if generator should avoid backuping existing entity file if it exists.' )
-> setHelp ( <<< EOT
2010-04-08 00:47:42 -03:00
Generate entity classes and method stubs from your mapping information .
2011-01-23 20:25:59 +01:00
2012-07-02 18:01:57 +01:00
If you use the < comment >-- update - entities </ comment > or < comment >-- regenerate - entities </ comment > flags your existing
2011-01-23 20:25:59 +01:00
code gets overwritten . The EntityGenerator will only append new code to your
file and will not delete the old code . However this approach may still be prone
to error and we suggest you use code repositories such as GIT or SVN to make
backups of your code .
It makes sense to generate the entity code if you are using entities as Data
2013-03-11 00:08:58 +00:00
Access Objects only and don ' t put much additional logic on them . If you are
2011-01-23 20:25:59 +01:00
however putting much more logic on the entities you should refrain from using
the entity - generator and code your entities manually .
< error > Important :</ error > Even if you specified Inheritance options in your
XML or YAML Mapping files the generator cannot generate the base and
child classes for you correctly , because it doesn ' t know which
class is supposed to extend which . You have to adjust the entity
code manually for inheritance to work !
2010-04-08 00:47:42 -03:00
EOT
2017-11-23 11:18:08 +01:00
);
2010-04-08 00:47:42 -03:00
}
/**
2012-12-14 12:49:05 +00:00
* { @ inheritdoc }
2010-04-08 00:47:42 -03:00
*/
2012-10-22 01:58:31 +02:00
protected function execute ( InputInterface $input , OutputInterface $output )
2010-04-08 00:47:42 -03:00
{
2017-11-23 11:18:21 +01:00
$ui = new SymfonyStyle ( $input , $output );
2010-04-08 00:47:42 -03:00
$em = $this -> getHelper ( 'em' ) -> getEntityManager ();
2011-12-19 22:56:19 +01:00
2010-11-27 20:53:26 +01:00
$cmf = new DisconnectedClassMetadataFactory ();
$cmf -> setEntityManager ( $em );
2010-04-13 18:20:41 -04:00
$metadatas = $cmf -> getAllMetadata ();
2010-04-11 09:30:01 +02:00
$metadatas = MetadataFilter :: filter ( $metadatas , $input -> getOption ( 'filter' ));
2011-12-19 22:56:19 +01:00
2010-04-08 00:47:42 -03:00
// Process destination directory
$destPath = realpath ( $input -> getArgument ( 'dest-path' ));
if ( ! file_exists ( $destPath )) {
throw new \InvalidArgumentException (
2011-08-27 13:36:18 +02:00
sprintf ( " Entities destination directory '<info>%s</info>' does not exist. " , $input -> getArgument ( 'dest-path' ))
2010-04-08 00:47:42 -03:00
);
2012-10-22 01:58:31 +02:00
}
if ( ! is_writable ( $destPath )) {
2010-04-08 00:47:42 -03:00
throw new \InvalidArgumentException (
sprintf ( " Entities destination directory '<info>%s</info>' does not have write permissions. " , $destPath )
);
}
2017-11-23 11:18:21 +01:00
if ( empty ( $metadatas )) {
$ui -> success ( 'No Metadata Classes to process.' );
return ;
}
$entityGenerator = new EntityGenerator ();
$entityGenerator -> setGenerateAnnotations ( $input -> getOption ( 'generate-annotations' ));
$entityGenerator -> setGenerateStubMethods ( $input -> getOption ( 'generate-methods' ));
$entityGenerator -> setRegenerateEntityIfExists ( $input -> getOption ( 'regenerate-entities' ));
$entityGenerator -> setUpdateEntityIfExists ( $input -> getOption ( 'update-entities' ));
$entityGenerator -> setNumSpaces ( $input -> getOption ( 'num-spaces' ));
$entityGenerator -> setBackupExisting ( ! $input -> getOption ( 'no-backup' ));
if (( $extend = $input -> getOption ( 'extend' )) !== null ) {
$entityGenerator -> setClassToExtend ( $extend );
2010-04-08 00:47:42 -03:00
}
2017-11-23 11:18:21 +01:00
foreach ( $metadatas as $metadata ) {
$ui -> text ( sprintf ( 'Processing entity "<info>%s</info>"' , $metadata -> name ));
}
// Generating Entities
$entityGenerator -> generate ( $metadatas , $destPath );
// Outputting information message
$ui -> newLine ();
$ui -> success ( sprintf ( 'Entity classes generated to "%s"' , $destPath ));
2010-04-08 00:47:42 -03:00
}
2010-08-23 08:21:41 +02:00
}