Skip to content

Commit a6e7858

Browse files
Merge pull request #3 from dayspring-tech/feature/symfony_6
Provide support for Symfony ^6.0
2 parents dc10ff2 + 5d57c21 commit a6e7858

File tree

17 files changed

+401
-52
lines changed

17 files changed

+401
-52
lines changed

.github/workflows/ci.yml

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,35 @@ jobs:
1111
fail-fast: false
1212
matrix:
1313
php:
14-
- '7.4'
1514
- '8.0'
1615
- '8.1'
1716
- '8.2'
18-
composer:
19-
- ''
20-
- '--prefer-lowest'
17+
- '8.3'
18+
- '8.4'
19+
symfony_version:
20+
- '4.4.*'
21+
- '5.4.*'
22+
- '6.0.*'
23+
- '6.1.*'
24+
- '6.2.*'
25+
- '6.3.*'
26+
- '6.4.*'
27+
exclude:
28+
# symfony 6.1+ requires PHP 8.1+
29+
- php: '8.0'
30+
symfony_version: '6.1.*'
31+
- php: '8.0'
32+
symfony_version: '6.2.*'
33+
- php: '8.0'
34+
symfony_version: '6.3.*'
35+
- php: '8.0'
36+
symfony_version: '6.4.*'
37+
# deps:
38+
# - 'highest'
39+
# - 'lowest'
2140

2241
steps:
23-
- uses: actions/checkout@v3
42+
- uses: actions/checkout@v4
2443

2544
- name: Use PHP
2645
uses: shivammathur/setup-php@v2
@@ -37,23 +56,28 @@ jobs:
3756
working-directory: ./
3857

3958
- name: cache dependencies
40-
id: cache-dependencies
41-
uses: actions/cache@v3
59+
id: angular-dependencies
60+
uses: actions/cache@v4
4261
with:
4362
path: ${{ steps.composer-cache.outputs.dir }}
4463
key: ${{ runner.os }}-${{ matrix.php }}-${{ matrix.composer }}-composer-${{ hashFiles('**/composer.lock') }}
4564
restore-keys: |
4665
${{ runner.os }}-${{ matrix.php }}-${{ matrix.composer }}-composer-
4766
67+
- name: Set Symfony minor version
68+
run: |
69+
sed -i 's|\("symfony/.*"\): ".*^6\.0"|\1: "${{ matrix.symfony_version }}"|' composer.json
70+
working-directory: ./
71+
4872
- name: Validate composer.json and composer.lock
4973
run: composer validate
5074
working-directory: ./
5175

5276
- name: Install dependencies
53-
env:
54-
COMPOSER_FLAGS: ${{ matrix.composer }}
55-
run: composer update ${COMPOSER_FLAGS} --prefer-source
56-
working-directory: ./
77+
uses: ramsey/composer-install@v3
78+
with:
79+
# dependency-versions: '${{ matrix.deps }}'
80+
working-directory: ./
5781

5882
- name: Run Tests
5983
run: composer run-script ci-test

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,5 @@
22
/build/
33
/composer.lock
44
/.phpunit.result.cache
5+
6+
var/cache/

DependencyInjection/Configuration.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class Configuration implements ConfigurationInterface
1515
/**
1616
* {@inheritdoc}
1717
*/
18-
public function getConfigTreeBuilder()
18+
public function getConfigTreeBuilder(): TreeBuilder
1919
{
2020
$treeBuilder = new TreeBuilder('dayspring_logging');
2121
$rootNode = $treeBuilder->getRootNode();

DependencyInjection/DayspringLoggingExtension.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,12 @@ public function load(array $configs, ContainerBuilder $container)
2626

2727
foreach ($config['session_request_processor_handlers'] as $handler) {
2828
$definition = new Definition(SessionRequestProcessor::class);
29-
$definition->addTag('monolog.processor', array('handler' => $handler));
29+
$definition->addTag('monolog.processor', ['handler' => $handler]);
3030
$definition->setAutowired(true);
3131

32-
$container->addDefinitions(array(
32+
$container->addDefinitions([
3333
'dayspring_logging.session_request_processor.'.$handler => $definition
34-
));
34+
]);
3535
}
3636
}
3737
}

Logger/SessionRequestProcessor.php

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,12 @@
44

55
use Exception;
66
use Symfony\Component\HttpFoundation\RequestStack;
7-
use Symfony\Component\HttpFoundation\Session\SessionInterface;
87
use Symfony\Component\Routing\Matcher\RequestMatcherInterface;
98
use Symfony\Component\Routing\Matcher\UrlMatcherInterface;
109

