2
2
3
3
namespace Enqueue \Symfony ;
4
4
5
+ use Enqueue \AmqpExt \AmqpConnectionFactory ;
6
+ use Enqueue \AmqpExt \Symfony \AmqpTransportFactory ;
7
+ use Enqueue \Fs \FsConnectionFactory ;
8
+ use Enqueue \Fs \Symfony \FsTransportFactory ;
9
+ use Enqueue \Null \NullConnectionFactory ;
10
+ use Enqueue \Null \Symfony \NullTransportFactory ;
5
11
use Symfony \Component \Config \Definition \Builder \ArrayNodeDefinition ;
6
12
use Symfony \Component \DependencyInjection \ContainerBuilder ;
13
+ use function Enqueue \dsn_to_connection_factory ;
7
14
8
15
class DefaultTransportFactory implements TransportFactoryInterface
9
16
{
@@ -29,18 +36,30 @@ public function addConfiguration(ArrayNodeDefinition $builder)
29
36
->beforeNormalization ()
30
37
->ifString ()
31
38
->then (function ($ v ) {
32
- return ['alias ' => $ v ];
39
+ if (false === strpos ($ v , ':// ' )) {
40
+ return ['alias ' => $ v ];
41
+ }
42
+
43
+ return ['dsn ' => $ v ];
33
44
})
34
45
->end ()
35
46
->children ()
36
- ->scalarNode ('alias ' )->isRequired ()->cannotBeEmpty ()->end ()
37
- ;
47
+ ->scalarNode ('alias ' )->cannotBeEmpty ()->end ()
48
+ ->scalarNode ('dsn ' )->cannotBeEmpty ()->end ()
49
+ ;
38
50
}
39
51
40
52
public function createConnectionFactory (ContainerBuilder $ container , array $ config )
41
53
{
54
+ if (isset ($ config ['alias ' ])) {
55
+ $ aliasId = sprintf ('enqueue.transport.%s.connection_factory ' , $ config ['alias ' ]);
56
+ } elseif (isset ($ config ['dsn ' ])) {
57
+ $ aliasId = $ this ->findFactory ($ config ['dsn ' ])->createConnectionFactory ($ container , $ config );
58
+ } else {
59
+ throw new \LogicException ('Either dsn or alias option must be set. ' );
60
+ }
61
+
42
62
$ factoryId = sprintf ('enqueue.transport.%s.connection_factory ' , $ this ->getName ());
43
- $ aliasId = sprintf ('enqueue.transport.%s.connection_factory ' , $ config ['alias ' ]);
44
63
45
64
$ container ->setAlias ($ factoryId , $ aliasId );
46
65
$ container ->setAlias ('enqueue.transport.connection_factory ' , $ factoryId );
@@ -53,8 +72,15 @@ public function createConnectionFactory(ContainerBuilder $container, array $conf
53
72
*/
54
73
public function createContext (ContainerBuilder $ container , array $ config )
55
74
{
75
+ if (isset ($ config ['alias ' ])) {
76
+ $ aliasId = sprintf ('enqueue.transport.%s.context ' , $ config ['alias ' ]);
77
+ } elseif (isset ($ config ['dsn ' ])) {
78
+ $ aliasId = $ this ->findFactory ($ config ['dsn ' ])->createContext ($ container , $ config );
79
+ } else {
80
+ throw new \LogicException ('Either dsn or alias option must be set. ' );
81
+ }
82
+
56
83
$ contextId = sprintf ('enqueue.transport.%s.context ' , $ this ->getName ());
57
- $ aliasId = sprintf ('enqueue.transport.%s.context ' , $ config ['alias ' ]);
58
84
59
85
$ container ->setAlias ($ contextId , $ aliasId );
60
86
$ container ->setAlias ('enqueue.transport.context ' , $ contextId );
@@ -67,8 +93,15 @@ public function createContext(ContainerBuilder $container, array $config)
67
93
*/
68
94
public function createDriver (ContainerBuilder $ container , array $ config )
69
95
{
96
+ if (isset ($ config ['alias ' ])) {
97
+ $ aliasId = sprintf ('enqueue.client.%s.driver ' , $ config ['alias ' ]);
98
+ } elseif (isset ($ config ['dsn ' ])) {
99
+ $ aliasId = $ this ->findFactory ($ config ['dsn ' ])->createDriver ($ container , $ config );
100
+ } else {
101
+ throw new \LogicException ('Either dsn or alias option must be set. ' );
102
+ }
103
+
70
104
$ driverId = sprintf ('enqueue.client.%s.driver ' , $ this ->getName ());
71
- $ aliasId = sprintf ('enqueue.client.%s.driver ' , $ config ['alias ' ]);
72
105
73
106
$ container ->setAlias ($ driverId , $ aliasId );
74
107
$ container ->setAlias ('enqueue.client.driver ' , $ driverId );
@@ -83,4 +116,33 @@ public function getName()
83
116
{
84
117
return $ this ->name ;
85
118
}
119
+
120
+ /**
121
+ * @param string
122
+ * @param mixed $dsn
123
+ *
124
+ * @return TransportFactoryInterface
125
+ */
126
+ private function findFactory ($ dsn )
127
+ {
128
+ $ connectionFactory = dsn_to_connection_factory ($ dsn );
129
+
130
+ if ($ connectionFactory instanceof AmqpConnectionFactory) {
131
+ return new AmqpTransportFactory ('default_amqp ' );
132
+ }
133
+
134
+ if ($ connectionFactory instanceof FsConnectionFactory) {
135
+ return new FsTransportFactory ('default_fs ' );
136
+ }
137
+
138
+ if ($ connectionFactory instanceof NullConnectionFactory) {
139
+ return new NullTransportFactory ('default_null ' );
140
+ }
141
+
142
+ throw new \LogicException (sprintf (
143
+ 'There is no supported transport factory for the connection factory "%s" created from DSN "%s" ' ,
144
+ get_class ($ connectionFactory ),
145
+ $ dsn
146
+ ));
147
+ }
86
148
}
0 commit comments