Skip to content

Commit 6c48b49

Browse files
authored
Merge pull request #113 from ssnepenthe/container-performance
Use PHP-DI ContainerBuilder over direct Container manipulation
2 parents 05707b6 + 095a913 commit 6c48b49

File tree

6 files changed

+67
-59
lines changed

6 files changed

+67
-59
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@
33
/vendor/
44
/logs/*
55
!/logs/README.md
6+
/var/cache/*

app/dependencies.php

+14-15
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,27 @@
22
declare(strict_types=1);
33

44
use DI\Container;
5+
use DI\ContainerBuilder;
56
use Monolog\Handler\StreamHandler;
67
use Monolog\Logger;
78
use Monolog\Processor\UidProcessor;
89
use Psr\Log\LoggerInterface;
9-
use Slim\App;
1010

11-
return function (App $app) {
12-
/** @var Container $container */
13-
$container = $app->getContainer();
11+
return function (ContainerBuilder $containerBuilder) {
12+
$containerBuilder->addDefinitions([
13+
LoggerInterface::class => function (Container $c) {
14+
$settings = $c->get('settings');
1415

15-
$container->set(LoggerInterface::class, function (Container $c) {
16-
$settings = $c->get('settings');
16+
$loggerSettings = $settings['logger'];
17+
$logger = new Logger($loggerSettings['name']);
1718

18-
$loggerSettings = $settings['logger'];
19-
$logger = new Logger($loggerSettings['name']);
19+
$processor = new UidProcessor();
20+
$logger->pushProcessor($processor);
2021

21-
$processor = new UidProcessor();
22-
$logger->pushProcessor($processor);
22+
$handler = new StreamHandler($loggerSettings['path'], $loggerSettings['level']);
23+
$logger->pushHandler($handler);
2324

24-
$handler = new StreamHandler($loggerSettings['path'], $loggerSettings['level']);
25-
$logger->pushHandler($handler);
26-
27-
return $logger;
28-
});
25+
return $logger;
26+
},
27+
]);
2928
};

app/repositories.php

+5-7
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,11 @@
33