1110
class SessionRequestProcessor
1211
{
1312

14-
/** @var SessionInterface $session */
15-
private $session;
1613
/** @var RequestStack $requestStack */
1714
private $requestStack;
1815
/** @var UrlMatcherInterface|RequestMatcherInterface $matcher */
@@ -26,16 +23,15 @@ class SessionRequestProcessor
2623

2724
protected $extraFields = [];
2825

29-
public function __construct(SessionInterface $session, RequestStack $requestStack, UrlMatcherInterface $matcher)
26+
public function __construct(RequestStack $requestStack, UrlMatcherInterface $matcher)
3027
{
31-
$this->session = $session;
3228
$this->requestStack = $requestStack;
3329
$this->matcher = $matcher;
3430
}
3531

3632
protected function getServerVar($var)
3733
{
38-
return isset($_SERVER[$var]) ? $_SERVER[$var] : null;
34+
return $_SERVER[$var] ?? null;
3935
}
4036

4137
public function setExtraField($key, $value)
@@ -51,32 +47,33 @@ public function unsetExtraField($key)
5147
public function clearExtraFields()
5248
{
5349
$this->extraFields = [];
54-
}
50+
}
5551

5652
public function __invoke(array $record)
5753
{
5854
if (null === $this->requestId) {
59-
if ('cli' === php_sapi_name()) {
60-
$this->sessionId = getmypid();
61-
} else {
62-
try {
63-
$this->session->start();
64-
$this->sessionId = $this->session->getId();
65-
} catch (\RuntimeException $e) {
66-
$this->sessionId = '????????';
67-
}
68-
}
6955
$this->requestId = substr(uniqid(), -8);
70-
$this->_server = array(
56+
$this->_server = [
7157
'http.url' => ($this->getServerVar('HTTP_HOST')).'/'.($this->getServerVar('REQUEST_URI')),
7258
'http.method' => $this->getServerVar('REQUEST_METHOD'),
7359
'http.useragent' => $this->getServerVar('HTTP_USER_AGENT'),
7460
'http.referer' => $this->getServerVar('HTTP_REFERER'),
7561
'http.x_forwarded_for' => $this->getServerVar('HTTP_X_FORWARDED_FOR')
76-
);
62+
];
7763
$this->_post = $this->clean($_POST);
7864
$this->_get = $this->clean($_GET);
7965
}
66+
if (null === $this->sessionId) {
67+
if (!array_key_exists('SERVER_NAME', $_SERVER)) {
68+
$this->sessionId = getmypid();
69+
} elseif ($this->requestStack->getMainRequest() && $this->requestStack->getMainRequest()->hasSession()) {
70+
try {
71+
$this->sessionId = $this->requestStack->getSession()->getId();
72+
} catch (\RuntimeException $e) {
73+
$this->sessionId = '????????';
74+
}
75+
}
76+
}
8077
$record['http.request_id'] = $this->requestId;
8178
$record['http.session_id'] = $this->sessionId;
8279
$record['http.url'] = $this->_server['http.url'];
@@ -97,7 +94,7 @@ public function __invoke(array $record)
9794
} else {
9895
$parameters = $this->matcher->match($request->getPathInfo());
9996
}
100-
$context['route'] = isset($parameters['_route']) ? $parameters['_route'] : 'n/a';
97+
$context['route'] = $parameters['_route'] ?? 'n/a';
10198
$context['route_parameters'] = $parameters;
10299
} catch (Exception $e) {
103100
}
@@ -129,7 +126,7 @@ protected function getMainRequest()
129126

