Skip to content

Commit 5dda8b9

Browse files
committed
wip: Profiler
1 parent 9186fd4 commit 5dda8b9

File tree

17 files changed

+145
-32
lines changed

17 files changed

+145
-32
lines changed

Dockerfile

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ RUN apt-get update \
1010
&& docker-php-ext-enable xdebug \
1111
&& curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
1212

13-
WORKDIR /opt/project
14-
13+
RUN echo "xdebug.client_host=host.docker.internal" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
14+
RUN echo "xdebug.mode=debug,develop" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
1515

16+
WORKDIR /opt/project
1617

18+
CMD ["php", "-S", "0.0.0.0:80", "-t", "/opt/project/tests/App"]

bin/console.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,6 @@
55

66
require __DIR__ . '/../vendor/autoload.php';
77

8-
$console = new Application(new TestKernel('test', true));
8+
$console = new Application(new TestKernel($_ENV['APP_ENV'] ?? 'dev', true));
99

1010
$console->run();

composer.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,10 @@
2929
"symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0",
3030
"symfony/http-kernel": "^5.4 || ^6.0 || ^7.0",
3131
"symfony/routing": "^5.4 || ^6.0 || ^7.0",
32+
"symfony/stopwatch": "^6.4",
3233
"symfony/test-pack": "^1.1",
3334
"symfony/twig-bundle": "^5.4 || ^6.0 || ^7.0",
35+
"symfony/web-profiler-bundle": "^5.4 || ^6.0 || ^7.0",
3436
"symfony/yaml": "^5.4 || ^6.0 || ^7.0",
3537
"vimeo/psalm": "^5.15.0"
3638
},

