Skip to content

Commit 806a917

Browse files
added task-execution listener to clear entity-manager
1 parent 963f20a commit 806a917

File tree

6 files changed

+110
-7
lines changed

6 files changed

+110
-7
lines changed

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
],
1212
"require": {
1313
"php": "~5.5 || ~7.0",
14-
"php-task/php-task": "dev-master",
14+
"php-task/php-task": "dev-bugfix/event-after",
1515
"symfony/http-kernel": "^2.6 || ^3.0",
1616
"symfony/dependency-injection": "^2.6 || ^3.0",
1717
"symfony/config": "^2.6 || ^3.0",

src/DependencyInjection/Configuration.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,17 @@ public function getConfigTreeBuilder()
2929
$treeBuilder->root('task')
3030
->children()
3131
->enumNode('storage')->values(['array', 'doctrine'])->defaultValue('doctrine')->end()
32+
->arrayNode('adapters')
33+
->addDefaultsIfNotSet()
34+
->children()
35+
->arrayNode('doctrine')
36+
->addDefaultsIfNotSet()
37+
->children()
38+
->booleanNode('clear')->defaultTrue()->end()
39+
->end()
40+
->end()
41+
->end()
42+
->end()
3243
->arrayNode('run')
3344
->addDefaultsIfNotSet()
3445
->children()

src/DependencyInjection/TaskExtension.php

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,12 @@
1313

1414
use Symfony\Component\Config\FileLocator;
1515
use Symfony\Component\DependencyInjection\ContainerBuilder;
16+
use Symfony\Component\DependencyInjection\Definition;
1617
use Symfony\Component\DependencyInjection\Loader;
1718
use Symfony\Component\DependencyInjection\Reference;
1819
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
20+
use Task\Event\Events;
21+
use Task\TaskBundle\EventListener\TaskExecutionListener;
1922

2023
/**
2124
* Container extension for php-task library.
@@ -40,12 +43,24 @@ public function load(array $configs, ContainerBuilder $container)
4043
$loader->load('listener.xml');
4144
}
4245

43-
if ('doctrine' === $config['storage']) {
44-
// FIXME move to compiler pass
45-
$container->getDefinition('task.command.schedule_task')
46-
->addArgument(new Reference('doctrine.orm.entity_manager'));
47-
$container->getDefinition('task.command.run')
48-
->addArgument(new Reference('doctrine.orm.entity_manager'));
46+
$this->loadDoctrineAdapter($config['adapters']['doctrine'], $container);
47+
}
48+
49+
/**
50+
* Load doctrine adapter.
51+
*
52+
* @param array $config
53+
* @param ContainerBuilder $container
54+
*/
55+
private function loadDoctrineAdapter(array $config, ContainerBuilder $container)
56+
{
57+
if ($config['clear']) {
58+
$definition = new Definition(TaskExecutionListener::class, [new Reference('doctrine.orm.entity_manager')]);
59+
$definition->addTag(
60+
'kernel.event_dispatcher',
61+
['event' => Events::TASK_AFTER, 'method' => 'clearEntityManagerAfterTask']
62+
);
63+
$container->setDefinition('task.adapter.doctrine.execution_listener', $definition);
4964
}
5065
}
5166
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
3+
/*
4+
* This file is part of php-task library.
5+
*
6+
* (c) php-task
7+
*
8+
* This source file is subject to the MIT license that is bundled
9+
* with this source code in the file LICENSE.
10+
*/
11+
12+
namespace Task\TaskBundle\EventListener;
13+
14+
use Doctrine\ORM\EntityManagerInterface;
15+
use Task\Event\TaskExecutionEvent;
16+
17+
/**
18+
* Listens on task-execution events.
19+
*/
20+
class TaskExecutionListener
21+
{
22+
/**
23+
* @var EntityManagerInterface
24+
*/
25+
private $entityManager;
26+
27+
/**
28+
* @param EntityManagerInterface $entityManager
29+
*/
30+
public function __construct(EntityManagerInterface $entityManager)
31+
{
32+
$this->entityManager = $entityManager;
33+
}
34+
35+
/**
36+
* This method clears the entity-manager after each task to ensure clean state before next task.
37+
*
38+
* @param TaskExecutionEvent $event
39+
*/
40+
public function clearEntityManagerAfterTask(TaskExecutionEvent $event)
41+
{
42+
$this->entityManager->clear();
43+
}
44+
}

src/Resources/config/task_event_listener.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
<parameter key="task.events.create" type="constant">Task\Event\Events::TASK_CREATE</parameter>
88
<parameter key="task.events.create_execution" type="constant">Task\Event\Events::TASK_EXECUTION_CREATE</parameter>
99
<parameter key="task.events.before" type="constant">Task\Event\Events::TASK_BEFORE</parameter>
10+
<parameter key="task.events.after" type="constant">Task\Event\Events::TASK_AFTER</parameter>
1011
<parameter key="task.events.finished" type="constant">Task\Event\Events::TASK_FINISHED</parameter>
1112
<parameter key="task.events.passed" type="constant">Task\Event\Events::TASK_PASSED</parameter>
1213
<parameter key="task.events.failed" type="constant">Task\Event\Events::TASK_FAILED</parameter>
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
3+
/*
4+
* This file is part of php-task library.
5+
*
6+
* (c) php-task
7+
*
8+
* This source file is subject to the MIT license that is bundled
9+
* with this source code in the file LICENSE.
10+
*/
11+
12+
namespace Task\TaskBundle\Tests\Unit\EventListener;
13+
14+
use Doctrine\ORM\EntityManagerInterface;
15+
use Task\Event\TaskExecutionEvent;
16+
use Task\TaskBundle\EventListener\TaskExecutionListener;
17+
18+
/**
19+
* Tests for class TaskExecutionListener.
20+
*/
21+
class TaskExecutionListenerTest extends \PHPUnit_Framework_TestCase
22+
{
23+
public function testClearEntityManagerAfterTask()
24+
{
25+
$entityManager = $this->prophesize(EntityManagerInterface::class);
26+
27+
$listener = new TaskExecutionListener($entityManager->reveal());
28+
$listener->clearEntityManagerAfterTask($this->prophesize(TaskExecutionEvent::class)->reveal());
29+
30+
$entityManager->clear()->shouldBeCalled();
31+
}
32+
}

0 commit comments

Comments
 (0)