Passed
Push — master ( 64ef64...64ef64 )
by emilien
03:24 queued 01:06
created

CallableGenerator::generateCallable()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 14
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 14
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 8
nc 1
nop 3
1
<?php
2
3
4
namespace Actiane\EntityChangeWatchBundle\Generator;
5
6
use Symfony\Component\DependencyInjection\ContainerInterface;
7
8
/**
9
 * Class CallableGenerator
10
 * @package Actiane\EntityChangeWatchBundle\Generator
11
 */
12
class CallableGenerator
13
{
14
    /**
15
     * @var ContainerInterface
16
     */
17
    private $serviceContainer;
18
19
    /**
20
     * @param ContainerInterface $serviceContainer
21
     */
22
    public function __construct($serviceContainer)
23
    {
24
        $this->serviceContainer = $serviceContainer;
25
    }
26
27
    /**
28
     * Generate the arrays used for call_user_func_array
29
     *
30
     * @param array $arrayCallable
31
     * @param       $entity
32
     *
33
     * @param       $changedProperties
34
     *
35
     * @return array
36
     */
37
    public function generateCallable(array $arrayCallable = [], $entity, $changedProperties = null)
38
    {
39
        $callable = [];
40
41
        $callable[$this->generateCallableSignature($arrayCallable, $entity)] = [
42
            'callable' => [
43
                $this->serviceContainer->get($arrayCallable['name']),
44
                $arrayCallable['method'],
45
            ],
46
            'parameters' => ['entity' => $entity, 'changedProperties' => $changedProperties],
47
            'flush' => $arrayCallable['flush'],
48
        ];
49
50
        return $callable;
51
    }
52
53
    /**
54
     * Generate the signature of a callback to ensure that each callback for the same entity is only called once
55
     *
56
     * @param array $arrayCallable
57
     * @param       $entity
58
     *
59
     * @return string
60
     */
61
    private function generateCallableSignature(array $arrayCallable = [], $entity)
62
    {
63
        return $arrayCallable['name'].':'.$arrayCallable['method'].':'.spl_object_hash($entity);
64
    }
65
}
66