11
11
12
12
namespace Snowcap \ImBundle \Listener ;
13
13
14
- use Doctrine \Common \Annotations \AnnotationReader ;
15
14
use Doctrine \Common \EventSubscriber ;
16
- use Doctrine \Common \Persistence \Event \LoadClassMetadataEventArgs ;
17
- use Doctrine \ORM \EntityManager ;
18
15
use Doctrine \ORM \Event \LifecycleEventArgs ;
19
16
use Doctrine \ORM \Event \PreFlushEventArgs ;
17
+ use Metadata \MetadataFactoryInterface ;
20
18
use Snowcap \ImBundle \Manager as ImManager ;
21
-
19
+ use Symfony \Component \PropertyAccess \PropertyAccess ;
20
+ use Symfony \Component \HttpFoundation \File \UploadedFile ;
22
21
23
22
/**
24
23
* Event listener for Doctrine entities to evualuate and execute ImBundle annotations
25
24
*/
26
25
class MogrifySubscriber implements EventSubscriber
27
26
{
28
- private $ config = array ();
29
-
30
27
/**
31
- * @var string
28
+ * @var \Metadata\MetadataFactoryInterface
32
29
*/
33
- private $ rootDir ;
30
+ private $ metadataFactory ;
34
31
35
32
/**
36
33
* @var \Snowcap\ImBundle\Manager
37
34
*/
38
35
private $ imManager ;
39
36
40
37
/**
41
- * @param string $rootDir The dir to generate files
42
- * @param ImManager $imManager The ImBundle mamager instance
38
+ * @var \Symfony\Component\PropertyAccess\PropertyAccessor
43
39
*/
44
- public function __construct ($ rootDir , ImManager $ imManager )
40
+ private $ propertyAccessor ;
41
+
42
+ /**
43
+ * @param MetadataFactoryInterface $metadataFactory
44
+ * @param ImManager $imManager The ImBundle manager instance
45
+ */
46
+ public function __construct (MetadataFactoryInterface $ metadataFactory , ImManager $ imManager )
45
47
{
46
- $ this ->rootDir = $ rootDir ;
48
+ $ this ->metadataFactory = $ metadataFactory ;
47
49
$ this ->imManager = $ imManager ;
50
+ $ this ->propertyAccessor = PropertyAccess::createPropertyAccessor ();
48
51
}
49
52
50
53
/**
@@ -54,50 +57,20 @@ public function __construct($rootDir, ImManager $imManager)
54
57
*/
55
58
public function getSubscribedEvents ()
56
59
{
57
- return array ('loadClassMetadata ' , 'prePersist ' , 'preFlush ' );
58
- }
59
-
60
- /**
61
- * @param LoadClassMetadataEventArgs $eventArgs
62
- */
63
- public function loadClassMetadata (LoadClassMetadataEventArgs $ eventArgs )
64
- {
65
- $ reader = new AnnotationReader ();
66
- $ meta = $ eventArgs ->getClassMetadata ();
67
- $ reflexionClass = $ meta ->getReflectionClass ();
68
- if (null !== $ reflexionClass ) {
69
- foreach ($ reflexionClass ->getProperties () as $ property ) {
70
- if ($ meta ->isMappedSuperclass && !$ property ->isPrivate () ||
71
- $ meta ->isInheritedField ($ property ->name ) ||
72
- isset ($ meta ->associationMappings [$ property ->name ]['inherited ' ])
73
- ) {
74
- continue ;
75
- }
76
- /** @var $annotation \Snowcap\ImBundle\Doctrine\Mapping\Mogrify */
77
- if ($ annotation = $ reader ->getPropertyAnnotation ($ property , 'Snowcap \\ImBundle \\Doctrine \\Mapping \\Mogrify ' )) {
78
- $ field = $ property ->getName ();
79
- $ this ->config [$ meta ->getTableName ()]['fields ' ][$ field ] = array (
80
- 'property ' => $ property ,
81
- 'params ' => $ annotation ->params ,
82
- );
83
- }
84
- }
85
- }
60
+ return array ('prePersist ' , 'preFlush ' );
86
61
}
87
62
88
63
/**
89
64
* @param PreFlushEventArgs $ea
90
65
*/
91
66
public function preFlush (PreFlushEventArgs $ ea )
92
67
{
93
- $ entityManager = $ ea ->getEntityManager ();
94
-
95
- $ unitOfWork = $ entityManager ->getUnitOfWork ();
96
-
68
+ $ unitOfWork = $ ea ->getEntityManager ()->getUnitOfWork ();
97
69
$ entityMaps = $ unitOfWork ->getIdentityMap ();
70
+
98
71
foreach ($ entityMaps as $ entities ) {
99
72
foreach ($ entities as $ entity ) {
100
- foreach ($ this ->getFiles ( $ entity , $ ea -> getEntityManager ()) as $ file ) {
73
+ foreach ($ this ->metadataFactory -> getMetadataForClass ( get_class ( $ entity ))-> propertyMetadata as $ file ) {
101
74
$ this ->mogrify ($ entity , $ file );
102
75
}
103
76
}
@@ -110,43 +83,20 @@ public function preFlush(PreFlushEventArgs $ea)
110
83
public function prePersist (LifecycleEventArgs $ ea )
111
84
{
112
85
$ entity = $ ea ->getEntity ();
113
- foreach ($ this ->getFiles ( $ entity , $ ea -> getEntityManager ()) as $ file ) {
86
+ foreach ($ this ->metadataFactory -> getMetadataForClass ( get_class ( $ entity ))-> propertyMetadata as $ file ) {
114
87
$ this ->mogrify ($ entity , $ file );
115
88
}
116
89
}
117
90
118
- /**
119
- * @param $entity
120
- * @param EntityManager $entityManager
121
- * @return array
122
- */
123
- private function getFiles ($ entity , EntityManager $ entityManager )
124
- {
125
- $ classMetaData = $ entityManager ->getClassMetaData (get_class ($ entity ));
126
- $ tableName = $ classMetaData ->getTableName ();
127
-
128
- if (array_key_exists ($ tableName , $ this ->config )) {
129
- return $ this ->config [$ tableName ]['fields ' ];
130
- } else {
131
- return array ();
132
- }
133
- }
134
-
135
91
/**
136
92
* @param $entity
137
93
* @param $file
138
94
*/
139
95
private function mogrify ($ entity , $ file )
140
96
{
141
- $ propertyName = $ file ['property ' ]->name ;
142
-
143
- $ getter = 'get ' . ucFirst ($ propertyName );
144
- if (method_exists ($ entity , $ getter )) {
145
- /** @var $uploadedFile \Symfony\Component\HttpFoundation\File\UploadedFile */
146
- $ uploadedFile = $ entity ->$ getter ();
147
- if (null !== $ uploadedFile ) {
148
- $ this ->imManager ->mogrify ($ file ['params ' ], $ uploadedFile ->getPathName ());
149
- }
97
+ $ uploadedFile = $ this ->propertyAccessor ->getValue ($ entity , $ file ->name );
98
+ if ($ uploadedFile instanceof UploadedFile) {
99
+ $ this ->imManager ->mogrify ($ file ->params , $ uploadedFile ->getPathName ());
150
100
}
151
101
}
152
- }
102
+ }
0 commit comments