Subversion-Projekte lars-tiefland.laravel_shop

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
402 lars 1
<?php
2
 
3
namespace Illuminate\Database\Eloquent\Casts;
4
 
5
use BackedEnum;
6
use Illuminate\Contracts\Database\Eloquent\Castable;
7
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
8
use Illuminate\Support\Collection;
9
 
10
class AsEnumArrayObject implements Castable
11
{
12
    /**
13
     * Get the caster class to use when casting from / to this cast target.
14
     *
15
     * @template TEnum
16
     *
17
     * @param  array{class-string<TEnum>}  $arguments
18
     * @return CastsAttributes<ArrayObject<array-key, TEnum>, iterable<TEnum>>
19
     */
20
    public static function castUsing(array $arguments)
21
    {
22
        return new class($arguments) implements CastsAttributes
23
        {
24
            protected $arguments;
25
 
26
            public function __construct(array $arguments)
27
            {
28
                $this->arguments = $arguments;
29
            }
30
 
31
            public function get($model, $key, $value, $attributes)
32
            {
33
                if (! isset($attributes[$key]) || is_null($attributes[$key])) {
34
                    return;
35
                }
36
 
37
                $data = json_decode($attributes[$key], true);
38
 
39
                if (! is_array($data)) {
40
                    return;
41
                }
42
 
43
                $enumClass = $this->arguments[0];
44
 
45
                return new ArrayObject((new Collection($data))->map(function ($value) use ($enumClass) {
46
                    return is_subclass_of($enumClass, BackedEnum::class)
47
                        ? $enumClass::from($value)
48
                        : constant($enumClass.'::'.$value);
49
                })->toArray());
50
            }
51
 
52
            public function set($model, $key, $value, $attributes)
53
            {
54
                if ($value === null) {
55
                    return [$key => null];
56
                }
57
 
58
                $storable = [];
59
 
60
                foreach ($value as $enum) {
61
                    $storable[] = $this->getStorableEnumValue($enum);
62
                }
63
 
64
                return [$key => json_encode($storable)];
65
            }
66
 
67
            public function serialize($model, string $key, $value, array $attributes)
68
            {
69
                return (new Collection($value->getArrayCopy()))->map(function ($enum) {
70
                    return $this->getStorableEnumValue($enum);
71
                })->toArray();
72
            }
73
 
74
            protected function getStorableEnumValue($enum)
75
            {
76
                if (is_string($enum) || is_int($enum)) {
77
                    return $enum;
78
                }
79
 
80
                return $enum instanceof BackedEnum ? $enum->value : $enum->name;
81
            }
82
        };
83
    }
84
}