-
Notifications
You must be signed in to change notification settings - Fork 10
/
DoctrineOXMCommand.php
109 lines (95 loc) · 3.92 KB
/
DoctrineOXMCommand.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
<?php
namespace Doctrine\Bundle\OXMBundle\Command;
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Component\HttpKernel\Bundle\Bundle;
use Doctrine\OXM\Tools\Console\Helper\XmlEntityManagerHelper;
use Doctrine\OXM\Tools\DisconnectedClassMetadataFactory;
use Doctrine\OXM\Tools\XmlEntityGenerator;
/**
* Base class for Doctrine OXM console commands to extend.
*
* @author Igor Golovanov <igor.golovanov@gmail.com>
*/
abstract class DoctrineOXMCommand extends ContainerAwareCommand
{
public static function setApplicationXmlEntityManager(Application $application, $xemName)
{
$container = $application->getKernel()->getContainer();
$xemName = $xemName ? $xemName : 'default';
$xemServiceName = sprintf('doctrine.oxm.%s_xml_entity_manager', $xemName);
if (!$container->has($xemServiceName)) {
throw new \InvalidArgumentException(sprintf('Could not find Doctrine OXM XmlEntityManager named "%s"', $xemName));
}
$xem = $container->get($xemServiceName);
$helperSet = $application->getHelperSet();
$helperSet->set(new XmlEntityManagerHelper($xem), 'xem');
}
protected function getXmlEntityGenerator()
{
$xmlEntityGenerator = new XmlEntityGenerator();
$xmlEntityGenerator->setGenerateAnnotations(false);
$xmlEntityGenerator->setGenerateStubMethods(true);
$xmlEntityGenerator->setRegenerateXmlEntityIfExists(false);
$xmlEntityGenerator->setUpdateXmlEntityIfExists(true);
$xmlEntityGenerator->setNumSpaces(4);
return $xmlEntityGenerator;
}
protected function getDoctrineXmlEntityManagers()
{
$xmlEntityManagerNames = $this->getContainer()->getParameter('doctrine.oxm.xml_entity_managers');
$xmlEntityManagers = array();
foreach ($xmlEntityManagerNames as $xmlEntityManagerName) {
$xem = $this->getContainer()->get(sprintf('doctrine.oxm.%s_xml_entity_manager', $xmlEntityManagerName));
$xmlEntityManagers[] = $xem;
}
return $xmlEntityManagers;
}
protected function getBundleMetadatas(Bundle $bundle)
{
$namespace = $bundle->getNamespace();
$bundleMetadatas = array();
$xmlEntityManagers = $this->getDoctrineXmlEntityManagers();
foreach ($xmlEntityManagers as $key => $xem) {
$cmf = new DisconnectedClassMetadataFactory($xem->getConfiguration(), $xem->getEventManager());
$metadatas = $cmf->getAllMetadata();
foreach ($metadatas as $metadata) {
if (strpos($metadata->name, $namespace) === 0) {
$bundleMetadatas[$metadata->name] = $metadata;
}
}
}
return $bundleMetadatas;
}
protected function findBundle($bundleName)
{
$foundBundle = false;
foreach ($this->getApplication()->getKernel()->getBundles() as $bundle) {
/* @var $bundle Bundle */
if (strtolower($bundleName) == strtolower($bundle->getName())) {
$foundBundle = $bundle;
break;
}
}
if (!$foundBundle) {
throw new \InvalidArgumentException("No bundle " . $bundleName . " was found.");
}
return $foundBundle;
}
/**
* Transform classname to a path $foundBundle substract it to get the destination
*
* @param Bundle $bundle
* @return string
*/
protected function findBasePathForBundle($bundle)
{
$path = str_replace('\\', '/', $bundle->getNamespace());
$search = str_replace('\\', '/', $bundle->getPath());
$destination = str_replace('/'.$path, '', $search, $c);
if ($c != 1) {
throw new \RuntimeException(sprintf('Can\'t find base path for bundle (path: "%s", destination: "%s").', $path, $destination));
}
return $destination;
}
}