Skip to content

Commit 1916356

Browse files
committed
preparing beta release
1 parent 044d715 commit 1916356

26 files changed

+433
-378
lines changed

README.md

+20-13
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ php artisan migrate
103103
### Concepts
104104

105105
Each preference has at least a name and a caster. For additional validation you can add you custom Rule object
106-
> The default caster supports all major primitives, enums, as well as time/datetime/date and timestamp which get
106+
> The default caster supports all major primitives, enums, objects, as well as time/datetime/date and timestamp which get
107107
> converted
108108
> with `Carbon/Carbon`
109109
@@ -157,7 +157,7 @@ public function up(): void
157157
->updateOrCreate()
158158

159159
// or with casting
160-
PreferenceBuilder::init(Preferences::LANGUAGE, Cast::BACKED_ENUM)
160+
PreferenceBuilder::init(Preferences::LANGUAGE, Cast::ENUM)
161161
->withDefaultValue(Language::EN)
162162
->create()
163163

@@ -275,7 +275,9 @@ class User extends \Illuminate\Foundation\Auth\User implements PreferenceableMod
275275
276276
### Available Casts
277277

278-
INT, FLOAT, STRING, BOOL, ARRAY, TIME, DATE, DATETIME, TIMESTAMP, BACKED_ENUM
278+
INT, FLOAT, STRING, BOOL,
279+
ARRAY, TIME, DATE, DATETIME,
280+
TIMESTAMP, BACKED_ENUM, ENUM, OBJECT
279281

280282
### Custom Caster
281283

@@ -320,21 +322,25 @@ enum MyCast: string implements CastableEnum
320322

