AbstractFixture   A
last analyzed

Complexity

Total Complexity 26

Size/Duplication

Total Lines 157
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Importance

Changes 0
Metric Value
wmc 26
lcom 1
cbo 2
dl 0
loc 157
rs 10
c 0
b 0
f 0

9 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 8 2
A hasTag() 0 9 3
A runServiceCalls() 0 10 3
B load() 0 27 6
A getMetadataForClass() 0 6 1
A isReverseSaveOrder() 0 8 3
B constructorArgs() 0 24 6
A makeInstance() 0 10 2
createObject() 0 1 ?
1
<?php
2
3
namespace Khepin\YamlFixturesBundle\Fixture;
4
5
use Doctrine\Common\Persistence\ObjectManager;
6
7
abstract class AbstractFixture
8
{
9
    protected $tags = array();
10
11
    protected $file;
12
13
    protected $loader;
14
15
    protected $manager;
16
17
    public function __construct(array $data, $loader)
18
    {
19
        $this->file = $data;
20
        if (isset($this->file['tags'])) {
21
            $this->tags = $this->file['tags'];
22
        }
23
        $this->loader = $loader;
24
    }
25
26
    /**
27
     * Returns if the given tag is set for the current fixture
28
     * @param  type    $tag
0 ignored issues
show
Bug introduced by
There is no parameter named $tag. Was it maybe removed?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function.

Consider the following example. The parameter $italy is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $island
 * @param array $italy
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was removed, but the annotation was not.

Loading history...
29
     * @return boolean
30
     */
31
    public function hasTag(Array $tags)
32
    {
33
        // if no tags were specified, the fixture should always be loaded
34
        if (count($this->tags) == 0 || count(array_intersect($this->tags, $tags)) > 0) {
35
            return true;
36
        }
37
38
        return false;
39
    }
40
41
    /**
42
     * @param the object on which to run the service calls
43
     */
44
    public function runServiceCalls($object)
45
    {
46
        if (isset($this->file['service_calls'])) {
47
            foreach ($this->file['service_calls'] as $call) {
48
                $s = $this->loader->getService($call['service']);
49
                $m = $call['method'];
50
                $s->$m($object);
51
            }
52
        }
53
    }
54
55
    public function load(ObjectManager $manager, $tags = null)
56
    {
57
        if (!$this->hasTag($tags)) {
58
            return;
59
        }
60
        $this->manager = $manager;
61
        $class = $this->file['model'];
62
        // Get the fields that are not "associations"
63
        $metadata = $this->getMetaDataForClass($class);
64
65
        foreach ($this->file['fixtures'] as $reference => $fixture_data) {
66
            $object = $this->createObject($class, $fixture_data, $metadata);
67
            $this->loader->setReference($reference, $object);
68
            if (!$this->isReverseSaveOrder()) {
69
                $manager->persist($object);
70
            }
71
        }
72
73
        if ($this->isReverseSaveOrder()) {
74
            $refs = array_keys($this->file['fixtures']);
75
            for ($i = (count($refs) - 1); $i>=0; $i--) {
76
                $manager->persist($this->loader->getReference($refs[$i]));
77
            }
78
        }
79
80
        $manager->flush();
81
    }
82
83
    public function getMetadataForClass($class)
84
    {
85
        $cmf = $this->manager->getMetadataFactory();
86
87
        return $cmf->getMetaDataFor($class);
88
    }
89
90
    /**
91
     * For fixtures that have relations to the same table, they need to appear
92
     * in the opposite order that they need to be saved.
93
     * @return boolean
94
     */
95
    public function isReverseSaveOrder()
96
    {
97
        if (!isset($this->file['save_in_reverse']) || $this->file['save_in_reverse'] == false) {
98
            return false;
99
        }
100
101
        return true;
102
    }
103
104
    /**
105
     * Extract the constructor arguments
106
     *
107
     * @param array $arguments
108
     * @return mixed
109
     */
110
    public function constructorArgs($arguments)
111
    {
112
        $constructArguments = array();
113
114
        if (is_array($arguments)) {
115
            foreach ($arguments as $argument) {
116
                if (is_array($argument)) {
117
                    if ($argument['type'] == 'datetime') {
118
                        $constructArguments[] = new \DateTime($argument['value']);
119
                    } elseif ($argument['type'] == 'reference') {
120
                        $constructArguments[] = $this->loader->getReference($argument['value']);
121
                    } else {
122
                        $constructArguments[] = $argument['value'];
123
                    }
124
                } else {
125
                    $constructArguments[] = $argument;
126
                }
127
            }
128
        } else {
129
            $constructArguments[] = $arguments;
130
        }
131
132
        return $constructArguments;
133
    }
134
135
    /**
136
     * Creates an instance with any given constructor args
137
     *
138
     * @param string $class
139
     * @param array $data
140
     * @return void
141
     */
142
    public function makeInstance($class, $data)
143
    {
144
        $class = new \ReflectionClass($class);
145
        $constructArguments = [];
146
        if (isset($data['__construct'])) {
147
            $constructArguments = $this->constructorArgs($data['__construct']);
148
        }
149
150
        return $class->newInstanceArgs($constructArguments);
151
    }
152
153
    /**
154
     * Creates and returns one object based on the given data and metadata
155
     *
156
     * @param $class object's class name
157
     * @param $data array of the object's fixture data
158
     * @param $metadata the class metadata for doctrine
159
     * @param $options options specific to each implementation
160
     * @return Object
161
     */
162
    abstract public function createObject($class, $data, $metadata, $options = array());
163
}
164