@@ -279,9 +279,81 @@ The ``newsletter_manager`` and ``mailer`` services can be set up using config fi
279
279
$container->register('newsletter_manager', 'NewsletterManager')
280
280
->addMethodCall('setMailer', new Reference('mailer');
281
281
282
- Learn more about this Component
283
- -------------------------------
282
+ Dumping the Configuration for Performance
283
+ -----------------------------------------
284
284
285
- * :doc: `/components/dependency_injection/definitions `
286
- * :doc: `/components/dependency_injection/factories `
287
- * :doc: `/components/dependency_injection/parentservices `
285
+ Using configuration files to manage the service container can be much easier
286
+ to understand than using PHP once there are a lot of services. This ease comes
287
+ at a price though when it comes to performance as the config files need to be
288
+ parsed and the PHP configuration built from them. You can have the best of both
289
+ worlds though by using configuration files and then dumping and caching the resulting
290
+ configuration. The ``PhpDumper `` makes dumping the compiled container easy::
291
+
292
+ use Symfony\Component\DependencyInjection\ContainerBuilder;
293
+ use Symfony\Component\Config\FileLocator;
294
+ use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
295
+ use Symfony\Component\DependencyInjection\Dumper\PhpDumper
296
+
297
+ $container = new ContainerBuilder();
298
+ $loader = new XmlFileLoader($container, new FileLocator(__DIR__));
299
+ $loader->load('services.xml');
300
+
301
+ $file = __DIR__ .'/cache/container.php';
302
+
303
+ if (file_exists($file)) {
304
+ require_once $file;
305
+ $container = new ProjectServiceContiner();
306
+ } else {
307
+ $container = new ContainerBuilder();
308
+ $loader = new XmlFileLoader($container, new FileLocator(__DIR__));
309
+ $loader->load('services.xml');
310
+
311
+ $dumper = new PhpDumper($container);
312
+ file_put_contents($file, $dumper->dump());
313
+ }
314
+
315
+ ``ProjectServiceContiner `` is the default name given to the dumped container
316
+ class, you can change this though this with the ``class `` option when you dump
317
+ it::
318
+
319
+ // ...
320
+ $file = __DIR__ .'/cache/container.php';
321
+
322
+ if (file_exists($file)) {
323
+ require_once $file;
324
+ $container = new MyCachedContainer();
325
+ } else {
326
+ $container = new ContainerBuilder();
327
+ $loader = new XmlFileLoader($container, new FileLocator(__DIR__));
328
+ $loader->load('services.xml');
329
+
330
+ $dumper = new PhpDumper($container);
331
+ file_put_contents($file, $dumper->dump(array('class' => 'MyCachedContainer')));
332
+ }
333
+
334
+ You will now get the speed of the PHP configured container with the ease of using
335
+ configuration files. In the above example you will need to delete the cached
336
+ container file whenever you make any changes. Adding a check for a variable that
337
+ determines if you are in debug mode allows you to keep the speed of the cached
338
+ container in production but getting an up to date configuration whilst developing
339
+ your application::
340
+
341
+ // ...
342
+
343
+ // set $isDebug based on something in your project
344
+
345
+ $file = __DIR__ .'/cache/container.php';
346
+
347
+ if (!$isDebug && file_exists($file)) {
348
+ require_once $file;
349
+ $container = new MyCachedContainer();
350
+ } else {
351
+ $container = new ContainerBuilder();
352
+ $loader = new XmlFileLoader($container, new FileLocator(__DIR__));
353
+ $loader->load('services.xml');
354
+
355
+ if(!$isDebug) {
356
+ $dumper = new PhpDumper($container);
357
+ file_put_contents($file, $dumper->dump(array('class' => 'MyCachedContainer')));
358
+ }
359
+ }
0 commit comments