321323
> rules need to implement `ValidationRule`
322324
323-
> additionally, if your rule requires parameter, extend `DataRule`
324-
> which then will provide the parameters via `getData()` as an array of params
325-
326325
```php
327-
class MyRule extends DataRule
326+
class MyRule implements ValidationRule
328327
{
329328

329+
protected array $data;
330+
331+
public function __construct(...$data)
332+
{
333+
$this->data = $data;
334+
}
335+
330336
public function message()
331337
{
332-
return sprintf("Wrong Timezone, one of: %s expected", implode(", ",$this->getData()));
338+
return sprintf("Wrong Timezone, one of: %s expected", implode(", ",$this->data));
333339
}
334340

335341
public function validate(string $attribute, mixed $value, Closure $fail): void
336342
{
337-
if(!Str::startsWith($value, $this->getData())){
343+
if(!Str::startsWith($value, $this->data)){
338344
$fail($this->message());
339345
}
340346
}
@@ -366,10 +372,10 @@ which can all be accessed via the route name: {prefix}.{scope}.{group}.{index/ge
366372

367373
#### URI Parameters
368374

369-
`scope_id`: The unique identifier of the scope (e.g., a user's ID).
370-
`preference`: The value of the specific preference enum (e.g., General::LANGUAGE->value).
371-
`group`: A mapping of group names to their corresponding Enum classes. See config below
372-
`scope`: A mapping of scope names to their corresponding Eloquent model. See config below
375+
`scope_id`: The unique identifier of the scope (e.g., a user's ID).
376+
`preference`: The value of the specific preference enum (e.g., General::LANGUAGE->value).
377+
`group`: A mapping of group names to their corresponding Enum classes. See config below
378+
`scope`: A mapping of scope names to their corresponding Eloquent model. See config below
373379

374380
### Example
375381

@@ -448,6 +454,7 @@ in the config file
448454
- Switch from `HasValidation` to `ValidationRule`
449455
- Signature changes on the trait: group got removed and name now requires a `PreferenceGroup`
450456
- Builder: setting group got removed and name now expects a `PreferenceGroup` enum
457+
- `DataRule` has been removed, add a constructor to get you own, tailored, params
451458

452459
## Test
453460

routes/api.php

+3-4
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,17 @@
66
use Matteoc99\LaravelPreference\Utils\ConfigHelper;
77

88

9-
$prefix = ConfigHelper::getRoutePrefix();
109
$scopes = ConfigHelper::getScopes();
1110
$groups = ConfigHelper::getGroups();
1211

1312
$middlewares = array_merge([PreferenceMiddleware::class], ConfigHelper::getGlobalMiddlewares());
1413

15-
Route::group(['middleware' => $middlewares, 'prefix' => $prefix], function () use ($groups, $scopes, $prefix) {
14+
Route::group(['middleware' => $middlewares, 'prefix' => ConfigHelper::getRoutePrefix(false)], function () use ($groups, $scopes) {
1615

1716
foreach ($scopes as $scope) {
18-
Route::group(['middleware' => ConfigHelper::getScopedMiddlewares($scope), 'prefix' => $scope], function () use ($scope, $prefix, $groups) {
17+
Route::group(['middleware' => ConfigHelper::getScopedMiddlewares($scope), 'prefix' => $scope], function () use ($scope, $groups) {
1918
foreach ($groups as $group) {
20-
$name = sprintf("%s%s.%s", $prefix, $scope, $group);
19+
$name = sprintf("%s%s.%s", ConfigHelper::getRoutePrefix(), $scope, $group);
2120
Route::group(['middleware' => ConfigHelper::getScopeGroupedMiddlewares($scope, $group)], function () use ($name, $group) {
2221
Route::get("{scope_id}/$group", [PreferenceController::class, 'index'])
2322
->name($name . ".index");

src/Casts/EnumCaster.php

-37
This file was deleted.

src/Casts/RuleCaster.php

-63
This file was deleted.

src/Casts/SerializingCaster.php

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
namespace Matteoc99\LaravelPreference\Casts;
4+
5+
use Illuminate\Database\Eloquent\Model;
6+
7+
class SerializingCaster
8+
{
9+
public function get(?Model $model, string $key, mixed $value, array $attributes)
10+
{
11+
return unserialize($value);
12+
}
13+
14+
public function set(?Model $model, string $key, mixed $value, array $attributes)
15+
{
16+
return serialize($value);
17+
}
18+
}

src/Casts/ValueCaster.php

-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ public function get(?Model $model, string $key, mixed $value, array $attributes)
2121
return $caster->castFromString($value);
2222
}
2323

24-
//default do nothing
2524
return $value;
2625

2726
}

src/Contracts/PreferenceGroup.php

+2
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,6 @@
77
interface PreferenceGroup extends BackedEnum
88
{
99

10+
11+
1012
}

src/Enums/Cast.php

+29-3
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
use Illuminate\Validation\ValidationException;
1010
use Matteoc99\LaravelPreference\Contracts\CastableEnum;
1111
use Matteoc99\LaravelPreference\Rules\InstanceOfRule;
12-
use Matteoc99\LaravelPreference\Utils\SerializeHelper;
12+
use Matteoc99\LaravelPreference\Rules\IsRule;
13+
use UnitEnum;
1314

1415

1516
enum Cast: string implements CastableEnum
@@ -25,6 +26,8 @@ enum Cast: string implements CastableEnum
2526
case TIMESTAMP = 'timestamp';
2627

2728
case BACKED_ENUM = 'backed_enum';
29+
case ENUM = 'enum';
30+
case OBJECT = 'object';
2831

2932
public function validation(): ValidationRule|array|string|null
3033
{
@@ -38,6 +41,8 @@ public function validation(): ValidationRule|array|string|null
3841
self::TIME => 'date_format:H:i',
3942
self::TIMESTAMP => 'date_format:U',
4043
self::BACKED_ENUM => new InstanceOfRule(BackedEnum::class),
44+
self::ENUM => new InstanceOfRule(UnitEnum::class),
45+
self::OBJECT => new IsRule(Type::OBJECT),
4146
};
4247
}
4348

@@ -52,7 +57,7 @@ public function castFromString(string $value): mixed
5257
self::DATE, self::DATETIME => new Carbon($value),
5358
self::TIME => Carbon::now()->setTimeFromTimeString($value),
5459
self::TIMESTAMP => Carbon::createFromTimestamp($value),
55-
self::BACKED_ENUM => SerializeHelper::deserializeEnum($value),
60+
self::BACKED_ENUM, self::ENUM, self::OBJECT => unserialize($value),
5661
};
5762
}
5863

@@ -70,7 +75,7 @@ public function castToString(mixed $value): string
7075
self::DATETIME => $value->toDateTimeString(),
7176
self::TIMESTAMP => $value->timestamp,
7277
self::TIME => $value->toTimeString(),
73-
self::BACKED_ENUM => SerializeHelper::serializeEnum($value),
78+
self::BACKED_ENUM, self::ENUM, self::OBJECT => serialize($value),
7479
};
7580
}
7681

@@ -88,6 +93,8 @@ private function ensureType(mixed $value): mixed
8893
self::TIMESTAMP, self::DATETIME, self::DATE => $this->ensureCarbon($value),
8994
self::TIME => $this->ensureCarbon($value, 'setTimeFromTimeString'),
9095
self::BACKED_ENUM => $this->ensureBackedEnum($value),
96+
self::ENUM => $this->ensureEnum($value),
97+
self::OBJECT => $this->ensureObject($value),
9198
default => throw ValidationException::withMessages(["Unknown casting type"]),
9299
};
93100
}
@@ -128,4 +135,23 @@ private function ensureBackedEnum(mixed $value): BackedEnum
128135
}
129136
return $value;
130137
}
138+
139+
/**
140+
* @throws ValidationException
141+
*/
142+
private function ensureEnum(mixed $value): UnitEnum
143+
{
144+
if (!($value instanceof UnitEnum)) {
145+
throw ValidationException::withMessages(["Wrong type for enum casting"]);
146+
}
147+
return $value;
148+
}
149+
150+
private function ensureObject(mixed $value)
151+
{
152+
if (!is_object($value)) {
153+
throw ValidationException::withMessages(["Wrong type for object casting"]);
154+
}
155+
return $value;
156+
}
131157
}

src/Enums/Type.php

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace Matteoc99\LaravelPreference\Enums;
4+
5+
enum Type
6+
{
7+
8+
case BOOL;
9+
case INT;
10+
case FLOAT;
11+
case STRING;
12+
case ARRAY;
13+
case OBJECT;
14+
case CALLABLE;
15+
case ITERABLE;
16+
case NULL;
17+
case RESOURCE;
18+
19+
}

src/Factory/PreferenceBuilder.php

+3-5
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
use Illuminate\Contracts\Validation\ValidationRule;
66
use Illuminate\Database\Eloquent\Builder;
77
use InvalidArgumentException;
8-
use Matteoc99\LaravelPreference\Casts\EnumCaster;
98
use Matteoc99\LaravelPreference\Casts\RuleCaster;
109
use Matteoc99\LaravelPreference\Casts\ValueCaster;
1110
use Matteoc99\LaravelPreference\Contracts\CastableEnum;
@@ -125,16 +124,15 @@ public static function initBulk(array $preferences): void
125124
SerializeHelper::conformNameAndGroup($preferenceData['name'], $preferenceData['group']);
126125

127126
if (array_key_exists('rule', $preferenceData)) {
128-
$ruleCaster = new RuleCaster();
129-
$preferenceData['rule'] = $ruleCaster->set(null, '', $preferenceData['rule'], []);
127+
$preferenceData['rule'] = serialize($preferenceData['rule']);
130128
}
131129
if (array_key_exists('default_value', $preferenceData)) {
132130
$valueCaster = new ValueCaster($preferenceData['cast']);
133131
$preferenceData['default_value'] = $valueCaster->set(null, '', $preferenceData['default_value'], []);
134132
}
135133

136-
$enumCaster = new EnumCaster();
137-
$preferenceData['cast'] = $enumCaster->set(null, '', $preferenceData['cast'], []);
134+
135+
$preferenceData['cast'] = serialize($preferenceData['cast']);
138136

139137
// Ensure Defaults
140138
$preferenceData = array_merge([

src/Models/Preference.php

+3-4
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44

55
use Illuminate\Contracts\Validation\ValidationRule;
66
use Illuminate\Support\Carbon;
7-
use Matteoc99\LaravelPreference\Casts\EnumCaster;
8-
use Matteoc99\LaravelPreference\Casts\RuleCaster;
7+
use Matteoc99\LaravelPreference\Casts\SerializingCaster;
98
use Matteoc99\LaravelPreference\Casts\ValueCaster;
109
use Matteoc99\LaravelPreference\Contracts\CastableEnum;
1110

@@ -41,8 +40,8 @@ class Preference extends BaseModel
4140
protected $casts = [
4241
'created_at' => 'datetime',
4342
'updated_at' => 'datetime',
44-
'cast' => EnumCaster::class,
45-
'rule' => RuleCaster::class,
43+
'cast' => SerializingCaster::class,
44+
'rule' => SerializingCaster::class,
4645
'default_value' => ValueCaster::class,
4746
];
4847

0 commit comments

Comments
 (0)