Skip to content

Commit e810464

Browse files
started to implement doctrine storage
1 parent 566edd0 commit e810464

File tree

14 files changed

+282
-7
lines changed

14 files changed

+282
-7
lines changed

composer.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,14 @@
1515
"symfony/http-kernel": "^2.6",
1616
"symfony/dependency-injection": "^2.6",
1717
"symfony/config": "^2.6",
18-
"symfony/console": "^2.6"
18+
"symfony/console": "^2.6",
19+
"doctrine/orm": "^2.5"
1920
},
2021
"require-dev": {
2122
"phpunit/phpunit": "^4.8",
2223
"symfony/framework-bundle": "^2.6",
23-
"symfony/finder": "^2.6"
24+
"symfony/finder": "^2.6",
25+
"doctrine/doctrine-bundle": "^1.5"
2426
},
2527
"autoload": {
2628
"psr-4": {

src/DependencyInjection/TaskExtension.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public function load(array $configs, ContainerBuilder $container)
2424

2525
$loader = new Loader\XmlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
2626
$loader->load(sprintf('storage/%s.xml', $config['storage']));
27+
$loader->load('task_event_listener.xml');
2728
$loader->load('scheduler.xml');
2829
$loader->load('command.xml');
2930

src/Entity/Task.php

Lines changed: 86 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,104 @@
22

33
namespace Task\TaskBundle\Entity;
44

5-
use Task\Task as BaseTask;
5+
use Task\TaskInterface;
66

7-
class Task extends BaseTask
7+
class Task
88
{
99
/**
1010
* @var int
1111
*/
1212
private $id;
1313

14+
/**
15+
* @var string
16+
*/
17+
private $uuid;
18+
19+
/**
20+
* @var TaskInterface
21+
*/
22+
private $task;
23+
24+
/**
25+
* @var \DateTime
26+
*/
27+
private $executionDate;
28+
29+
/**
30+
* @var bool
31+
*/
32+
private $completed;
33+
1434
/**
1535
* @return int
1636
*/
1737
public function getId()
1838
{
1939
return $this->id;
2040
}
41+
42+
/**
43+
* @return string
44+
*/
45+
public function getUuid()
46+
{
47+
return $this->uuid;
48+
}
49+
50+
/**
51+
* @param string $uuid
52+
*/
53+
public function setUuid($uuid)
54+
{
55+
$this->uuid = $uuid;
56+
}
57+
58+
/**
59+
* @return TaskInterface
60+
*/
61+
public function getTask()
62+
{
63+
return $this->task;
64+
}
65+
66+
/**
67+
* @param TaskInterface $task
68+
*/
69+
public function setTask($task)
70+
{
71+
$this->task = $task;
72+
}
73+
74+
/**
75+
* @return \DateTime
76+
*/
77+
public function getExecutionDate()
78+
{
79+
return $this->executionDate;
80+
}
81+
82+
/**
83+
* @param \DateTime $executionDate
84+
*/
85+
public function setExecutionDate($executionDate)
86+
{
87+
$this->executionDate = $executionDate;
88+
}
89+
90+
/**
91+
* @return bool
92+
*/
93+
public function isCompleted()
94+
{
95+
return $this->completed;
96+
}
97+
98+
/**
99+
* @param bool $completed
100+
*/
101+
public function setCompleted($completed)
102+
{
103+
$this->completed = $completed;
104+
}
21105
}

src/Entity/TaskRepository.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
namespace Task\TaskBundle\Entity;
4+
5+
use Doctrine\ORM\EntityRepository;
6+
7+
class TaskRepository extends EntityRepository
8+
{
9+
public function findScheduled()
10+
{
11+
$query = $this->createQueryBuilder('task')
12+
->where('completed = FALSE')
13+
->andWhere('executionDate < :date')
14+
->setParameter('date', new \DateTime())
15+
->getQuery();
16+
17+
return $query->getResult();
18+
}
19+
20+
public function findByUuid($uuid)
21+
{
22+
return $this->findBy(['uuid' => $uuid]);
23+
}
24+
}

src/Resources/config/doctrine/Task.orm.xml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,18 @@
22
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
33
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
44
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
5-
<entity name="Task\TaskBundle\Entity\TaskContainer" table="tasks">
5+
<entity name="Task\TaskBundle\Entity\TaskContainer"
6+
repository-class="Task\TaskBundle\Entity\TaskRepository"
7+
table="tasks">
8+
69
<id name="id" type="integer">
710
<generator strategy="AUTO"/>
811
</id>
912

1013
<field name="task" type="object"/>
14+
<field name="uuid" type="string" length="25"/>
15+
<field name="executionDate" type="datetime"/>
1116
<field name="completed" type="boolean"/>
17+
1218
</entity>
1319
</doctrine-mapping>

src/Resources/config/scheduler.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
<argument type="service" id="task.storage"/>
1111
<argument type="service" id="task.handler_registry"/>
1212
<argument type="service" id="task.builder_factory"/>
13+
<argument type="service" id="event_dispatcher"/>
1314
<argument type="service" id="logger" on-invalid="ignore"/>
1415
</service>
1516
</services>
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?xml version="1.0" ?>
2+
<container xmlns="http://symfony.com/schema/dic/services"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
5+
<services>
6+
<service id="task.storage" class="Task\TaskBundle\Storage\DoctrineStorage">
7+
<argument type="service" id="doctrine.orm.entity_manager"/>
8+
</service>
9+
</services>
10+
</container>
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?xml version="1.0" ?>
2+
<container xmlns="http://symfony.com/schema/dic/services"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
5+
6+
<parameters>
7+
<parameter key="task.events.create" type="constant">Task\Event\Events::TASK_CREATE</parameter>
8+
<parameter key="task.events.before" type="constant">Task\Event\Events::TASK_BEFORE</parameter>
9+
<parameter key="task.events.after" type="constant">Task\Event\Events::TASK_AFTER</parameter>
10+
<parameter key="task.events.passed" type="constant">Task\Event\Events::TASK_PASSED</parameter>
11+
<parameter key="task.events.failed" type="constant">Task\Event\Events::TASK_FAILED</parameter>
12+
</parameters>
13+
14+
</container>

src/Storage/DoctrineStorage.php

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
<?php
2+
3+
namespace Task\TaskBundle\Storage;
4+
5+
use Doctrine\ORM\EntityManagerInterface;
6+
use Task\Storage\StorageInterface;
7+
use Task\TaskBundle\Entity\Task as TaskEntity;
8+
use Task\TaskBundle\Entity\TaskRepository;
9+
use Task\TaskInterface;
10+
11+
class DoctrineStorage implements StorageInterface
12+
{
13+
/**
14+
* @var EntityManagerInterface
15+
*/
16+
private $entityManager;
17+
18+
/**
19+
* @var TaskRepository
20+
*/
21+
private $taskRepository;
22+
23+
public function __construct(EntityManagerInterface $entityManager, TaskRepository $taskRepository)
24+
{
25+
$this->entityManager = $entityManager;
26+
$this->taskRepository = $taskRepository;
27+
}
28+
29+
/**
30+
* {@inheritdoc}
31+
*/
32+
public function store(TaskInterface $task)
33+
{
34+
$entity = new TaskEntity();
35+
$this->setTask($entity, $task);
36+
37+
$this->entityManager->persist($entity);
38+
$this->entityManager->flush();
39+
}
40+
41+
/**
42+
* {@inheritdoc}
43+
*/
44+
public function findScheduled()
45+
{
46+
return $this->taskRepository->findScheduled();
47+
}
48+
49+
/**
50+
* {@inheritdoc}
51+
*/
52+
public function findAll()
53+
{
54+
return $this->taskRepository->findAll();
55+
}
56+
57+
/**
58+
* {@inheritdoc}
59+
*/
60+
public function persist(TaskInterface $task)
61+
{
62+
$entity = $this->taskRepository->findByUuid($task->getUuid());
63+
$this->setTask($entity, $task);
64+
65+
$this->entityManager->flush();
66+
}
67+
68+
private function setTask(TaskEntity $entity, TaskInterface $task)
69+
{
70+
$entity->setTask($task);
71+
$entity->setUuid($task->getUuid());
72+
$entity->setCompleted($task->isCompleted());
73+
$entity->setExecutionDate($task->getExecutionDate());
74+
}
75+
}

tests/Functional/BootstrapTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public function testBootstrap()
1717

1818
$this->assertInstanceOf(SchedulerInterface::class, $scheduler);
1919

20-
switch (getenv(\TestKernel::STORAGE_VAR_NAME)) {
20+
switch (self::$kernel->getContainer()->getParameter('kernel.storage')) {
2121
case 'array':
2222
$this->assertInstanceOf(ArrayStorage::class, $storage);
2323
break;

0 commit comments

Comments
 (0)