config/services.php

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,6 @@
1717
return static function (ContainerConfigurator $configurator) {
1818
$services = $configurator->services();
1919

20-
$services->set('neo4j.event_handler', EventHandler::class)
21-
->autowire()
22-
->autoconfigure();
23-
2420
$services->set('neo4j.client_factory', ClientFactory::class)
2521
->args([
2622
service('neo4j.event_handler'),

docker-compose.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ services:
1616
- NEO4J_PORT=7687
1717
- NEO4J_USER=neo4j
1818
- NEO4J_PASSWORD=testtest
19+
- XDEBUG_CONFIG="client_host=host.docker.internal log=/tmp/xdebug.log"
1920
working_dir: /opt/project
2021
networks:
2122
- neo4j-symfony

src/Collector/Neo4jDataCollector.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,6 @@ public function getQueryCount(): int
7878

7979
public static function getTemplate(): ?string
8080
{
81-
return 'web_profiler.html.twig';
81+
return 'data_collector/web_profiler.html.twig';
8282
}
8383
}

src/DependencyInjection/Neo4jExtension.php

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Neo4j\Neo4jBundle\DependencyInjection;
66

77
use Neo4j\Neo4jBundle\Collector\Neo4jDataCollector;
8+
use Neo4j\Neo4jBundle\EventHandler;
89
use Neo4j\Neo4jBundle\EventListener\Neo4jProfileListener;
910
use Psr\Http\Client\ClientInterface;
1011
use Psr\Http\Message\RequestFactoryInterface;
@@ -27,42 +28,63 @@ public function load(array $configs, ContainerBuilder $container): ContainerBuil
2728
$configuration = new Configuration();
2829
$mergedConfig = $this->processConfiguration($configuration, $configs);
2930

30-
$loader = new PhpFileLoader($container, new FileLocator(__DIR__.'/../../config'));
31+
$loader = new PhpFileLoader($container, new FileLocator(__DIR__ . '/../../config'));
3132
$loader->load('services.php');
3233

34+
$defaultAlias = $mergedConfig['default_driver'] ?? $mergedConfig['drivers'][0]['alias'] ?? 'default';
35+
36+
$container->setDefinition('neo4j.event_handler', new Definition(EventHandler::class))
37+
->setAutowired(true)
38+
->addTag('neo4j.event_handler')
39+
->setArgument(1, $defaultAlias);
40+
3341
$container->getDefinition('neo4j.client_factory')
3442
->setArgument(1, $mergedConfig['default_driver_config'] ?? null)
3543
->setArgument(2, $mergedConfig['default_session_config'] ?? null)
3644
->setArgument(3, $mergedConfig['default_transaction_config'] ?? null)
3745
->setArgument(4, $mergedConfig['drivers'] ?? [])
3846
->setArgument(5, $mergedConfig['default_driver'] ?? null)
3947
->setArgument(6, new Reference(ClientInterface::class, ContainerInterface::NULL_ON_INVALID_REFERENCE))
40-
->setArgument(7, new Reference(StreamFactoryInterface::class, ContainerInterface::NULL_ON_INVALID_REFERENCE))
41-
->setArgument(8, new Reference(RequestFactoryInterface::class, ContainerInterface::NULL_ON_INVALID_REFERENCE))
42-
->setAbstract(false)
43-
;
48+
->setArgument(
49+
7,
50+
new Reference(StreamFactoryInterface::class, ContainerInterface::NULL_ON_INVALID_REFERENCE)
51+
)
52+
->setArgument(
53+
8,
54+
new Reference(RequestFactoryInterface::class, ContainerInterface::NULL_ON_INVALID_REFERENCE)
55+
)
56+
->setAbstract(false);
4457

4558
$container->getDefinition('neo4j.driver')
46-
->setArgument(0, $mergedConfig['drivers']['alias'] ?? 'default');
59+
->setArgument(0, $defaultAlias);
4760

4861
$enabledProfiles = [];
4962
foreach ($mergedConfig['drivers'] as $driver) {
50-
if (true === $driver['profiling'] || (null === $driver['profiling'] && $container->getParameter('kernel.debug'))) {
63+
if (true === $driver['profiling'] || (null === $driver['profiling'] && $container->getParameter(
64+
'kernel.debug'
65+
))) {
5166
$enabledProfiles[] = $driver['alias'];
5267
}
5368
}
5469

5570
if (0 !== count($enabledProfiles)) {
56-
$container->setDefinition('neo4j.data_collector', (new Definition(Neo4jDataCollector::class))
57-
->setAutowired(true)
58-
->addTag('data_collector')
71+
$container->setDefinition(
72+
'neo4j.data_collector',
73+
(new Definition(Neo4jDataCollector::class))
74+
->setAutowired(true)
75+
->addTag('data_collector', [
76+
'id' => Neo4jDataCollector::class,
77+
'priority' => 500,
78+
])
5979
);
6080

6181
$container->setAlias(Neo4jProfileListener::class, 'neo4j.subscriber');
6282

63-
$container->setDefinition('neo4j.subscriber', (new Definition(Neo4jProfileListener::class))
64-
->setArgument(0, $enabledProfiles)
65-
->addTag('kernel.event_subscriber')
83+
$container->setDefinition(
84+
'neo4j.subscriber',
85+
(new Definition(Neo4jProfileListener::class))
86+
->setArgument(0, $enabledProfiles)
87+
->addTag('kernel.event_subscriber')
6688
);
6789
}
6890

src/EventHandler.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class EventHandler
2424
{
2525
private ?EventDispatcherInterface $dispatcher;
2626

27-
public function __construct(?EventDispatcherInterface $dispatcher)
27+
public function __construct(?EventDispatcherInterface $dispatcher, private readonly string $alias)
2828
{
2929
$this->dispatcher = $dispatcher;
3030
}
@@ -46,9 +46,9 @@ public function handle(callable $runHandler, Statement $statement, ?string $alia
4646

4747
try {
4848
$tbr = $runHandler($statement);
49-
$this->dispatcher->dispatch(new PostRunEvent($alias, $tbr->getSummary()), PostRunEvent::EVENT_ID);
49+
$this->dispatcher->dispatch(new PostRunEvent($alias ?? $this->alias, $tbr->getSummary()), PostRunEvent::EVENT_ID);
5050
} catch (Neo4jException $e) {
51-
$event = new FailureEvent($alias, $statement, $e);
51+
$event = new FailureEvent($alias ?? $this->alias, $statement, $e);
5252
$event = $this->dispatcher->dispatch($event, FailureEvent::EVENT_ID);
5353

5454
if ($event->shouldThrowException()) {

tests/App/Controller/TestController.php

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Laudis\Neo4j\Contracts\ClientInterface;
66
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
77
use Symfony\Component\HttpFoundation\Response;
8+
use Symfony\Component\HttpKernel\Profiler\Profiler;
89

910
class TestController extends AbstractController
1011
{
@@ -13,11 +14,18 @@ public function __construct(
1314
) {
1415
}
1516

16-
public function __invoke(): Response
17+
public function __invoke(Profiler $profiler): Response
1718
{
19+
// dd($profiler->loadProfile('0a1909'));
20+
// Successful statement
1821
$this->client->run('MATCH (n) RETURN n');
19-
$this->client->run('MATCH (n) RETURN n');
22+
try {
23+
// Failing statement
24+
$this->client->run('MATCH (n) {x: $x}', ['x' => 1]);
25+
} catch (\Exception $e) {
26+
// ignore
27+
}
2028

21-
return $this->render('index.twig.html');
29+
return $this->render('index.html.twig');
2230
}
2331
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<meta charset="UTF-8">
5+
<title>{% block title %}My Application{% endblock %}</title>
6+
{% block stylesheets %}
7+
{# Include your stylesheets here #}
8+
{% endblock %}
9+
</head>
10+
<body>
11+
<header>
12+
{# Include your navigation/header here #}
13+
</header>
14+
15+
<main>
16+
{% block body %}{% endblock %}
17+
</main>
18+
19+
<footer>
20+
{# Include your footer here #}
21+
</footer>
22+
23+
{% block javascripts %}
24+
{# Include your JavaScripts here #}
25+
{% endblock %}
26+
</body>
27+
</html>

0 commit comments

Comments
 (0)