Caster::castRules()
last analyzed

Size

Total Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 1
c 0
b 0
f 0
nc 1
1
<?php
2
3
namespace Koch\Casters;
4
5
use Closure;
6
use Illuminate\Database\Eloquent\Model;
7
use Illuminate\Database\Eloquent\Collection;
8
use Koch\Casters\Behavior\BuildsCastQueries;
9
use Koch\Casters\Contracts\Caster as CasterContract;
10
11
abstract class Caster implements CasterContract
12
{
13
    use BuildsCastQueries;
14
15
    /**
16
     * Determines the function sign.
17
     *
18
     * @var string
19
     */
20
    private $functionSign = '@';
21
22
    /**
23
     * Determines the query sign.
24
     *
25
     * @var string
26
     */
27
    private $querySign = '!';
28
29
    /**
30
     * Casts collection fields.
31
     *
32
     * @param  mixed  $model
33
     * @return array
34
     */
35
    public function cast($model)
36
    {
37
        if ($model instanceof Collection) {
38
            return $model->map([$this, 'cast'])->toArray();
39
        }
40
41
        if (empty($model)) {
42
            return;
43
        }
44
45
        $transformed = [];
46
47
        foreach ($this->castRules() as $old => $desired) {
48
            $this->resolveCast($old, $desired, $model, $transformed);
49
        }
50
51
        return $transformed;
52
    }
53
54
    /**
55
     * Resolves casts based on supplied array of arguments.
56
     *
57
     * @param  string  $old
58
     * @param  string|Closure  $desired
59
     * @param  \Illuminate\Database\Eloquent\Model  $model
60
     * @param  array  &$transformed
61
     * @return array
62
     */
63
    private function resolveCast($old, $desired, Model $model, &$transformed)
64
    {
65
        if ($desired instanceof Closure) {
66
            return $transformed[$old] = call_user_func($desired, $model);
67
        }
68
69
        if (is_string($desired) && strpos($desired, $this->functionSign) !== false) {
70
            return $transformed[$old] = call_user_func([$this, substr($desired, 1)], $model);
71
        }
72
73
        if (is_string($desired) && strpos($desired, $this->querySign) !== false) {
74
            return $this->parse($old, substr($desired, 1), $model, $transformed);
75
        }
76
77
        if (is_string($old)) {
78
            return $transformed[$desired] = $model->$old;
79
        }
80
81
        return $transformed[$desired] = $model->$desired;
82
    }
83
84
    /**
85
     * Returns the cast rules.
86
     *
87
     * @return array
88
     */
89
    abstract protected function castRules();
90
}
91