130127
protected function clean($array)
131128
{
132-
$toReturn = array();
129+
$toReturn = [];
133130
foreach (array_keys($array) as $key) {
134131
if (false !== strpos($key, 'password')) {
135132
// Do not add

Tests/DependencyInjection/ConfigurationTest.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@ class ConfigurationTest extends TestCase
1717

1818
public function testConfiguration()
1919
{
20-
$config = array();
20+
$config = [];
2121

2222
$processor = new Processor();
23-
$configuration = new Configuration(array());
24-
$config = $processor->processConfiguration($configuration, array($config));
23+
$configuration = new Configuration([]);
24+
$config = $processor->processConfiguration($configuration, [$config]);
2525

2626
$this->assertEquals([
2727
'session_request_processor_handlers' => []

Tests/DependencyInjection/ExtensionTest.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public function testLoadEmptyConfiguration()
2020
{
2121
$container = $this->createContainer();
2222
$extension = new DayspringLoggingExtension();
23-
$extension->load(array(), $container);
23+
$extension->load([], $container);
2424
$container->registerExtension($extension);
2525

2626
$this->compileContainer($container);
@@ -32,19 +32,19 @@ public function testLoadEmptyConfiguration()
3232

3333
private function createContainer()
3434
{
35-
$container = new ContainerBuilder(new ParameterBag(array(
35+
$container = new ContainerBuilder(new ParameterBag([
3636
'kernel.cache_dir' => __DIR__,
3737
'kernel.charset' => 'UTF-8',
3838
'kernel.debug' => false,
39-
)));
39+
]));
4040

4141
return $container;
4242
}
4343

4444
private function compileContainer(ContainerBuilder $container)
4545
{
46-
$container->getCompilerPassConfig()->setOptimizationPasses(array());
47-
$container->getCompilerPassConfig()->setRemovingPasses(array());
46+
$container->getCompilerPassConfig()->setOptimizationPasses([]);
47+
$container->getCompilerPassConfig()->setRemovingPasses([]);
4848
$container->compile();
4949
}
5050
}

Tests/Logger/SessionRequestProcessorTest.php

Lines changed: 92 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,32 @@
99
use Symfony\Component\HttpFoundation\Request;
1010
use Symfony\Component\HttpFoundation\RequestStack;
1111
use Symfony\Component\HttpFoundation\Session\Session;
12-
use Symfony\Component\HttpFoundation\Session\SessionFactory;
12+
use Symfony\Component\HttpFoundation\Session\Storage\MockFileSessionStorage;
1313
use Symfony\Component\Routing\Router;
1414
use function var_dump;
1515

1616
class SessionRequestProcessorTest extends TestCase
1717
{
18+
protected function setUp(): void
19+
{
20+
parent::setUp();
21+
22+
$_SERVER['SERVER_NAME'] = 'test';
23+
}
24+
1825
public function testProcessor()
1926
{
20-
$session = new Session();
27+
$request = Request::create('/', 'GET');
28+
$request->setSession(new Session(new MockFileSessionStorage()));
29+
2130
$requestStack = new RequestStack();
22-
$requestStack->push(Request::create('/', 'GET'));
31+
$requestStack->push($request);
2332
$router = $this->createPartialMock(Router::class, ['matchRequest']);
2433
$router->expects($this->once())
2534
->method('matchRequest')
2635
->willReturn(['_route' => 'test']);
2736

28-
$processor = new SessionRequestProcessor($session, $requestStack, $router);
37+
$processor = new SessionRequestProcessor($requestStack, $router);
2938

3039
$handler = new TestHandler();
3140

@@ -39,5 +48,84 @@ public function testProcessor()
3948
$record = $records[0];
4049
$this->assertEquals('test', $record['context']['route']);
4150
$this->assertEquals('test', $record['context']['route_parameters']['_route']);
51+
$this->assertArrayHasKey('http.session_id', $record);
52+
}
53+
54+
public function testProcessorCli()
55+
{
56+
unset($_SERVER['SERVER_NAME']);
57+
58+
$requestStack = new RequestStack();
59+
$router = $this->createPartialMock(Router::class, ['matchRequest']);
60+
61+
$processor = new SessionRequestProcessor($requestStack, $router);
62+
63+
$handler = new TestHandler();
64+
65+
$logger = new Logger('test', [$handler], [$processor]);
66+
67+
$logger->info('test');
68+
69+
$records = $handler->getRecords();
70+
71+
$this->assertCount(1, $records);
72+
$record = $records[0];
73+
$this->assertArrayHasKey('http.session_id', $record);
74+
$this->assertEquals($record['http.session_id'], getmypid());
75+
76+
}
77+
78+
public function testProcessorNoRequest()
79+
{
80+
$requestStack = new RequestStack();
81+
$router = $this->createPartialMock(Router::class, ['matchRequest']);
82+
83+
$processor = new SessionRequestProcessor($requestStack, $router);
84+
85+
$handler = new TestHandler();
86+
87+
$logger = new Logger('test', [$handler], [$processor]);
88+
89+
$logger->info('test');
90+
91+
$records = $handler->getRecords();
92+
93+
$this->assertCount(1, $records);
94+
$record = $records[0];
95+
$this->assertArrayNotHasKey('route', $record['context']);
96+
$this->assertNull($record['http.session_id']);
97+
}
98+
99+
100+
public function testProcessorRequestAddedLater()
101+
{
102+
$requestStack = new RequestStack();
103+
$router = $this->createPartialMock(Router::class, ['matchRequest']);
104+
105+
$processor = new SessionRequestProcessor($requestStack, $router);
106+
107+
$handler = new TestHandler();
108+
109+
$logger = new Logger('test', [$handler], [$processor]);
110+
111+
$logger->info('test');
112+
113+
$request = Request::create('/', 'GET');
114+
$request->setSession(new Session(new MockFileSessionStorage()));
115+
$requestStack->push($request);
116+
117+
$logger->info('test with session');
118+
119+
$records = $handler->getRecords();
120+
121+
$this->assertCount(2, $records);
122+
$record = $records[0];
123+
$this->assertArrayNotHasKey('route', $record['context']);
124+
$this->assertNull($record['http.session_id']);
125+
126+
$record2 = $records[1];
127+
$this->assertArrayHasKey('route', $record2['context']);
128+
$this->assertNotNull($record2['http.session_id']);
129+
$this->assertEquals($record['http.request_id'], $record2['http.request_id']);
42130
}
43131
}

0 commit comments

Comments
 (0)