44
use App\Domain\User\UserRepository;
55
use App\Infrastructure\Persistence\User\InMemoryUserRepository;
6-
use DI\Container;
7-
use Slim\App;
8-
9-
return function (App $app) {
10-
/** @var Container $container */
11-
$container = $app->getContainer();
6+
use DI\ContainerBuilder;
127

8+
return function (ContainerBuilder $containerBuilder) {
139
// Here we map our UserRepository interface to its in memory implementation
14-
$container->set(UserRepository::class, \DI\autowire(InMemoryUserRepository::class));
10+
$containerBuilder->addDefinitions([
11+
UserRepository::class => \DI\autowire(InMemoryUserRepository::class),
12+
]);
1513
};

app/settings.php

+10-12
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,19 @@
11
<?php
22
declare(strict_types=1);
33

4-
use DI\Container;
4+
use DI\ContainerBuilder;
55
use Monolog\Logger;
6-
use Slim\App;
7-
8-
return function (App $app) {
9-
/** @var Container $container */
10-
$container = $app->getContainer();
116

7+
return function (ContainerBuilder $containerBuilder) {
128
// Global Settings Object
13-
$container->set('settings', [
14-
'displayErrorDetails' => true, // Should be set to false in production
15-
'logger' => [
16-
'name' => 'slim-app',
17-
'path' => isset($_ENV['docker']) ? 'php://stdout' : __DIR__ . '/../logs/app.log',
18-
'level' => Logger::DEBUG,
9+
$containerBuilder->addDefinitions([
10+
'settings' => [
11+
'displayErrorDetails' => true, // Should be set to false in production
12+
'logger' => [
13+
'name' => 'slim-app',
14+
'path' => isset($_ENV['docker']) ? 'php://stdout' : __DIR__ . '/../logs/app.log',
15+
'level' => Logger::DEBUG,
16+
],
1917
],
2018
]);
2119
};

public/index.php

+20-13
Original file line numberDiff line numberDiff line change
@@ -4,36 +4,43 @@
44
use App\Application\Handlers\HttpErrorHandler;
55
use App\Application\Handlers\ShutdownHandler;
66
use App\Application\ResponseEmitter\ResponseEmitter;
7-
use DI\Container;
7+
use DI\ContainerBuilder;
88
use Slim\Factory\AppFactory;
99
use Slim\Factory\ServerRequestCreatorFactory;
1010

1111
require __DIR__ . '/../vendor/autoload.php';
1212

13-
// Instantiate PHP-DI Container
14-
$container = new Container();
13+
// Instantiate PHP-DI ContainerBuilder
14+
$containerBuilder = new ContainerBuilder();
1515

16-
// Instantiate the app
17-
AppFactory::setContainer($container);
18-
$app = AppFactory::create();
19-
$callableResolver = $app->getCallableResolver();
16+
if (false) { // Should be set to true in production
17+
$containerBuilder->enableCompilation(__DIR__ . '/../var/cache');
18+
}
2019

2120
// Set up settings
2221
$settings = require __DIR__ . '/../app/settings.php';
23-
$settings($app);
22+
$settings($containerBuilder);
2423

2524
// Set up dependencies
2625
$dependencies = require __DIR__ . '/../app/dependencies.php';
27-
$dependencies($app);
26+
$dependencies($containerBuilder);
27+
28+
// Set up repositories
29+
$repositories = require __DIR__ . '/../app/repositories.php';
30+
$repositories($containerBuilder);
31+
32+
// Build PHP-DI Container instance
33+
$container = $containerBuilder->build();
34+
35+
// Instantiate the app
36+
AppFactory::setContainer($container);
37+
$app = AppFactory::create();
38+
$callableResolver = $app->getCallableResolver();
2839

2940
// Register middleware
3041
$middleware = require __DIR__ . '/../app/middleware.php';
3142
$middleware($app);
3243

33-
// Set up repositories
34-
$repositories = require __DIR__ . '/../app/repositories.php';
35-
$repositories($app);
36-
3744
// Register routes
3845
$routes = require __DIR__ . '/../app/routes.php';
3946
$routes($app);

tests/TestCase.php

+17-12
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
namespace Tests;
55

6-
use DI\Container;
6+
use DI\ContainerBuilder;
77
use Exception;
88
use PHPUnit\Framework\TestCase as PHPUnit_TestCase;
99
use Psr\Http\Message\ServerRequestInterface as Request;
@@ -22,29 +22,34 @@ class TestCase extends PHPUnit_TestCase
2222
*/
2323
protected function getAppInstance(): App
2424
{
25-
// Instantiate PHP-DI Container
26-
$container = new Container();
25+
// Instantiate PHP-DI ContainerBuilder
26+
$containerBuilder = new ContainerBuilder();
2727

28-
// Instantiate the app
29-
AppFactory::setContainer($container);
30-
$app = AppFactory::create();
28+
// Container intentionally not compiled for tests.
3129

3230
// Set up settings
3331
$settings = require __DIR__ . '/../app/settings.php';
34-
$settings($app);
32+
$settings($containerBuilder);
3533

3634
// Set up dependencies
3735
$dependencies = require __DIR__ . '/../app/dependencies.php';
38-
$dependencies($app);
36+
$dependencies($containerBuilder);
37+
38+
// Set up repositories
39+
$repositories = require __DIR__ . '/../app/repositories.php';
40+
$repositories($containerBuilder);
41+
42+
// Build PHP-DI Container instance
43+
$container = $containerBuilder->build();
44+
45+
// Instantiate the app
46+
AppFactory::setContainer($container);
47+
$app = AppFactory::create();
3948

4049
// Register middleware
4150
$middleware = require __DIR__ . '/../app/middleware.php';
4251
$middleware($app);
4352

44-
// Set up repositories
45-
$repositories = require __DIR__ . '/../app/repositories.php';
46-
$repositories($app);
47-
4853
// Register routes
4954
$routes = require __DIR__ . '/../app/routes.php';
5055
$routes($app);

0 commit comments

Comments
 (0)