├── .gitignore
├── Procfile
├── composer.json
├── app.json
├── app.php
├── README.md
├── www
└── index.php
├── index.twig
├── bin
└── worker.php
└── composer.lock
/.gitignore:
--------------------------------------------------------------------------------
1 | /vendor/
2 |
--------------------------------------------------------------------------------
/Procfile:
--------------------------------------------------------------------------------
1 | web: vendor/bin/heroku-php-apache2 www/
2 | worker: php bin/worker.php
3 |
--------------------------------------------------------------------------------
/composer.json:
--------------------------------------------------------------------------------
1 | {
2 | "require": {
3 | "silex/silex": "^1.3",
4 | "ebichan/silex-amqp-provider": "^1.0",
5 | "predis/service-provider": "^1.0",
6 | "monolog/monolog": "^1.16",
7 | "symfony/form": "^2.7",
8 | "symfony/security-csrf": "^2.7",
9 | "symfony/twig-bridge": "^2.7",
10 | "symfony/translation": "^2.7",
11 | "rebangm/silex-guzzlehttp-provider": "^1.2"
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/app.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "PHP Background Worker Demo",
3 | "description": "An application showing how to use RabbitMQ to handle background jobs using worker processes in PHP on Heroku.",
4 | "keywords": ["rabbitmq", "queue", "worker", "queues", "php", "demo", "example", "background", "processing"],
5 | "repository": "https://github.com/heroku-examples/php-worker-demo",
6 | "addons": [
7 | "heroku-redis",
8 | "cloudamqp",
9 | "bomberman"
10 | ]
11 | }
--------------------------------------------------------------------------------
/app.php:
--------------------------------------------------------------------------------
1 | register(new Silex\Provider\MonologServiceProvider(), [
9 | 'monolog.logfile' => 'php://stderr',
10 | 'monolog.level' => constant('Monolog\\Logger::'.strtoupper(getenv('LOG_LEVEL')?:'NOTICE')),
11 | ]);
12 |
13 | // RabbitMQ connection
14 | $rabbitmq = parse_url(getenv('CLOUDAMQP_URL'));
15 | $app->register(new Amqp\Silex\Provider\AmqpServiceProvider, [
16 | 'amqp.connections' => [
17 | 'default' => [
18 | 'host' => $rabbitmq['host'],
19 | 'port' => isset($rabbitmq['port']) ? $rabbitmq['port'] : 5672,
20 | 'username' => $rabbitmq['user'],
21 | 'password' => $rabbitmq['pass'],
22 | 'vhost' => substr($rabbitmq['path'], 1) ?: '/',
23 | ],
24 | ],
25 | ]);
26 |
27 | // Redis database
28 | $app->register(new Predis\Silex\ClientServiceProvider(), [
29 | 'predis.parameters' => getenv('REDIS_URL'),
30 | ]);
31 |
32 | // return app object for use by other files
33 | return $app;
34 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # PHP Background Worker Demo Application for Heroku
2 |
3 | This application demonstrates the implementation of a very simple worker process using RabbitMQ on Heroku. The application will accept text through a form, pass it to an external service to remove any profanity, and then store the "censored" message in a database for displaying on the page. Because the performance of the call to the external "censoring" service depends on the performance of that API, this task will be carried out asynchronously in the background by a worker process to ensure users never experience slow response times on the site itself.
4 |
5 | The moving parts:
6 |
7 | * `www/index.php` to serve a front-end using Silex that allows submission of new text and displays existing submissions;
8 | * `bin/worker.php` to process jobs: removing profanity from submitted text using [Bomberman](https://bomberman.ikayzo.com)'s API;
9 | * RabbitMQ to queue these jobs;
10 | * Redis to store results.
11 |
12 | For a full explanation of the individual components and more background information, please check out the [PHP Workers](https://devcenter.heroku.com/articles/php-workers) article on Heroku Dev Center.
13 |
14 | To deploy this application to Heroku right now, you can use this button:
15 |
16 | [](https://heroku.com/deploy)
--------------------------------------------------------------------------------
/www/index.php:
--------------------------------------------------------------------------------
1 | register(new Silex\Provider\TranslationServiceProvider(), [
8 | 'translator.messages' => [],
9 | ]);
10 | $app->register(new Silex\Provider\FormServiceProvider());
11 | $app->register(new Silex\Provider\TwigServiceProvider(), [
12 | 'twig.path' => __DIR__.'/..',
13 | 'twig.form.templates' => ['bootstrap_3_layout.html.twig'],
14 | ]);
15 |
16 | $app->match('/', function (Symfony\Component\HttpFoundation\Request $request) use ($app) {
17 | $opinions = $app['predis']->lrange('opinions', 0, 10);
18 |
19 | $form = $app['form.factory']->createBuilder('form')
20 | ->add('opinion', 'textarea', [
21 | 'label' => 'Your opinion',
22 | 'attr' => ['rows' => count($opinions)*2],
23 | ])
24 | ->getForm();
25 | $form->handleRequest($request);
26 | $submitted = false;
27 | if ($form->isValid()) {
28 | $data = $form->getData();
29 |
30 | $connection = $app['amqp']['default'];
31 | $channel = $connection->channel();
32 | $channel->queue_declare('task_queue', false, true, false, false);
33 |
34 | $msg = new AMQPMessage($data['opinion'], ['delivery_mode' => 2]);
35 | $channel->basic_publish($msg, '', 'task_queue');
36 |
37 | $channel->close();
38 | $connection->close();
39 |
40 | $submitted = true;
41 | }
42 |
43 | return $app['twig']->render('index.twig', [
44 | 'form' => $form->createView(),
45 | 'submitted' => $submitted,
46 | 'opinions' => $opinions
47 | ]);
48 | });
49 |
50 | $app->run();
51 |
--------------------------------------------------------------------------------
/index.twig:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | PHP Background Job Sample Application
8 |
9 |
10 |
11 |
12 |
13 | Everybody gets to have an opinion around here!
14 |
15 |
16 |
Tell us what you think!
17 | {% if submitted %}
18 |
Thank you! Your submission will be published after we checked it for offensive language. Please
refresh this page in a few seconds!
19 | {% else %}
20 |
We'll run your submission through a profanity filter before publishing it to prevent inappropriate language.
21 |
25 | {% endif %}
26 |
27 |
28 |
Previous submissions
29 | {% for opinion in opinions %}
30 |
31 | {{ opinion|nl2br }}
32 |
33 | {% endfor %}
34 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/bin/worker.php:
--------------------------------------------------------------------------------
1 | register(new SilexGuzzle\GuzzleServiceProvider(), [
6 | 'guzzle.base_uri' => 'https://bomberman-prod.herokuapp.com/api/v1/profanity/',
7 | 'guzzle.timeout' => 5,
8 | 'guzzle.request_options' => [
9 | 'headers' => [
10 | 'Authorization' => 'Token token='.getenv('BOMBERMAN_API_KEY'),
11 | 'Accept' => 'application/json',
12 | ],
13 | ],
14 | ]);
15 |
16 | $connection = $app['amqp']['default'];
17 | $channel = $connection->channel();
18 |
19 | $channel->queue_declare('task_queue', false, true, false, false);
20 |
21 | $app['monolog']->info('Worker ready for messages.');
22 |
23 | $callback = function($msg) use($app) {
24 | $app['monolog']->debug('New task received for censoring message: ' . $msg->body);
25 |
26 | try {
27 | // call the "censor" API and pass it the text to clean up
28 | $result = $app['guzzle']->get('censor', ['query' => ['corpus' => $msg->body]]);
29 | $result = json_decode($result->getBody());
30 | if($result) {
31 | $app['monolog']->debug('Censored message result is: ' . $result->censored_text);
32 | // store in Redis
33 | $app['predis']->lpush('opinions', $result->censored_text);
34 | // mark as delivered in RabbitMQ
35 | $msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
36 | } else {
37 | $app['monolog']->warning('Failed to decode JSON, will retry later');
38 | }
39 | } catch(Exception $e) {
40 | $app['monolog']->warning('Failed to call API, will retry later');
41 | }
42 | };
43 |
44 | $channel->basic_qos(null, 1, null);
45 | $channel->basic_consume('task_queue', '', false, false, false, false, $callback);
46 |
47 | // loop over incoming messages
48 | while(count($channel->callbacks)) {
49 | $channel->wait();
50 | }
51 |
52 | $channel->close();
53 | $connection->close();
54 |
--------------------------------------------------------------------------------
/composer.lock:
--------------------------------------------------------------------------------
1 | {
2 | "_readme": [
3 | "This file locks the dependencies of your project to a known state",
4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
5 | "This file is @generated automatically"
6 | ],
7 | "hash": "210cdab634bd1adf30967308d63dc9f4",
8 | "packages": [
9 | {
10 | "name": "ebichan/silex-amqp-provider",
11 | "version": "1.0.0",
12 | "source": {
13 | "type": "git",
14 | "url": "https://github.com/jonathan-sousa/silex-amqp-provider.git",
15 | "reference": "44ed2e7f39c80287c7c149806d9c89a4be8d6b40"
16 | },
17 | "dist": {
18 | "type": "zip",
19 | "url": "https://api.github.com/repos/jonathan-sousa/silex-amqp-provider/zipball/44ed2e7f39c80287c7c149806d9c89a4be8d6b40",
20 | "reference": "44ed2e7f39c80287c7c149806d9c89a4be8d6b40",
21 | "shasum": ""
22 | },
23 | "require": {
24 | "pimple/pimple": "*",
25 | "silex/silex": "1.*",
26 | "videlalvaro/php-amqplib": "2.5.*"
27 | },
28 | "type": "library",
29 | "autoload": {
30 | "psr-0": {
31 | "Amqp\\Silex": "src"
32 | }
33 | },
34 | "notification-url": "https://packagist.org/downloads/",
35 | "license": [
36 | "MIT"
37 | ],
38 | "authors": [
39 | {
40 | "name": "Jonathan Sousa",
41 | "email": "sousa.jonathan@gmail.com"
42 | }
43 | ],
44 | "description": "AMQP service provider for the Silex framework.",
45 | "homepage": "https://github.com/Ebichan/silex-amqp-provider",
46 | "keywords": [
47 | "AMQP",
48 | "queue",
49 | "rabbitmq",
50 | "silex"
51 | ],
52 | "time": "2015-03-09 11:12:08"
53 | },
54 | {
55 | "name": "guzzlehttp/guzzle",
56 | "version": "6.0.2",
57 | "source": {
58 | "type": "git",
59 | "url": "https://github.com/guzzle/guzzle.git",
60 | "reference": "a8dfeff00eb84616a17fea7a4d72af35e750410f"
61 | },
62 | "dist": {
63 | "type": "zip",
64 | "url": "https://api.github.com/repos/guzzle/guzzle/zipball/a8dfeff00eb84616a17fea7a4d72af35e750410f",
65 | "reference": "a8dfeff00eb84616a17fea7a4d72af35e750410f",
66 | "shasum": ""
67 | },
68 | "require": {
69 | "guzzlehttp/promises": "~1.0",
70 | "guzzlehttp/psr7": "~1.1",
71 | "php": ">=5.5.0"
72 | },
73 | "require-dev": {
74 | "ext-curl": "*",
75 | "phpunit/phpunit": "~4.0",
76 | "psr/log": "~1.0"
77 | },
78 | "type": "library",
79 | "extra": {
80 | "branch-alias": {
81 | "dev-master": "6.0-dev"
82 | }
83 | },
84 | "autoload": {
85 | "files": [
86 | "src/functions_include.php"
87 | ],
88 | "psr-4": {
89 | "GuzzleHttp\\": "src/"
90 | }
91 | },
92 | "notification-url": "https://packagist.org/downloads/",
93 | "license": [
94 | "MIT"
95 | ],
96 | "authors": [
97 | {
98 | "name": "Michael Dowling",
99 | "email": "mtdowling@gmail.com",
100 | "homepage": "https://github.com/mtdowling"
101 | }
102 | ],
103 | "description": "Guzzle is a PHP HTTP client library",
104 | "homepage": "http://guzzlephp.org/",
105 | "keywords": [
106 | "client",
107 | "curl",
108 | "framework",
109 | "http",
110 | "http client",
111 | "rest",
112 | "web service"
113 | ],
114 | "time": "2015-07-04 20:09:24"
115 | },
116 | {
117 | "name": "guzzlehttp/promises",
118 | "version": "1.0.2",
119 | "source": {
120 | "type": "git",
121 | "url": "https://github.com/guzzle/promises.git",
122 | "reference": "97fe7210def29451ec74923b27e552238defd75a"
123 | },
124 | "dist": {
125 | "type": "zip",
126 | "url": "https://api.github.com/repos/guzzle/promises/zipball/97fe7210def29451ec74923b27e552238defd75a",
127 | "reference": "97fe7210def29451ec74923b27e552238defd75a",
128 | "shasum": ""
129 | },
130 | "require": {
131 | "php": ">=5.5.0"
132 | },
133 | "require-dev": {
134 | "phpunit/phpunit": "~4.0"
135 | },
136 | "type": "library",
137 | "extra": {
138 | "branch-alias": {
139 | "dev-master": "1.0-dev"
140 | }
141 | },
142 | "autoload": {
143 | "psr-4": {
144 | "GuzzleHttp\\Promise\\": "src/"
145 | },
146 | "files": [
147 | "src/functions_include.php"
148 | ]
149 | },
150 | "notification-url": "https://packagist.org/downloads/",
151 | "license": [
152 | "MIT"
153 | ],
154 | "authors": [
155 | {
156 | "name": "Michael Dowling",
157 | "email": "mtdowling@gmail.com",
158 | "homepage": "https://github.com/mtdowling"
159 | }
160 | ],
161 | "description": "Guzzle promises library",
162 | "keywords": [
163 | "promise"
164 | ],
165 | "time": "2015-08-15 19:37:21"
166 | },
167 | {
168 | "name": "guzzlehttp/psr7",
169 | "version": "1.2.0",
170 | "source": {
171 | "type": "git",
172 | "url": "https://github.com/guzzle/psr7.git",
173 | "reference": "4ef919b0cf3b1989523138b60163bbcb7ba1ff7e"
174 | },
175 | "dist": {
176 | "type": "zip",
177 | "url": "https://api.github.com/repos/guzzle/psr7/zipball/4ef919b0cf3b1989523138b60163bbcb7ba1ff7e",
178 | "reference": "4ef919b0cf3b1989523138b60163bbcb7ba1ff7e",
179 | "shasum": ""
180 | },
181 | "require": {
182 | "php": ">=5.4.0",
183 | "psr/http-message": "~1.0"
184 | },
185 | "provide": {
186 | "psr/http-message-implementation": "1.0"
187 | },
188 | "require-dev": {
189 | "phpunit/phpunit": "~4.0"
190 | },
191 | "type": "library",
192 | "extra": {
193 | "branch-alias": {
194 | "dev-master": "1.0-dev"
195 | }
196 | },
197 | "autoload": {
198 | "psr-4": {
199 | "GuzzleHttp\\Psr7\\": "src/"
200 | },
201 | "files": [
202 | "src/functions_include.php"
203 | ]
204 | },
205 | "notification-url": "https://packagist.org/downloads/",
206 | "license": [
207 | "MIT"
208 | ],
209 | "authors": [
210 | {
211 | "name": "Michael Dowling",
212 | "email": "mtdowling@gmail.com",
213 | "homepage": "https://github.com/mtdowling"
214 | }
215 | ],
216 | "description": "PSR-7 message implementation",
217 | "keywords": [
218 | "http",
219 | "message",
220 | "stream",
221 | "uri"
222 | ],
223 | "time": "2015-08-15 19:32:36"
224 | },
225 | {
226 | "name": "monolog/monolog",
227 | "version": "1.16.0",
228 | "source": {
229 | "type": "git",
230 | "url": "https://github.com/Seldaek/monolog.git",
231 | "reference": "c0c0b4bee3aabce7182876b0d912ef2595563db7"
232 | },
233 | "dist": {
234 | "type": "zip",
235 | "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c0c0b4bee3aabce7182876b0d912ef2595563db7",
236 | "reference": "c0c0b4bee3aabce7182876b0d912ef2595563db7",
237 | "shasum": ""
238 | },
239 | "require": {
240 | "php": ">=5.3.0",
241 | "psr/log": "~1.0"
242 | },
243 | "provide": {
244 | "psr/log-implementation": "1.0.0"
245 | },
246 | "require-dev": {
247 | "aws/aws-sdk-php": "^2.4.9",
248 | "doctrine/couchdb": "~1.0@dev",
249 | "graylog2/gelf-php": "~1.0",
250 | "php-console/php-console": "^3.1.3",
251 | "phpunit/phpunit": "~4.5",
252 | "phpunit/phpunit-mock-objects": "2.3.0",
253 | "raven/raven": "~0.8",
254 | "ruflin/elastica": ">=0.90 <3.0",
255 | "swiftmailer/swiftmailer": "~5.3",
256 | "videlalvaro/php-amqplib": "~2.4"
257 | },
258 | "suggest": {
259 | "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
260 | "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
261 | "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
262 | "ext-mongo": "Allow sending log messages to a MongoDB server",
263 | "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
264 | "php-console/php-console": "Allow sending log messages to Google Chrome",
265 | "raven/raven": "Allow sending log messages to a Sentry server",
266 | "rollbar/rollbar": "Allow sending log messages to Rollbar",
267 | "ruflin/elastica": "Allow sending log messages to an Elastic Search server",
268 | "videlalvaro/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib"
269 | },
270 | "type": "library",
271 | "extra": {
272 | "branch-alias": {
273 | "dev-master": "1.16.x-dev"
274 | }
275 | },
276 | "autoload": {
277 | "psr-4": {
278 | "Monolog\\": "src/Monolog"
279 | }
280 | },
281 | "notification-url": "https://packagist.org/downloads/",
282 | "license": [
283 | "MIT"
284 | ],
285 | "authors": [
286 | {
287 | "name": "Jordi Boggiano",
288 | "email": "j.boggiano@seld.be",
289 | "homepage": "http://seld.be"
290 | }
291 | ],
292 | "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
293 | "homepage": "http://github.com/Seldaek/monolog",
294 | "keywords": [
295 | "log",
296 | "logging",
297 | "psr-3"
298 | ],
299 | "time": "2015-08-09 17:44:44"
300 | },
301 | {
302 | "name": "pimple/pimple",
303 | "version": "v1.1.1",
304 | "source": {
305 | "type": "git",
306 | "url": "https://github.com/silexphp/Pimple.git",
307 | "reference": "2019c145fe393923f3441b23f29bbdfaa5c58c4d"
308 | },
309 | "dist": {
310 | "type": "zip",
311 | "url": "https://api.github.com/repos/silexphp/Pimple/zipball/2019c145fe393923f3441b23f29bbdfaa5c58c4d",
312 | "reference": "2019c145fe393923f3441b23f29bbdfaa5c58c4d",
313 | "shasum": ""
314 | },
315 | "require": {
316 | "php": ">=5.3.0"
317 | },
318 | "type": "library",
319 | "extra": {
320 | "branch-alias": {
321 | "dev-master": "1.1.x-dev"
322 | }
323 | },
324 | "autoload": {
325 | "psr-0": {
326 | "Pimple": "lib/"
327 | }
328 | },
329 | "notification-url": "https://packagist.org/downloads/",
330 | "license": [
331 | "MIT"
332 | ],
333 | "authors": [
334 | {
335 | "name": "Fabien Potencier",
336 | "email": "fabien@symfony.com"
337 | }
338 | ],
339 | "description": "Pimple is a simple Dependency Injection Container for PHP 5.3",
340 | "homepage": "http://pimple.sensiolabs.org",
341 | "keywords": [
342 | "container",
343 | "dependency injection"
344 | ],
345 | "time": "2013-11-22 08:30:29"
346 | },
347 | {
348 | "name": "predis/predis",
349 | "version": "v1.0.3",
350 | "source": {
351 | "type": "git",
352 | "url": "https://github.com/nrk/predis.git",
353 | "reference": "84060b9034d756b4d79641667d7f9efe1aeb8e04"
354 | },
355 | "dist": {
356 | "type": "zip",
357 | "url": "https://api.github.com/repos/nrk/predis/zipball/84060b9034d756b4d79641667d7f9efe1aeb8e04",
358 | "reference": "84060b9034d756b4d79641667d7f9efe1aeb8e04",
359 | "shasum": ""
360 | },
361 | "require": {
362 | "php": ">=5.3.2"
363 | },
364 | "require-dev": {
365 | "phpunit/phpunit": "~4.0"
366 | },
367 | "suggest": {
368 | "ext-curl": "Allows access to Webdis when paired with phpiredis",
369 | "ext-phpiredis": "Allows faster serialization and deserialization of the Redis protocol"
370 | },
371 | "type": "library",
372 | "autoload": {
373 | "psr-4": {
374 | "Predis\\": "src/"
375 | }
376 | },
377 | "notification-url": "https://packagist.org/downloads/",
378 | "license": [
379 | "MIT"
380 | ],
381 | "authors": [
382 | {
383 | "name": "Daniele Alessandri",
384 | "email": "suppakilla@gmail.com",
385 | "homepage": "http://clorophilla.net"
386 | }
387 | ],
388 | "description": "Flexible and feature-complete PHP client library for Redis",
389 | "homepage": "http://github.com/nrk/predis",
390 | "keywords": [
391 | "nosql",
392 | "predis",
393 | "redis"
394 | ],
395 | "time": "2015-07-30 18:34:15"
396 | },
397 | {
398 | "name": "predis/service-provider",
399 | "version": "v1.0.0",
400 | "source": {
401 | "type": "git",
402 | "url": "https://github.com/nrk/PredisServiceProvider.git",
403 | "reference": "c1f11793282f141854033b86dfdfc8ee150d9863"
404 | },
405 | "dist": {
406 | "type": "zip",
407 | "url": "https://api.github.com/repos/nrk/PredisServiceProvider/zipball/c1f11793282f141854033b86dfdfc8ee150d9863",
408 | "reference": "c1f11793282f141854033b86dfdfc8ee150d9863",
409 | "shasum": ""
410 | },
411 | "require": {
412 | "php": ">=5.3.2",
413 | "predis/predis": "~1.0",
414 | "silex/silex": "~1.0"
415 | },
416 | "require-dev": {
417 | "phpunit/phpunit": "~4.0"
418 | },
419 | "type": "library",
420 | "autoload": {
421 | "psr-4": {
422 | "Predis\\Silex\\": "src/"
423 | }
424 | },
425 | "notification-url": "https://packagist.org/downloads/",
426 | "license": [
427 | "MIT"
428 | ],
429 | "authors": [
430 | {
431 | "name": "Daniele Alessandri",
432 | "email": "suppakilla@gmail.com",
433 | "homepage": "http://clorophilla.net"
434 | }
435 | ],
436 | "description": "Predis service provider for the Silex microframework",
437 | "homepage": "https://github.com/nrk/PredisServiceProvider",
438 | "keywords": [
439 | "predis",
440 | "redis",
441 | "silex"
442 | ],
443 | "time": "2014-08-06 09:57:30"
444 | },
445 | {
446 | "name": "psr/http-message",
447 | "version": "1.0",
448 | "source": {
449 | "type": "git",
450 | "url": "https://github.com/php-fig/http-message.git",
451 | "reference": "85d63699f0dbedb190bbd4b0d2b9dc707ea4c298"
452 | },
453 | "dist": {
454 | "type": "zip",
455 | "url": "https://api.github.com/repos/php-fig/http-message/zipball/85d63699f0dbedb190bbd4b0d2b9dc707ea4c298",
456 | "reference": "85d63699f0dbedb190bbd4b0d2b9dc707ea4c298",
457 | "shasum": ""
458 | },
459 | "require": {
460 | "php": ">=5.3.0"
461 | },
462 | "type": "library",
463 | "extra": {
464 | "branch-alias": {
465 | "dev-master": "1.0.x-dev"
466 | }
467 | },
468 | "autoload": {
469 | "psr-4": {
470 | "Psr\\Http\\Message\\": "src/"
471 | }
472 | },
473 | "notification-url": "https://packagist.org/downloads/",
474 | "license": [
475 | "MIT"
476 | ],
477 | "authors": [
478 | {
479 | "name": "PHP-FIG",
480 | "homepage": "http://www.php-fig.org/"
481 | }
482 | ],
483 | "description": "Common interface for HTTP messages",
484 | "keywords": [
485 | "http",
486 | "http-message",
487 | "psr",
488 | "psr-7",
489 | "request",
490 | "response"
491 | ],
492 | "time": "2015-05-04 20:22:00"
493 | },
494 | {
495 | "name": "psr/log",
496 | "version": "1.0.0",
497 | "source": {
498 | "type": "git",
499 | "url": "https://github.com/php-fig/log.git",
500 | "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b"
501 | },
502 | "dist": {
503 | "type": "zip",
504 | "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b",
505 | "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b",
506 | "shasum": ""
507 | },
508 | "type": "library",
509 | "autoload": {
510 | "psr-0": {
511 | "Psr\\Log\\": ""
512 | }
513 | },
514 | "notification-url": "https://packagist.org/downloads/",
515 | "license": [
516 | "MIT"
517 | ],
518 | "authors": [
519 | {
520 | "name": "PHP-FIG",
521 | "homepage": "http://www.php-fig.org/"
522 | }
523 | ],
524 | "description": "Common interface for logging libraries",
525 | "keywords": [
526 | "log",
527 | "psr",
528 | "psr-3"
529 | ],
530 | "time": "2012-12-21 11:40:51"
531 | },
532 | {
533 | "name": "rebangm/silex-guzzlehttp-provider",
534 | "version": "v1.2.0",
535 | "source": {
536 | "type": "git",
537 | "url": "https://github.com/rebangm/silex-guzzlehttp-provider.git",
538 | "reference": "e732514441fa4877f5bb5a1172c933dee194b1de"
539 | },
540 | "dist": {
541 | "type": "zip",
542 | "url": "https://api.github.com/repos/rebangm/silex-guzzlehttp-provider/zipball/e732514441fa4877f5bb5a1172c933dee194b1de",
543 | "reference": "e732514441fa4877f5bb5a1172c933dee194b1de",
544 | "shasum": ""
545 | },
546 | "require": {
547 | "guzzlehttp/guzzle": "^6.0",
548 | "php": ">=5.3.0"
549 | },
550 | "require-dev": {
551 | "phpunit/phpunit": "*",
552 | "silex/silex": "~1.3",
553 | "squizlabs/php_codesniffer": "2.*"
554 | },
555 | "type": "library",
556 | "autoload": {
557 | "psr-4": {
558 | "SilexGuzzle\\": "src\\SilexGuzzle"
559 | }
560 | },
561 | "notification-url": "https://packagist.org/downloads/",
562 | "license": [
563 | "MIT"
564 | ],
565 | "authors": [
566 | {
567 | "name": "Jean-Philippe Dépigny",
568 | "email": "jp.depigny@gmail.com",
569 | "homepage": "https://github.com/rebangm"
570 | }
571 | ],
572 | "description": "Guzzle http service provider for Silex",
573 | "homepage": "https://github.com/rebangm/silex-Guzzlehttp-provider",
574 | "keywords": [
575 | "guzzlehttp",
576 | "provider",
577 | "silex"
578 | ],
579 | "time": "2015-08-01 18:18:30"
580 | },
581 | {
582 | "name": "silex/silex",
583 | "version": "v1.3.2",
584 | "source": {
585 | "type": "git",
586 | "url": "https://github.com/silexphp/Silex.git",
587 | "reference": "833d399eeaa449786d3fa2e533ada293b4e533c9"
588 | },
589 | "dist": {
590 | "type": "zip",
591 | "url": "https://api.github.com/repos/silexphp/Silex/zipball/833d399eeaa449786d3fa2e533ada293b4e533c9",
592 | "reference": "833d399eeaa449786d3fa2e533ada293b4e533c9",
593 | "shasum": ""
594 | },
595 | "require": {
596 | "php": ">=5.3.9",
597 | "pimple/pimple": "~1.0",
598 | "symfony/event-dispatcher": "~2.3,<3.0",
599 | "symfony/http-foundation": "~2.3,<3.0",
600 | "symfony/http-kernel": "~2.3,<3.0",
601 | "symfony/routing": "~2.3,<3.0"
602 | },
603 | "require-dev": {
604 | "doctrine/dbal": "~2.2",
605 | "monolog/monolog": "~1.4,>=1.4.1",
606 | "swiftmailer/swiftmailer": "5.*",
607 | "symfony/browser-kit": "~2.3,<3.0",
608 | "symfony/config": "~2.3,<3.0",
609 | "symfony/css-selector": "~2.3,<3.0",
610 | "symfony/debug": "~2.3,<3.0",
611 | "symfony/dom-crawler": "~2.3,<3.0",
612 | "symfony/finder": "~2.3,<3.0",
613 | "symfony/form": "~2.3,<3.0",
614 | "symfony/locale": "~2.3,<3.0",
615 | "symfony/monolog-bridge": "~2.3,<3.0",
616 | "symfony/options-resolver": "~2.3,<3.0",
617 | "symfony/process": "~2.3,<3.0",
618 | "symfony/security": "~2.3,<3.0",
619 | "symfony/serializer": "~2.3,<3.0",
620 | "symfony/translation": "~2.3,<3.0",
621 | "symfony/twig-bridge": "~2.3,<3.0",
622 | "symfony/validator": "~2.3,<3.0",
623 | "twig/twig": ">=1.8.0,<2.0-dev"
624 | },
625 | "suggest": {
626 | "symfony/browser-kit": "~2.3",
627 | "symfony/css-selector": "~2.3",
628 | "symfony/dom-crawler": "~2.3",
629 | "symfony/form": "~2.3"
630 | },
631 | "type": "library",
632 | "extra": {
633 | "branch-alias": {
634 | "dev-master": "1.3.x-dev"
635 | }
636 | },
637 | "autoload": {
638 | "psr-4": {
639 | "Silex\\": "src/Silex"
640 | }
641 | },
642 | "notification-url": "https://packagist.org/downloads/",
643 | "license": [
644 | "MIT"
645 | ],
646 | "authors": [
647 | {
648 | "name": "Fabien Potencier",
649 | "email": "fabien@symfony.com"
650 | },
651 | {
652 | "name": "Igor Wiedler",
653 | "email": "igor@wiedler.ch"
654 | }
655 | ],
656 | "description": "The PHP micro-framework based on the Symfony Components",
657 | "homepage": "http://silex.sensiolabs.org",
658 | "keywords": [
659 | "microframework"
660 | ],
661 | "time": "2015-08-24 10:04:48"
662 | },
663 | {
664 | "name": "symfony/debug",
665 | "version": "v2.7.3",
666 | "source": {
667 | "type": "git",
668 | "url": "https://github.com/symfony/Debug.git",
669 | "reference": "9daa1bf9f7e615fa2fba30357e479a90141222e3"
670 | },
671 | "dist": {
672 | "type": "zip",
673 | "url": "https://api.github.com/repos/symfony/Debug/zipball/9daa1bf9f7e615fa2fba30357e479a90141222e3",
674 | "reference": "9daa1bf9f7e615fa2fba30357e479a90141222e3",
675 | "shasum": ""
676 | },
677 | "require": {
678 | "php": ">=5.3.9",
679 | "psr/log": "~1.0"
680 | },
681 | "conflict": {
682 | "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
683 | },
684 | "require-dev": {
685 | "symfony/class-loader": "~2.2",
686 | "symfony/http-foundation": "~2.1",
687 | "symfony/http-kernel": "~2.3.24|~2.5.9|~2.6,>=2.6.2",
688 | "symfony/phpunit-bridge": "~2.7"
689 | },
690 | "suggest": {
691 | "symfony/http-foundation": "",
692 | "symfony/http-kernel": ""
693 | },
694 | "type": "library",
695 | "extra": {
696 | "branch-alias": {
697 | "dev-master": "2.7-dev"
698 | }
699 | },
700 | "autoload": {
701 | "psr-4": {
702 | "Symfony\\Component\\Debug\\": ""
703 | }
704 | },
705 | "notification-url": "https://packagist.org/downloads/",
706 | "license": [
707 | "MIT"
708 | ],
709 | "authors": [
710 | {
711 | "name": "Fabien Potencier",
712 | "email": "fabien@symfony.com"
713 | },
714 | {
715 | "name": "Symfony Community",
716 | "homepage": "https://symfony.com/contributors"
717 | }
718 | ],
719 | "description": "Symfony Debug Component",
720 | "homepage": "https://symfony.com",
721 | "time": "2015-07-09 16:07:40"
722 | },
723 | {
724 | "name": "symfony/event-dispatcher",
725 | "version": "v2.7.3",
726 | "source": {
727 | "type": "git",
728 | "url": "https://github.com/symfony/EventDispatcher.git",
729 | "reference": "9310b5f9a87ec2ea75d20fec0b0017c77c66dac3"
730 | },
731 | "dist": {
732 | "type": "zip",
733 | "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/9310b5f9a87ec2ea75d20fec0b0017c77c66dac3",
734 | "reference": "9310b5f9a87ec2ea75d20fec0b0017c77c66dac3",
735 | "shasum": ""
736 | },
737 | "require": {
738 | "php": ">=5.3.9"
739 | },
740 | "require-dev": {
741 | "psr/log": "~1.0",
742 | "symfony/config": "~2.0,>=2.0.5",
743 | "symfony/dependency-injection": "~2.6",
744 | "symfony/expression-language": "~2.6",
745 | "symfony/phpunit-bridge": "~2.7",
746 | "symfony/stopwatch": "~2.3"
747 | },
748 | "suggest": {
749 | "symfony/dependency-injection": "",
750 | "symfony/http-kernel": ""
751 | },
752 | "type": "library",
753 | "extra": {
754 | "branch-alias": {
755 | "dev-master": "2.7-dev"
756 | }
757 | },
758 | "autoload": {
759 | "psr-4": {
760 | "Symfony\\Component\\EventDispatcher\\": ""
761 | }
762 | },
763 | "notification-url": "https://packagist.org/downloads/",
764 | "license": [
765 | "MIT"
766 | ],
767 | "authors": [
768 | {
769 | "name": "Fabien Potencier",
770 | "email": "fabien@symfony.com"
771 | },
772 | {
773 | "name": "Symfony Community",
774 | "homepage": "https://symfony.com/contributors"
775 | }
776 | ],
777 | "description": "Symfony EventDispatcher Component",
778 | "homepage": "https://symfony.com",
779 | "time": "2015-06-18 19:21:56"
780 | },
781 | {
782 | "name": "symfony/form",
783 | "version": "v2.7.3",
784 | "source": {
785 | "type": "git",
786 | "url": "https://github.com/symfony/Form.git",
787 | "reference": "834bfe69221e5e060296f61755e95a8037aa9666"
788 | },
789 | "dist": {
790 | "type": "zip",
791 | "url": "https://api.github.com/repos/symfony/Form/zipball/834bfe69221e5e060296f61755e95a8037aa9666",
792 | "reference": "834bfe69221e5e060296f61755e95a8037aa9666",
793 | "shasum": ""
794 | },
795 | "require": {
796 | "php": ">=5.3.9",
797 | "symfony/event-dispatcher": "~2.1",
798 | "symfony/intl": "~2.3",
799 | "symfony/options-resolver": "~2.6",
800 | "symfony/property-access": "~2.3"
801 | },
802 | "conflict": {
803 | "symfony/doctrine-bridge": "<2.7",
804 | "symfony/framework-bundle": "<2.7",
805 | "symfony/twig-bridge": "<2.7"
806 | },
807 | "require-dev": {
808 | "doctrine/collections": "~1.0",
809 | "symfony/http-foundation": "~2.2",
810 | "symfony/http-kernel": "~2.4",
811 | "symfony/phpunit-bridge": "~2.7",
812 | "symfony/security-csrf": "~2.4",
813 | "symfony/translation": "~2.0,>=2.0.5",
814 | "symfony/validator": "~2.6,>=2.6.8"
815 | },
816 | "suggest": {
817 | "symfony/framework-bundle": "For templating with PHP.",
818 | "symfony/security-csrf": "For protecting forms against CSRF attacks.",
819 | "symfony/twig-bridge": "For templating with Twig.",
820 | "symfony/validator": "For form validation."
821 | },
822 | "type": "library",
823 | "extra": {
824 | "branch-alias": {
825 | "dev-master": "2.7-dev"
826 | }
827 | },
828 | "autoload": {
829 | "psr-4": {
830 | "Symfony\\Component\\Form\\": ""
831 | }
832 | },
833 | "notification-url": "https://packagist.org/downloads/",
834 | "license": [
835 | "MIT"
836 | ],
837 | "authors": [
838 | {
839 | "name": "Fabien Potencier",
840 | "email": "fabien@symfony.com"
841 | },
842 | {
843 | "name": "Symfony Community",
844 | "homepage": "https://symfony.com/contributors"
845 | }
846 | ],
847 | "description": "Symfony Form Component",
848 | "homepage": "https://symfony.com",
849 | "time": "2015-07-22 10:11:00"
850 | },
851 | {
852 | "name": "symfony/http-foundation",
853 | "version": "v2.7.3",
854 | "source": {
855 | "type": "git",
856 | "url": "https://github.com/symfony/HttpFoundation.git",
857 | "reference": "863af6898081b34c65d42100c370b9f3c51b70ca"
858 | },
859 | "dist": {
860 | "type": "zip",
861 | "url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/863af6898081b34c65d42100c370b9f3c51b70ca",
862 | "reference": "863af6898081b34c65d42100c370b9f3c51b70ca",
863 | "shasum": ""
864 | },
865 | "require": {
866 | "php": ">=5.3.9"
867 | },
868 | "require-dev": {
869 | "symfony/expression-language": "~2.4",
870 | "symfony/phpunit-bridge": "~2.7"
871 | },
872 | "type": "library",
873 | "extra": {
874 | "branch-alias": {
875 | "dev-master": "2.7-dev"
876 | }
877 | },
878 | "autoload": {
879 | "psr-4": {
880 | "Symfony\\Component\\HttpFoundation\\": ""
881 | },
882 | "classmap": [
883 | "Resources/stubs"
884 | ]
885 | },
886 | "notification-url": "https://packagist.org/downloads/",
887 | "license": [
888 | "MIT"
889 | ],
890 | "authors": [
891 | {
892 | "name": "Fabien Potencier",
893 | "email": "fabien@symfony.com"
894 | },
895 | {
896 | "name": "Symfony Community",
897 | "homepage": "https://symfony.com/contributors"
898 | }
899 | ],
900 | "description": "Symfony HttpFoundation Component",
901 | "homepage": "https://symfony.com",
902 | "time": "2015-07-22 10:11:00"
903 | },
904 | {
905 | "name": "symfony/http-kernel",
906 | "version": "v2.7.3",
907 | "source": {
908 | "type": "git",
909 | "url": "https://github.com/symfony/HttpKernel.git",
910 | "reference": "405d3e7a59ff7a28ec469441326a0ac79065ea98"
911 | },
912 | "dist": {
913 | "type": "zip",
914 | "url": "https://api.github.com/repos/symfony/HttpKernel/zipball/405d3e7a59ff7a28ec469441326a0ac79065ea98",
915 | "reference": "405d3e7a59ff7a28ec469441326a0ac79065ea98",
916 | "shasum": ""
917 | },
918 | "require": {
919 | "php": ">=5.3.9",
920 | "psr/log": "~1.0",
921 | "symfony/debug": "~2.6,>=2.6.2",
922 | "symfony/event-dispatcher": "~2.6,>=2.6.7",
923 | "symfony/http-foundation": "~2.5,>=2.5.4"
924 | },
925 | "conflict": {
926 | "symfony/config": "<2.7"
927 | },
928 | "require-dev": {
929 | "symfony/browser-kit": "~2.3",
930 | "symfony/class-loader": "~2.1",
931 | "symfony/config": "~2.7",
932 | "symfony/console": "~2.3",
933 | "symfony/css-selector": "~2.0,>=2.0.5",
934 | "symfony/dependency-injection": "~2.2",
935 | "symfony/dom-crawler": "~2.0,>=2.0.5",
936 | "symfony/expression-language": "~2.4",
937 | "symfony/finder": "~2.0,>=2.0.5",
938 | "symfony/phpunit-bridge": "~2.7",
939 | "symfony/process": "~2.0,>=2.0.5",
940 | "symfony/routing": "~2.2",
941 | "symfony/stopwatch": "~2.3",
942 | "symfony/templating": "~2.2",
943 | "symfony/translation": "~2.0,>=2.0.5",
944 | "symfony/var-dumper": "~2.6"
945 | },
946 | "suggest": {
947 | "symfony/browser-kit": "",
948 | "symfony/class-loader": "",
949 | "symfony/config": "",
950 | "symfony/console": "",
951 | "symfony/dependency-injection": "",
952 | "symfony/finder": "",
953 | "symfony/var-dumper": ""
954 | },
955 | "type": "library",
956 | "extra": {
957 | "branch-alias": {
958 | "dev-master": "2.7-dev"
959 | }
960 | },
961 | "autoload": {
962 | "psr-4": {
963 | "Symfony\\Component\\HttpKernel\\": ""
964 | }
965 | },
966 | "notification-url": "https://packagist.org/downloads/",
967 | "license": [
968 | "MIT"
969 | ],
970 | "authors": [
971 | {
972 | "name": "Fabien Potencier",
973 | "email": "fabien@symfony.com"
974 | },
975 | {
976 | "name": "Symfony Community",
977 | "homepage": "https://symfony.com/contributors"
978 | }
979 | ],
980 | "description": "Symfony HttpKernel Component",
981 | "homepage": "https://symfony.com",
982 | "time": "2015-07-31 13:24:45"
983 | },
984 | {
985 | "name": "symfony/intl",
986 | "version": "v2.7.3",
987 | "source": {
988 | "type": "git",
989 | "url": "https://github.com/symfony/Intl.git",
990 | "reference": "ea83ee897023537fcd9b15fe29ef5622ea8f1c4b"
991 | },
992 | "dist": {
993 | "type": "zip",
994 | "url": "https://api.github.com/repos/symfony/Intl/zipball/ea83ee897023537fcd9b15fe29ef5622ea8f1c4b",
995 | "reference": "ea83ee897023537fcd9b15fe29ef5622ea8f1c4b",
996 | "shasum": ""
997 | },
998 | "require": {
999 | "php": ">=5.3.9"
1000 | },
1001 | "require-dev": {
1002 | "symfony/filesystem": "~2.1",
1003 | "symfony/phpunit-bridge": "~2.7"
1004 | },
1005 | "suggest": {
1006 | "ext-intl": "to use the component with locales other than \"en\""
1007 | },
1008 | "type": "library",
1009 | "extra": {
1010 | "branch-alias": {
1011 | "dev-master": "2.7-dev"
1012 | }
1013 | },
1014 | "autoload": {
1015 | "psr-4": {
1016 | "Symfony\\Component\\Intl\\": ""
1017 | },
1018 | "classmap": [
1019 | "Resources/stubs"
1020 | ],
1021 | "files": [
1022 | "Resources/stubs/functions.php"
1023 | ]
1024 | },
1025 | "notification-url": "https://packagist.org/downloads/",
1026 | "license": [
1027 | "MIT"
1028 | ],
1029 | "authors": [
1030 | {
1031 | "name": "Bernhard Schussek",
1032 | "email": "bschussek@gmail.com"
1033 | },
1034 | {
1035 | "name": "Eriksen Costa",
1036 | "email": "eriksen.costa@infranology.com.br"
1037 | },
1038 | {
1039 | "name": "Igor Wiedler",
1040 | "email": "igor@wiedler.ch"
1041 | },
1042 | {
1043 | "name": "Symfony Community",
1044 | "homepage": "https://symfony.com/contributors"
1045 | }
1046 | ],
1047 | "description": "A PHP replacement layer for the C intl extension that includes additional data from the ICU library.",
1048 | "homepage": "https://symfony.com",
1049 | "keywords": [
1050 | "i18n",
1051 | "icu",
1052 | "internationalization",
1053 | "intl",
1054 | "l10n",
1055 | "localization"
1056 | ],
1057 | "time": "2015-07-31 13:24:29"
1058 | },
1059 | {
1060 | "name": "symfony/options-resolver",
1061 | "version": "v2.7.3",
1062 | "source": {
1063 | "type": "git",
1064 | "url": "https://github.com/symfony/OptionsResolver.git",
1065 | "reference": "98c313c831e5d99bb393ba1844df91bab2bb5b8b"
1066 | },
1067 | "dist": {
1068 | "type": "zip",
1069 | "url": "https://api.github.com/repos/symfony/OptionsResolver/zipball/98c313c831e5d99bb393ba1844df91bab2bb5b8b",
1070 | "reference": "98c313c831e5d99bb393ba1844df91bab2bb5b8b",
1071 | "shasum": ""
1072 | },
1073 | "require": {
1074 | "php": ">=5.3.9"
1075 | },
1076 | "require-dev": {
1077 | "symfony/phpunit-bridge": "~2.7"
1078 | },
1079 | "type": "library",
1080 | "extra": {
1081 | "branch-alias": {
1082 | "dev-master": "2.7-dev"
1083 | }
1084 | },
1085 | "autoload": {
1086 | "psr-4": {
1087 | "Symfony\\Component\\OptionsResolver\\": ""
1088 | }
1089 | },
1090 | "notification-url": "https://packagist.org/downloads/",
1091 | "license": [
1092 | "MIT"
1093 | ],
1094 | "authors": [
1095 | {
1096 | "name": "Fabien Potencier",
1097 | "email": "fabien@symfony.com"
1098 | },
1099 | {
1100 | "name": "Symfony Community",
1101 | "homepage": "https://symfony.com/contributors"
1102 | }
1103 | ],
1104 | "description": "Symfony OptionsResolver Component",
1105 | "homepage": "https://symfony.com",
1106 | "keywords": [
1107 | "config",
1108 | "configuration",
1109 | "options"
1110 | ],
1111 | "time": "2015-06-18 19:21:56"
1112 | },
1113 | {
1114 | "name": "symfony/property-access",
1115 | "version": "v2.7.3",
1116 | "source": {
1117 | "type": "git",
1118 | "url": "https://github.com/symfony/PropertyAccess.git",
1119 | "reference": "e61e1a292c397273f654b15389600fe1d5a210de"
1120 | },
1121 | "dist": {
1122 | "type": "zip",
1123 | "url": "https://api.github.com/repos/symfony/PropertyAccess/zipball/e61e1a292c397273f654b15389600fe1d5a210de",
1124 | "reference": "e61e1a292c397273f654b15389600fe1d5a210de",
1125 | "shasum": ""
1126 | },
1127 | "require": {
1128 | "php": ">=5.3.9"
1129 | },
1130 | "require-dev": {
1131 | "symfony/phpunit-bridge": "~2.7"
1132 | },
1133 | "type": "library",
1134 | "extra": {
1135 | "branch-alias": {
1136 | "dev-master": "2.7-dev"
1137 | }
1138 | },
1139 | "autoload": {
1140 | "psr-4": {
1141 | "Symfony\\Component\\PropertyAccess\\": ""
1142 | }
1143 | },
1144 | "notification-url": "https://packagist.org/downloads/",
1145 | "license": [
1146 | "MIT"
1147 | ],
1148 | "authors": [
1149 | {
1150 | "name": "Fabien Potencier",
1151 | "email": "fabien@symfony.com"
1152 | },
1153 | {
1154 | "name": "Symfony Community",
1155 | "homepage": "https://symfony.com/contributors"
1156 | }
1157 | ],
1158 | "description": "Symfony PropertyAccess Component",
1159 | "homepage": "https://symfony.com",
1160 | "keywords": [
1161 | "access",
1162 | "array",
1163 | "extraction",
1164 | "index",
1165 | "injection",
1166 | "object",
1167 | "property",
1168 | "property path",
1169 | "reflection"
1170 | ],
1171 | "time": "2015-07-16 12:21:55"
1172 | },
1173 | {
1174 | "name": "symfony/routing",
1175 | "version": "v2.7.3",
1176 | "source": {
1177 | "type": "git",
1178 | "url": "https://github.com/symfony/Routing.git",
1179 | "reference": "ea9134f277162b02e5f80ac058b75a77637b0d26"
1180 | },
1181 | "dist": {
1182 | "type": "zip",
1183 | "url": "https://api.github.com/repos/symfony/Routing/zipball/ea9134f277162b02e5f80ac058b75a77637b0d26",
1184 | "reference": "ea9134f277162b02e5f80ac058b75a77637b0d26",
1185 | "shasum": ""
1186 | },
1187 | "require": {
1188 | "php": ">=5.3.9"
1189 | },
1190 | "conflict": {
1191 | "symfony/config": "<2.7"
1192 | },
1193 | "require-dev": {
1194 | "doctrine/annotations": "~1.0",
1195 | "doctrine/common": "~2.2",
1196 | "psr/log": "~1.0",
1197 | "symfony/config": "~2.7",
1198 | "symfony/expression-language": "~2.4",
1199 | "symfony/http-foundation": "~2.3",
1200 | "symfony/phpunit-bridge": "~2.7",
1201 | "symfony/yaml": "~2.0,>=2.0.5"
1202 | },
1203 | "suggest": {
1204 | "doctrine/annotations": "For using the annotation loader",
1205 | "symfony/config": "For using the all-in-one router or any loader",
1206 | "symfony/expression-language": "For using expression matching",
1207 | "symfony/yaml": "For using the YAML loader"
1208 | },
1209 | "type": "library",
1210 | "extra": {
1211 | "branch-alias": {
1212 | "dev-master": "2.7-dev"
1213 | }
1214 | },
1215 | "autoload": {
1216 | "psr-4": {
1217 | "Symfony\\Component\\Routing\\": ""
1218 | }
1219 | },
1220 | "notification-url": "https://packagist.org/downloads/",
1221 | "license": [
1222 | "MIT"
1223 | ],
1224 | "authors": [
1225 | {
1226 | "name": "Fabien Potencier",
1227 | "email": "fabien@symfony.com"
1228 | },
1229 | {
1230 | "name": "Symfony Community",
1231 | "homepage": "https://symfony.com/contributors"
1232 | }
1233 | ],
1234 | "description": "Symfony Routing Component",
1235 | "homepage": "https://symfony.com",
1236 | "keywords": [
1237 | "router",
1238 | "routing",
1239 | "uri",
1240 | "url"
1241 | ],
1242 | "time": "2015-07-09 16:07:40"
1243 | },
1244 | {
1245 | "name": "symfony/security-core",
1246 | "version": "v2.7.3",
1247 | "source": {
1248 | "type": "git",
1249 | "url": "https://github.com/symfony/security-core.git",
1250 | "reference": "9d527757035db08648a6cd41c165ae7869dd534e"
1251 | },
1252 | "dist": {
1253 | "type": "zip",
1254 | "url": "https://api.github.com/repos/symfony/security-core/zipball/9d527757035db08648a6cd41c165ae7869dd534e",
1255 | "reference": "9d527757035db08648a6cd41c165ae7869dd534e",
1256 | "shasum": ""
1257 | },
1258 | "require": {
1259 | "php": ">=5.3.9"
1260 | },
1261 | "require-dev": {
1262 | "ircmaxell/password-compat": "1.0.*",
1263 | "psr/log": "~1.0",
1264 | "symfony/event-dispatcher": "~2.1",
1265 | "symfony/expression-language": "~2.6",
1266 | "symfony/http-foundation": "~2.4",
1267 | "symfony/phpunit-bridge": "~2.7",
1268 | "symfony/translation": "~2.0,>=2.0.5",
1269 | "symfony/validator": "~2.5,>=2.5.5"
1270 | },
1271 | "suggest": {
1272 | "ircmaxell/password-compat": "For using the BCrypt password encoder in PHP <5.5",
1273 | "symfony/event-dispatcher": "",
1274 | "symfony/expression-language": "For using the expression voter",
1275 | "symfony/http-foundation": "",
1276 | "symfony/validator": "For using the user password constraint"
1277 | },
1278 | "type": "library",
1279 | "extra": {
1280 | "branch-alias": {
1281 | "dev-master": "2.7-dev"
1282 | }
1283 | },
1284 | "autoload": {
1285 | "psr-4": {
1286 | "Symfony\\Component\\Security\\Core\\": ""
1287 | }
1288 | },
1289 | "notification-url": "https://packagist.org/downloads/",
1290 | "license": [
1291 | "MIT"
1292 | ],
1293 | "authors": [
1294 | {
1295 | "name": "Fabien Potencier",
1296 | "email": "fabien@symfony.com"
1297 | },
1298 | {
1299 | "name": "Symfony Community",
1300 | "homepage": "https://symfony.com/contributors"
1301 | }
1302 | ],
1303 | "description": "Symfony Security Component - Core Library",
1304 | "homepage": "https://symfony.com",
1305 | "time": "2015-07-22 10:11:00"
1306 | },
1307 | {
1308 | "name": "symfony/security-csrf",
1309 | "version": "v2.7.3",
1310 | "source": {
1311 | "type": "git",
1312 | "url": "https://github.com/symfony/security-csrf.git",
1313 | "reference": "e438b3e7de930e2147e397830126d2f0d32a0088"
1314 | },
1315 | "dist": {
1316 | "type": "zip",
1317 | "url": "https://api.github.com/repos/symfony/security-csrf/zipball/e438b3e7de930e2147e397830126d2f0d32a0088",
1318 | "reference": "e438b3e7de930e2147e397830126d2f0d32a0088",
1319 | "shasum": ""
1320 | },
1321 | "require": {
1322 | "php": ">=5.3.9",
1323 | "symfony/security-core": "~2.4"
1324 | },
1325 | "require-dev": {
1326 | "symfony/http-foundation": "~2.1",
1327 | "symfony/phpunit-bridge": "~2.7"
1328 | },
1329 | "suggest": {
1330 | "symfony/http-foundation": "For using the class SessionTokenStorage."
1331 | },
1332 | "type": "library",
1333 | "extra": {
1334 | "branch-alias": {
1335 | "dev-master": "2.7-dev"
1336 | }
1337 | },
1338 | "autoload": {
1339 | "psr-4": {
1340 | "Symfony\\Component\\Security\\Csrf\\": ""
1341 | }
1342 | },
1343 | "notification-url": "https://packagist.org/downloads/",
1344 | "license": [
1345 | "MIT"
1346 | ],
1347 | "authors": [
1348 | {
1349 | "name": "Fabien Potencier",
1350 | "email": "fabien@symfony.com"
1351 | },
1352 | {
1353 | "name": "Symfony Community",
1354 | "homepage": "https://symfony.com/contributors"
1355 | }
1356 | ],
1357 | "description": "Symfony Security Component - CSRF Library",
1358 | "homepage": "https://symfony.com",
1359 | "time": "2015-05-13 11:34:46"
1360 | },
1361 | {
1362 | "name": "symfony/translation",
1363 | "version": "v2.7.3",
1364 | "source": {
1365 | "type": "git",
1366 | "url": "https://github.com/symfony/Translation.git",
1367 | "reference": "c8dc34cc936152c609cdd722af317e4239d10dd6"
1368 | },
1369 | "dist": {
1370 | "type": "zip",
1371 | "url": "https://api.github.com/repos/symfony/Translation/zipball/c8dc34cc936152c609cdd722af317e4239d10dd6",
1372 | "reference": "c8dc34cc936152c609cdd722af317e4239d10dd6",
1373 | "shasum": ""
1374 | },
1375 | "require": {
1376 | "php": ">=5.3.9"
1377 | },
1378 | "conflict": {
1379 | "symfony/config": "<2.7"
1380 | },
1381 | "require-dev": {
1382 | "psr/log": "~1.0",
1383 | "symfony/config": "~2.7",
1384 | "symfony/intl": "~2.3",
1385 | "symfony/phpunit-bridge": "~2.7",
1386 | "symfony/yaml": "~2.2"
1387 | },
1388 | "suggest": {
1389 | "psr/log": "To use logging capability in translator",
1390 | "symfony/config": "",
1391 | "symfony/yaml": ""
1392 | },
1393 | "type": "library",
1394 | "extra": {
1395 | "branch-alias": {
1396 | "dev-master": "2.7-dev"
1397 | }
1398 | },
1399 | "autoload": {
1400 | "psr-4": {
1401 | "Symfony\\Component\\Translation\\": ""
1402 | }
1403 | },
1404 | "notification-url": "https://packagist.org/downloads/",
1405 | "license": [
1406 | "MIT"
1407 | ],
1408 | "authors": [
1409 | {
1410 | "name": "Fabien Potencier",
1411 | "email": "fabien@symfony.com"
1412 | },
1413 | {
1414 | "name": "Symfony Community",
1415 | "homepage": "https://symfony.com/contributors"
1416 | }
1417 | ],
1418 | "description": "Symfony Translation Component",
1419 | "homepage": "https://symfony.com",
1420 | "time": "2015-07-09 16:07:40"
1421 | },
1422 | {
1423 | "name": "symfony/twig-bridge",
1424 | "version": "v2.7.3",
1425 | "source": {
1426 | "type": "git",
1427 | "url": "https://github.com/symfony/TwigBridge.git",
1428 | "reference": "1d7c50fc20f89c5ca4d440ed54abf049dc882c6e"
1429 | },
1430 | "dist": {
1431 | "type": "zip",
1432 | "url": "https://api.github.com/repos/symfony/TwigBridge/zipball/1d7c50fc20f89c5ca4d440ed54abf049dc882c6e",
1433 | "reference": "1d7c50fc20f89c5ca4d440ed54abf049dc882c6e",
1434 | "shasum": ""
1435 | },
1436 | "require": {
1437 | "php": ">=5.3.9",
1438 | "twig/twig": "~1.18"
1439 | },
1440 | "require-dev": {
1441 | "symfony/asset": "~2.7",
1442 | "symfony/console": "~2.7",
1443 | "symfony/expression-language": "~2.4",
1444 | "symfony/finder": "~2.3",
1445 | "symfony/form": "~2.7,>=2.7.2",
1446 | "symfony/http-kernel": "~2.3",
1447 | "symfony/intl": "~2.3",
1448 | "symfony/phpunit-bridge": "~2.7",
1449 | "symfony/routing": "~2.2",
1450 | "symfony/security": "~2.6",
1451 | "symfony/stopwatch": "~2.2",
1452 | "symfony/templating": "~2.1",
1453 | "symfony/translation": "~2.7",
1454 | "symfony/var-dumper": "~2.6",
1455 | "symfony/yaml": "~2.0,>=2.0.5"
1456 | },
1457 | "suggest": {
1458 | "symfony/asset": "For using the AssetExtension",
1459 | "symfony/expression-language": "For using the ExpressionExtension",
1460 | "symfony/finder": "",
1461 | "symfony/form": "For using the FormExtension",
1462 | "symfony/http-kernel": "For using the HttpKernelExtension",
1463 | "symfony/routing": "For using the RoutingExtension",
1464 | "symfony/security": "For using the SecurityExtension",
1465 | "symfony/stopwatch": "For using the StopwatchExtension",
1466 | "symfony/templating": "For using the TwigEngine",
1467 | "symfony/translation": "For using the TranslationExtension",
1468 | "symfony/var-dumper": "For using the DumpExtension",
1469 | "symfony/yaml": "For using the YamlExtension"
1470 | },
1471 | "type": "symfony-bridge",
1472 | "extra": {
1473 | "branch-alias": {
1474 | "dev-master": "2.7-dev"
1475 | }
1476 | },
1477 | "autoload": {
1478 | "psr-4": {
1479 | "Symfony\\Bridge\\Twig\\": ""
1480 | }
1481 | },
1482 | "notification-url": "https://packagist.org/downloads/",
1483 | "license": [
1484 | "MIT"
1485 | ],
1486 | "authors": [
1487 | {
1488 | "name": "Fabien Potencier",
1489 | "email": "fabien@symfony.com"
1490 | },
1491 | {
1492 | "name": "Symfony Community",
1493 | "homepage": "https://symfony.com/contributors"
1494 | }
1495 | ],
1496 | "description": "Symfony Twig Bridge",
1497 | "homepage": "https://symfony.com",
1498 | "time": "2015-07-26 06:32:57"
1499 | },
1500 | {
1501 | "name": "twig/twig",
1502 | "version": "v1.21.1",
1503 | "source": {
1504 | "type": "git",
1505 | "url": "https://github.com/twigphp/Twig.git",
1506 | "reference": "ca8d3aa90b6a01c82e07909fe815d6b443e75a23"
1507 | },
1508 | "dist": {
1509 | "type": "zip",
1510 | "url": "https://api.github.com/repos/twigphp/Twig/zipball/ca8d3aa90b6a01c82e07909fe815d6b443e75a23",
1511 | "reference": "ca8d3aa90b6a01c82e07909fe815d6b443e75a23",
1512 | "shasum": ""
1513 | },
1514 | "require": {
1515 | "php": ">=5.2.7"
1516 | },
1517 | "require-dev": {
1518 | "symfony/debug": "~2.7",
1519 | "symfony/phpunit-bridge": "~2.7"
1520 | },
1521 | "type": "library",
1522 | "extra": {
1523 | "branch-alias": {
1524 | "dev-master": "1.21-dev"
1525 | }
1526 | },
1527 | "autoload": {
1528 | "psr-0": {
1529 | "Twig_": "lib/"
1530 | }
1531 | },
1532 | "notification-url": "https://packagist.org/downloads/",
1533 | "license": [
1534 | "BSD-3-Clause"
1535 | ],
1536 | "authors": [
1537 | {
1538 | "name": "Fabien Potencier",
1539 | "email": "fabien@symfony.com",
1540 | "homepage": "http://fabien.potencier.org",
1541 | "role": "Lead Developer"
1542 | },
1543 | {
1544 | "name": "Armin Ronacher",
1545 | "email": "armin.ronacher@active-4.com",
1546 | "role": "Project Founder"
1547 | },
1548 | {
1549 | "name": "Twig Team",
1550 | "homepage": "http://twig.sensiolabs.org/contributors",
1551 | "role": "Contributors"
1552 | }
1553 | ],
1554 | "description": "Twig, the flexible, fast, and secure template language for PHP",
1555 | "homepage": "http://twig.sensiolabs.org",
1556 | "keywords": [
1557 | "templating"
1558 | ],
1559 | "time": "2015-08-26 08:58:31"
1560 | },
1561 | {
1562 | "name": "videlalvaro/php-amqplib",
1563 | "version": "v2.5.2",
1564 | "source": {
1565 | "type": "git",
1566 | "url": "https://github.com/videlalvaro/php-amqplib.git",
1567 | "reference": "eb8f94d97c8e79900accf77343dbd7eca7f58506"
1568 | },
1569 | "dist": {
1570 | "type": "zip",
1571 | "url": "https://api.github.com/repos/videlalvaro/php-amqplib/zipball/eb8f94d97c8e79900accf77343dbd7eca7f58506",
1572 | "reference": "eb8f94d97c8e79900accf77343dbd7eca7f58506",
1573 | "shasum": ""
1574 | },
1575 | "require": {
1576 | "ext-bcmath": "*",
1577 | "ext-mbstring": "*",
1578 | "php": ">=5.3.0"
1579 | },
1580 | "require-dev": {
1581 | "phpunit/phpunit": "3.7.*"
1582 | },
1583 | "suggest": {
1584 | "ext-sockets": "Use AMQPSocketConnection"
1585 | },
1586 | "type": "library",
1587 | "extra": {
1588 | "branch-alias": {
1589 | "dev-master": "2.4-dev"
1590 | }
1591 | },
1592 | "autoload": {
1593 | "psr-4": {
1594 | "PhpAmqpLib\\": "PhpAmqpLib/"
1595 | }
1596 | },
1597 | "notification-url": "https://packagist.org/downloads/",
1598 | "license": [
1599 | "LGPL-2.1"
1600 | ],
1601 | "authors": [
1602 | {
1603 | "name": "Alvaro Videla"
1604 | }
1605 | ],
1606 | "description": "This library is a pure PHP implementation of the AMQP protocol. It's been tested against RabbitMQ.",
1607 | "homepage": "https://github.com/videlalvaro/php-amqplib/",
1608 | "keywords": [
1609 | "message",
1610 | "queue",
1611 | "rabbitmq"
1612 | ],
1613 | "time": "2015-08-11 12:30:09"
1614 | }
1615 | ],
1616 | "packages-dev": [],
1617 | "aliases": [],
1618 | "minimum-stability": "stable",
1619 | "stability-flags": [],
1620 | "prefer-stable": false,
1621 | "prefer-lowest": false,
1622 | "platform": [],
1623 | "platform-dev": []
1624 | }
1625 |
--------------------------------------------------------------------------------