diff --git a/Command/AbstractCommand.php b/Command/AbstractCommand.php index 3df2948..63f97d7 100644 --- a/Command/AbstractCommand.php +++ b/Command/AbstractCommand.php @@ -45,8 +45,6 @@ abstract class AbstractCommand extends ContainerAwareCommand */ protected $output; - protected $tempSchemas = []; - use FormattingHelpers; /** @@ -96,17 +94,15 @@ abstract class AbstractCommand extends ContainerAwareCommand $finalSchemas = $this->getFinalSchemas($kernel, $this->bundle); foreach ($finalSchemas as $schema) { - /** @var Bundle $bundle */ + /** @var null|Bundle $bundle */ list($bundle, $finalSchema) = $schema; - $tempSchema = $bundle->getName().'-'.$finalSchema->getBaseName(); - $this->tempSchemas[$tempSchema] = array( - 'bundle' => $bundle->getName(), - 'basename' => $finalSchema->getBaseName(), - 'path' => $finalSchema->getPathname(), - ); + if ($bundle) { + $file = $cacheDir.DIRECTORY_SEPARATOR.'bundle-'.$bundle->getName().'-'.$finalSchema->getBaseName(); + } else { + $file = $cacheDir.DIRECTORY_SEPARATOR.'app-'.$finalSchema->getBaseName(); + } - $file = $cacheDir.DIRECTORY_SEPARATOR.$tempSchema; $filesystem->copy((string) $finalSchema, $file, true); // the package needs to be set absolute @@ -119,12 +115,18 @@ abstract class AbstractCommand extends ContainerAwareCommand // This is used to override the package resulting from namespace conversion. $database['package'] = $database['package']; } elseif (isset($database['namespace'])) { - - $database['package'] = $this->getPackageFromBundle($bundle, (string)$database['namespace']); + if ($bundle) { + $database['package'] = $this->getPackageFromBundle($bundle, (string)$database['namespace']); + } else { + $database['package'] = $this->getPackageFromApp((string)$database['namespace']); + } } else { throw new \RuntimeException( - sprintf('%s : Please define a `package` attribute or a `namespace` attribute for schema `%s`', - $bundle->getName(), $finalSchema->getBaseName()) + sprintf( + '%s : Please define a `package` attribute or a `namespace` attribute for schema `%s`', + $bundle ? $bundle->getName() : 'App', + $finalSchema->getBaseName() + ) ); } @@ -134,7 +136,6 @@ abstract class AbstractCommand extends ContainerAwareCommand if (!in_array((string) $database['name'], $connections)) { // we skip this schema because the connection name doesn't // match the input values - unset($this->tempSchemas[$tempSchema]); $filesystem->remove($file); $this->output->writeln(sprintf( 'Skipped schema %s due to database name missmatch (%s not in [%s]).', @@ -150,7 +151,11 @@ abstract class AbstractCommand extends ContainerAwareCommand if (isset($table['package'])) { $table['package'] = $table['package']; } elseif (isset($table['namespace'])) { - $table['package'] = $this->getPackageFromBundle($bundle, (string)$table['namespace']); + if ($bundle) { + $table['package'] = $this->getPackageFromBundle($bundle, (string)$table['namespace']); + } else { + $table['package'] = $this->getPackageFromApp((string)$table['namespace']); + } } else { $table['package'] = $database['package']; } @@ -175,7 +180,7 @@ abstract class AbstractCommand extends ContainerAwareCommand return $this->getSchemaLocator()->locateFromBundle($bundle); } - return $this->getSchemaLocator()->locateFromBundles($kernel->getBundles()); + return $this->getSchemaLocator()->locateFromBundlesAndConfiguration($kernel->getBundles()); } /** @@ -304,6 +309,24 @@ abstract class AbstractCommand extends ContainerAwareCommand return $this->getContainer()->get('propel.schema_locator'); } + /** + * @param string $namespace + * + * @return string + */ + protected function getPackageFromApp($namespace) + { + if ('\\' === $namespace[0]) { + $namespace = substr($namespace, 1); + } + + if (0 === stripos($namespace, 'App\\')) { + $namespace = substr($namespace, 4); + } + + return 'src.'.str_replace('\\', '.', $namespace); + } + /** * @param Bundle $bundle * @param string $namespace diff --git a/Resources/config/propel.xml b/Resources/config/propel.xml index 478b07c..383671b 100644 --- a/Resources/config/propel.xml +++ b/Resources/config/propel.xml @@ -21,6 +21,7 @@ + %propel.configuration% diff --git a/Service/SchemaLocator.php b/Service/SchemaLocator.php index 10de414..d25ff0c 100644 --- a/Service/SchemaLocator.php +++ b/Service/SchemaLocator.php @@ -17,10 +17,25 @@ use Symfony\Component\HttpKernel\Bundle\BundleInterface; class SchemaLocator { protected $fileLocator; + protected $configuration; - public function __construct(FileLocatorInterface $fileLocator) + public function __construct(FileLocatorInterface $fileLocator, array $configuration) { $this->fileLocator = $fileLocator; + $this->configuration = $configuration; + } + + public function locateFromBundlesAndConfiguration(array $bundles) + { + $schemas = $this->locateFromBundles($bundles); + + $path = $this->configuration['paths']['schemaDir'].'/schema.xml'; + if (file_exists($path)) { + $schema = new \SplFileInfo($path); + $schemas[(string) $schema] = array(null, $schema); + } + + return $schemas; } public function locateFromBundles(array $bundles)