1 | <?php |
||
14 | class WorkerCompilerPass implements CompilerPassInterface |
||
15 | { |
||
16 | 3 | public function process(ContainerBuilder $container) |
|
44 | |||
45 | 3 | protected function setupAlias(ContainerBuilder $container, $defaultManagerType, $type) |
|
46 | { |
||
47 | 3 | $definitionName = 'dtc_queue.'.$type.'.'.$defaultManagerType; |
|
48 | 3 | if (!$container->hasDefinition($definitionName) && !$container->hasAlias($definitionName)) { |
|
49 | throw new \Exception("No job manager found for dtc_queue.'.$type.'.$defaultManagerType"); |
||
50 | } |
||
51 | 3 | if ($container->hasDefinition($definitionName)) { |
|
52 | 3 | $alias = new Alias('dtc_queue.'.$type.'.'.$defaultManagerType); |
|
53 | 3 | $container->setAlias('dtc_queue.'.$type, $alias); |
|
54 | 3 | } else { |
|
55 | $container->setAlias('dtc_queue.'.$type, $container->getAlias($definitionName)); |
||
56 | } |
||
57 | 3 | } |
|
58 | |||
59 | 3 | protected function setupAliases(ContainerBuilder $container) |
|
66 | |||
67 | /** |
||
68 | * @param ContainerBuilder $container |
||
69 | * @param Reference[] $jobManagerRef |
||
70 | * @param string $jobClass |
||
71 | */ |
||
72 | 3 | protected function setupTaggedServices(ContainerBuilder $container, Definition $definition, array $jobManagerRef, $jobClass) |
|
73 | { |
||
74 | // Add each worker to workerManager, make sure each worker has instance to work |
||
75 | 3 | foreach ($container->findTaggedServiceIds('dtc_queue.worker') as $id => $attributes) { |
|
76 | 2 | $worker = $container->getDefinition($id); |
|
77 | 2 | $class = $container->getDefinition($id)->getClass(); |
|
78 | |||
79 | 2 | $refClass = new \ReflectionClass($class); |
|
80 | 2 | $workerClass = 'Dtc\QueueBundle\Model\Worker'; |
|
81 | 2 | if (!$refClass->isSubclassOf($workerClass)) { |
|
82 | 1 | throw new \InvalidArgumentException(sprintf('Service "%s" must extend class "%s".', $id, $workerClass)); |
|
83 | } |
||
84 | |||
85 | // Give each worker access to job manager |
||
86 | 1 | $worker->addMethodCall('setJobManager', $jobManagerRef); |
|
87 | 1 | $worker->addMethodCall('setJobClass', array($jobClass)); |
|
88 | |||
89 | 1 | $definition->addMethodCall('addWorker', array(new Reference($id))); |
|
90 | 2 | } |
|
91 | 2 | } |
|
92 | |||
93 | 2 | protected function setupDoctrineManagers(ContainerBuilder $container) |
|
94 | { |
||
95 | 2 | $documentManager = $container->getParameter('dtc_queue.document_manager'); |
|
96 | |||
97 | 2 | $odmManager = "doctrine_mongodb.odm.{$documentManager}_document_manager"; |
|
98 | 2 | if ($container->has($odmManager)) { |
|
99 | $container->setAlias('dtc_queue.document_manager', $odmManager); |
||
100 | } |
||
101 | |||
102 | 2 | $entityManager = $container->getParameter('dtc_queue.entity_manager'); |
|
103 | |||
104 | 2 | $ormManager = "doctrine.orm.{$entityManager}_entity_manager"; |
|
105 | 2 | if ($container->has($ormManager)) { |
|
106 | $container->setAlias('dtc_queue.entity_manager', $ormManager); |
||
107 | } |
||
108 | 2 | } |
|
109 | |||
110 | /** |
||
111 | * Determines the job class based on the queue manager type. |
||
112 | * |
||
113 | * @param ContainerBuilder $container |
||
114 | * |
||
115 | * @return mixed|string |
||
116 | * |
||
117 | * @throws \Exception |
||
118 | */ |
||
119 | 3 | protected function getJobClass(ContainerBuilder $container) |
|
120 | { |
||
121 | 3 | $jobClass = $container->getParameter('dtc_queue.class_job'); |
|
122 | 3 | if (!$jobClass) { |
|
123 | 3 | switch ($defaultType = $container->getParameter('dtc_queue.default_manager')) { |
|
124 | 3 | case 'mongodb': // deprecated remove in 3.0 |
|
125 | 3 | case 'odm': |
|
126 | 3 | $jobClass = 'Dtc\\QueueBundle\\Document\\Job'; |
|
127 | 3 | break; |
|
128 | case 'beanstalkd': |
||
129 | $jobClass = 'Dtc\\QueueBundle\\Beanstalkd\\Job'; |
||
130 | break; |
||
131 | case 'rabbit_mq': |
||
132 | $jobClass = 'Dtc\\QueueBundle\\RabbitMQ\\Job'; |
||
133 | break; |
||
134 | case 'orm': |
||
135 | $jobClass = 'Dtc\\QueueBundle\\Entity\\Job'; |
||
136 | break; |
||
137 | default: |
||
138 | throw new \Exception('Unknown default_manager type '.$defaultType.' - please specify a Job class in the \'class\' configuration parameter'); |
||
139 | 3 | } |
|
140 | 3 | } |
|
141 | |||
142 | 3 | $this->testClass($jobClass, Job::class); |
|
143 | |||
144 | 3 | return $jobClass; |
|
145 | } |
||
146 | |||
147 | 3 | protected function getClass(ContainerBuilder $container, $type, $className, $baseClass) |
|
148 | { |
||
149 | 3 | $runClass = $container->hasParameter('dtc_queue.class_'.$type) ? $container->getParameter('dtc_queue.class_'.$type) : null; |
|
150 | 3 | if (!$runClass) { |
|
151 | 3 | switch ($container->getParameter('dtc_queue.default_manager')) { |
|
152 | 3 | case 'mongodb': // deprecated remove in 3.0 |
|
153 | 3 | case 'odm': |
|
154 | 3 | $runClass = 'Dtc\\QueueBundle\\Document\\'.$className; |
|
155 | 3 | break; |
|
156 | case 'orm': |
||
157 | $runClass = 'Dtc\\QueueBundle\\Entity\\'.$className; |
||
158 | break; |
||
159 | default: |
||
160 | $runClass = $baseClass; |
||
161 | 3 | } |
|
162 | 3 | } |
|
163 | |||
164 | 3 | $this->testClass($runClass, $baseClass); |
|
165 | |||
166 | 3 | return $runClass; |
|
167 | } |
||
168 | |||
169 | /** |
||
170 | * @throws \Exception |
||
171 | */ |
||
172 | 3 | protected function testClass($className, $parent) |
|
183 | |||
184 | /** |
||
185 | * Determines the job class based on the queue manager type. |
||
186 | * |
||
187 | * @param ContainerBuilder $container |
||
188 | * |
||
189 | * @return mixed|string |
||
190 | * |
||
191 | * @throws \Exception |
||
192 | */ |
||
193 | 3 | protected function getJobClassArchive(ContainerBuilder $container) |
|
213 | } |
||
214 |