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 AsEnumCollection implements Castable
11
{
12
    /**
13
     * Get the caster class to use when casting from / to this cast target.
14
     *
15
     * @template TEnum of \UnitEnum|\BackedEnum
16
     *
17
     * @param  array{class-string<TEnum>}  $arguments
18
     * @return CastsAttributes<Collection<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 Collection($data))->map(function ($value) use ($enumClass) {
46
                    return is_subclass_of($enumClass, BackedEnum::class)
47
                        ? $enumClass::from($value)
48
                        : constant($enumClass.'::'.$value);
49
                });
50
            }
51
 
52
            public function set($model, $key, $value, $attributes)
53
            {
54
                $value = $value !== null
55
                    ? (new Collection($value))->map(function ($enum) {
56
                        return $this->getStorableEnumValue($enum);
57
                    })->toJson()
58
                    : null;
59
 
60
                return [$key => $value];
61
            }
62
 
63
            public function serialize($model, string $key, $value, array $attributes)
64
            {
65
                return (new Collection($value))->map(function ($enum) {
66
                    return $this->getStorableEnumValue($enum);
67
                })->toArray();
68
            }
69
 
70
            protected function getStorableEnumValue($enum)
71
            {
72
                if (is_string($enum) || is_int($enum)) {
73
                    return $enum;
74
                }
75
 
76
                return $enum instanceof BackedEnum ? $enum->value : $enum->name;
77
            }
78
        };
79
    }
80
}