Completed
Push — master ( da1994...a846d4 )
by Adrien
11s
created

BadgeCompletionSaver::save()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 20
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 20
rs 9.4285
c 0
b 0
f 0
cc 3
eloc 12
nc 3
nop 2
1
<?php
2
3
namespace Badger\Bundle\GameBundle\Doctrine\Saver;
4
5
use Badger\Bundle\GameBundle\GameEvents;
6
use Badger\Component\StorageUtils\Saver\SaverInterface;
7
use Badger\Bundle\GameBundle\Event\BadgeUnlockEvent;
8
use Doctrine\Common\Persistence\ObjectManager;
9
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
10
use Symfony\Component\Security\Acl\Util\ClassUtils;
11
12
/**
13
 * @author  Adrien Pétremann <[email protected]>
14
 * @license http://opensource.org/licenses/MIT The MIT License (MIT)
15
 */
16
class BadgeCompletionSaver implements SaverInterface
17
{
18
    /** @var ObjectManager */
19
    protected $objectManager;
20
21
    /** @var EventDispatcherInterface */
22
    protected $eventDispatcher;
23
24
    /** @var string */
25
    protected $savedClass;
26
27
    /**
28
     * @param ObjectManager            $objectManager
29
     * @param EventDispatcherInterface $eventDispatcher
30
     * @param string                   $savedClass
31
     */
32
    public function __construct(
33
        ObjectManager $objectManager,
34
        EventDispatcherInterface $eventDispatcher,
35
        $savedClass
36
    ) {
37
        $this->objectManager   = $objectManager;
38
        $this->savedClass      = $savedClass;
39
        $this->eventDispatcher = $eventDispatcher;
40
    }
41
42
    /**
43
     * {@inheritdoc}
44
     */
45
    public function save($badgeCompletion, array $options = [])
46
    {
47
        if (false === ($badgeCompletion instanceof $this->savedClass)) {
48
            throw new \InvalidArgumentException(
49
                sprintf(
50
                    'Expects a "%s", "%s" provided.',
51
                    $this->savedClass,
52
                    ClassUtils::getRealClass($badgeCompletion)
53
                )
54
            );
55
        }
56
57
        $this->objectManager->persist($badgeCompletion);
58
        $this->objectManager->flush();
59
60
        if (!$badgeCompletion->isPending()) {
61
            $event = new BadgeUnlockEvent($badgeCompletion);
62
            $this->eventDispatcher->dispatch(GameEvents::USER_UNLOCKS_BADGE, $event);
63
        }
64
    }
65
}
66