Skip to content

Commit aa25c81

Browse files
author
Robin Cawser
committed
Add nullOnly flag for annotations
1 parent 3a835b4 commit aa25c81

4 files changed

Lines changed: 67 additions & 6 deletions

File tree

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
"require": {
1313
"php": ">=5.3.3",
1414
"doctrine/common": "~2.2",
15+
"doctrine/orm": "~2.2",
1516
"symfony/security": "~2.1"
1617
},
1718
"require-dev": {

spec/Vivait/StringGeneratorBundle/EventListener/GeneratorListenerSpec.php

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,12 @@
33
namespace spec\Vivait\StringGeneratorBundle\EventListener;
44

55
use Doctrine\Common\Annotations\Reader;
6+
7+
8+
use Doctrine\ORM\EntityManagerInterface;
9+
use Doctrine\ORM\EntityRepository;
10+
use Doctrine\ORM\Event\LifecycleEventArgs;
11+
use Doctrine\ORM\Mapping\ClassMetadata;
612
use PhpSpec\ObjectBehavior;
713
use Prophecy\Argument;
814
use Vivait\StringGeneratorBundle\Annotation\GeneratorAnnotation;
@@ -16,9 +22,17 @@ function it_is_initializable()
1622
$this->shouldHaveType('Vivait\StringGeneratorBundle\EventListener\GeneratorListener');
1723
}
1824

19-
function let(Reader $reader, Registry $registry)
25+
function let(Reader $reader, Registry $registry, Entity $mockEntity, EntityRepository $entityRepository, ClassMetadata $meta, EntityManagerInterface $entityManager, LifecycleEventArgs $args)
2026
{
2127
$this->beConstructedWith($reader, $registry);
28+
29+
//Set up for EM etc.
30+
$args->getEntity()->willReturn($mockEntity);
31+
$args->getEntityManager()->willReturn($entityManager);
32+
$entityManager->getClassMetadata(Argument::any())->willReturn($meta);
33+
$entityManager->getRepository(Argument::any())->willReturn($entityRepository);
34+
$meta->getName()->willReturn('Entity');
35+
2236
}
2337

2438
function it_performs_callbacks_on_the_generator(StringGenerator $generator, Entity $mockEntity)
@@ -40,13 +54,48 @@ function it_can_get_callback_values_from_annotated_object(StringGenerator $gener
4054
$generator->setPrefix('VIVA_')->shouldBeCalled();
4155
$this->performCallbacks($generator, $annotation, $mockEntity);
4256
}
57+
58+
function it_sets_only_null_properties_if_specified(Reader $reader, LifecycleEventArgs $args, StringGenerator $generator, Entity $mockEntity)
59+
{
60+
$mockEntity->setName(null);
61+
62+
$annotation = new GeneratorAnnotation([]);
63+
$annotation->nullOnly = true;
64+
65+
$reader->getPropertyAnnotations(Argument::any())->willReturn([$annotation]);
66+
67+
$generator->generate()->shouldNotBeCalled();
68+
$this->prePersist($args);
69+
}
70+
71+
function it_generates_a_string_on_a_property(Registry $registry, Reader $reader, LifecycleEventArgs $args, StringGenerator $generator)
72+
{
73+
$annotation = new GeneratorAnnotation([]);
74+
75+
$reader->getPropertyAnnotations(Argument::any())->willReturn([$annotation]);
76+
77+
$registry->get(Argument::any())->willReturn($generator);
78+
79+
$generator->generate()->shouldBeCalled();
80+
$generator->setLength(Argument::any())->shouldBeCalled();
81+
82+
83+
$this->prePersist($args);
84+
}
4385
}
4486

4587
class Entity
4688
{
89+
private $name;
90+
4791
public function getPrefix()
4892
{
4993

5094
}
95+
96+
public function setName($name)
97+
{
98+
$this->name = $name;
99+
}
51100
}
52101

src/Vivait/StringGeneratorBundle/Annotation/GeneratorAnnotation.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,6 @@ class GeneratorAnnotation extends Annotation
2727
* @var boolean
2828
*/
2929
public $unique = true;
30+
31+
public $nullOnly = false;
3032
}

src/Vivait/StringGeneratorBundle/EventListener/GeneratorListener.php

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,21 @@
33
namespace Vivait\StringGeneratorBundle\EventListener;
44

55
use Doctrine\Common\Annotations\Reader;
6+
use Doctrine\ORM\EntityRepository;
67
use Doctrine\ORM\Event\LifecycleEventArgs;
78
use Vivait\StringGeneratorBundle\Annotation\GeneratorAnnotation;
89
use Vivait\StringGeneratorBundle\Model\GeneratorInterface;
910
use Vivait\StringGeneratorBundle\Registry\Registry;
1011

1112
class GeneratorListener
1213
{
14+
/**
15+
* @var Reader
16+
*/
1317
private $reader;
18+
/**
19+
* @var EntityRepository
20+
*/
1421
private $repo;
1522
/**
1623
* @var GeneratorInterface
@@ -45,11 +52,15 @@ public function prePersist(LifecycleEventArgs $args)
4552

4653
foreach ($object->getProperties() as $property) {
4754
foreach ($this->reader->getPropertyAnnotations($property) as $annotation) {
48-
4955
if ($annotation instanceof GeneratorAnnotation) {
50-
$string = $this->generateString($property->name, $annotation, $object);
5156

52-
$meta->getReflectionProperty($property->name)->setValue($entity, $string);
57+
$property->setAccessible(true);
58+
if ($annotation->nullOnly && !$property->getValue($object)) {
59+
break;
60+
}
61+
62+
$string = $this->generateString($property->name, $annotation, $object);
63+
$property->setValue($entity, $string);
5364
}
5465
}
5566
}
@@ -77,13 +88,11 @@ private function generateString($property, GeneratorAnnotation $annotation, $obj
7788
return $str;
7889
}
7990

80-
8191
if ($this->repo->findOneBy([$property => $str])) {
8292
return $this->generateString($property, $annotation, $object);
8393
} else {
8494
return $str;
8595
}
86-
8796
}
8897

8998
/**

0 commit comments

Comments
 (0)