Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
92.86% covered (success)
92.86%
13 / 14
66.67% covered (warning)
66.67%
2 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
HasCastAliases
92.86% covered (success)
92.86%
13 / 14
66.67% covered (warning)
66.67%
2 / 3
8.02
0.00% covered (danger)
0.00%
0 / 1
 registerCastAliases
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getCastAliases
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getCasts
91.67% covered (success)
91.67%
11 / 12
0.00% covered (danger)
0.00%
0 / 1
6.02
1<?php
2
3declare(strict_types=1);
4
5namespace DevToolbelt\LaravelEloquentPlus\Concerns;
6
7/**
8 * Trait that provides custom cast alias support for Eloquent models.
9 *
10 * Allows registering short alias names for cast classes, similar to
11 * Laravel's built-in cast types like 'array', 'boolean', 'datetime', etc.
12 *
13 * Usage in Service Provider:
14 * ```php
15 * ModelBase::registerCastAliases([
16 *     'only_numbers' => OnlyNumbers::class,
17 *     'uuid_to_id' => UuidToIdCast::class,
18 * ]);
19 * ```
20 *
21 * Usage in Model:
22 * ```php
23 * protected $casts = [
24 *     'phone' => 'only_numbers',
25 *     'category_id' => 'uuid_to_id:categories,external_id',
26 * ];
27 * ```
28 *
29 * @package DevToolbelt\LaravelEloquentPlus\Concerns
30 */
31trait HasCastAliases
32{
33    /**
34     * Custom cast type aliases.
35     *
36     * Maps short names to their full cast class names.
37     *
38     * @var array<string, class-string>
39     */
40    protected static array $castAliases = [];
41
42    /**
43     * Register custom cast aliases.
44     *
45     * @param array<string, class-string> $aliases Map of alias names to cast class names
46     * @return void
47     */
48    public static function registerCastAliases(array $aliases): void
49    {
50        self::$castAliases = array_merge(self::$castAliases, $aliases);
51    }
52
53    /**
54     * Get all registered cast aliases.
55     *
56     * @return array<string, class-string>
57     */
58    public static function getCastAliases(): array
59    {
60        return self::$castAliases;
61    }
62
63    /**
64     * Get the casts array with aliases resolved to their full class names.
65     *
66     * @return array<string, mixed>
67     */
68    public function getCasts(): array
69    {
70        $casts = parent::getCasts();
71
72        foreach ($casts as $key => $castType) {
73            if (!is_string($castType)) {
74                continue;
75            }
76
77            // Extract the cast name (before any colon parameters)
78            $castName = str_contains($castType, ':') ? explode(':', $castType, 2)[0] : $castType;
79
80            if (isset(self::$castAliases[$castName])) {
81                $castClass = self::$castAliases[$castName];
82
83                // If the original cast type had parameters, append them to the class
84                if (str_contains($castType, ':')) {
85                    $parameters = explode(':', $castType, 2)[1];
86                    $casts[$key] = $castClass . ':' . $parameters;
87                } else {
88                    $casts[$key] = $castClass;
89                }
90            }
91        }
92
93        return $casts;
94    }
95}