Subversion-Projekte lars-tiefland.laravel_shop

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
148 lars 1
<?php
2
 
3
namespace Faker\ORM\Mandango;
4
 
5
use Faker\Provider\Base;
6
use Mandango\Mandango;
7
 
8
/**
9
 * Service class for populating a table through a Mandango ActiveRecord class.
10
 */
11
class EntityPopulator
12
{
13
    protected $class;
14
    protected $columnFormatters = [];
15
 
16
    /**
17
     * @param string $class A Mandango ActiveRecord classname
18
     */
19
    public function __construct($class)
20
    {
21
        $this->class = $class;
22
    }
23
 
24
    /**
25
     * @return string
26
     */
27
    public function getClass()
28
    {
29
        return $this->class;
30
    }
31
 
32
    public function setColumnFormatters($columnFormatters)
33
    {
34
        $this->columnFormatters = $columnFormatters;
35
    }
36
 
37
    /**
38
     * @return array
39
     */
40
    public function getColumnFormatters()
41
    {
42
        return $this->columnFormatters;
43
    }
44
 
45
    public function mergeColumnFormattersWith($columnFormatters)
46
    {
47
        $this->columnFormatters = array_merge($this->columnFormatters, $columnFormatters);
48
    }
49
 
50
    /**
51
     * @return array
52
     */
53
    public function guessColumnFormatters(\Faker\Generator $generator, Mandango $mandango)
54
    {
55
        $formatters = [];
56
        $nameGuesser = new \Faker\Guesser\Name($generator);
57
        $columnTypeGuesser = new \Faker\ORM\Mandango\ColumnTypeGuesser($generator);
58
 
59
        $metadata = $mandango->getMetadata($this->class);
60
 
61
        // fields
62
        foreach ($metadata['fields'] as $fieldName => $field) {
63
            if ($formatter = $nameGuesser->guessFormat($fieldName)) {
64
                $formatters[$fieldName] = $formatter;
65
 
66
                continue;
67
            }
68
 
69
            if ($formatter = $columnTypeGuesser->guessFormat($field)) {
70
                $formatters[$fieldName] = $formatter;
71
 
72
                continue;
73
            }
74
        }
75
 
76
        // references
77
        foreach (array_merge($metadata['referencesOne'], $metadata['referencesMany']) as $referenceName => $reference) {
78
            if (!isset($reference['class'])) {
79
                continue;
80
            }
81
            $referenceClass = $reference['class'];
82
 
83
            $formatters[$referenceName] = static function ($insertedEntities) use ($referenceClass) {
84
                if (isset($insertedEntities[$referenceClass])) {
85
                    return Base::randomElement($insertedEntities[$referenceClass]);
86
                }
87
 
88
                return null;
89
            };
90
        }
91
 
92
        return $formatters;
93
    }
94
 
95
    /**
96
     * Insert one new record using the Entity class.
97
     */
98
    public function execute(Mandango $mandango, $insertedEntities)
99
    {
100
        $metadata = $mandango->getMetadata($this->class);
101
 
102
        $obj = $mandango->create($this->class);
103
 
104
        foreach ($this->columnFormatters as $column => $format) {
105
            if (null !== $format) {
106
                $value = is_callable($format) ? $format($insertedEntities, $obj) : $format;
107
 
108
                if (isset($metadata['fields'][$column])
109
                    || isset($metadata['referencesOne'][$column])) {
110
                    $obj->set($column, $value);
111
                }
112
 
113
                if (isset($metadata['referencesMany'][$column])) {
114
                    $adder = 'add' . ucfirst($column);
115
                    $obj->$adder($value);
116
                }
117
            }
118
        }
119
        $mandango->persist($obj);
120
 
121
        return $obj;
122
    }
123
}