Skip to content

Commit fbc84de

Browse files
authored
Merge pull request #31 from YunusEmreNalbant/master
dynamic casting support in LaravelConfig
2 parents 0e897bc + c99bf6c commit fbc84de

File tree

10 files changed

+183
-30
lines changed

10 files changed

+183
-30
lines changed

.github/workflows/tests.yml

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,9 @@ jobs:
99
strategy:
1010
fail-fast: false
1111
matrix:
12-
php: [7.4, '8.0', 8.1, 8.2]
12+
php: [8.1, 8.2]
1313
laravel: [8, 9, 10]
1414
exclude:
15-
- php: 7.4
16-
laravel: 9
17-
- php: 7.4
18-
laravel: 10
19-
- php: 8.0
20-
laravel: 10
2115
- php: 8.2
2216
laravel: 8
2317

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,12 @@ All notable changes to `laravel-config` will be documented in this file.
33

44
## [Unreleased]
55

6+
## [5.0.0] - 2024-03-05
7+
8+
- Dropped support for PHP versions below 8.1.
9+
- Added dynamic casting support to the LaravelConfig class, enabling it to cast configuration values based on their types.
10+
- Added new enum `ConfigValueCast.php`
11+
612
## [4.7.0] - 2023-05-11
713

814
- PHP 8.2 support added.

README.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ Create new config parameter:
4343
``` php
4444
$factory = new ConfigFactory();
4545
$configItem = $factory->setName('key')
46-
->setType('boolean')
46+
->setType(ConfigDataType::BOOLEAN)
4747
->setValue('1')
4848
->setTags(['system'])//optional
4949
->setDescription('Lorem ipsum dolor sit amet')
@@ -57,6 +57,7 @@ Get value with config name:
5757
``` php
5858
LaravelConfig::get('key');
5959
```
60+
6061
Set value with config name and value:
6162

6263
``` php
@@ -86,7 +87,7 @@ Update config with new values:
8687
``` php
8788
$factory = new ConfigFactory($configId);
8889
$configItem = $factory->setName('updated-key')
89-
->setType('boolean')
90+
->setType(ConfigDataType::BOOLEAN)
9091
->setValue('0')
9192
->setTags(['system'])//optional
9293
->setDescription('updated description')
@@ -144,7 +145,7 @@ You can also use helper functions:
144145
// Creating config item
145146
$factory = new ConfigFactory();
146147
$configItem = $factory->setName('key')
147-
->setType('boolean')
148+
->setType(ConfigDataType::BOOLEAN)
148149
->setValue('1')
149150
->setTags(['system'])//optional
150151
->setDescription('Lorem ipsum dolor sit amet')
@@ -164,7 +165,7 @@ set_config_value('key', 'value');
164165
// Updating config item
165166
$factory = new ConfigFactory($configId);
166167
$configItem = $factory->setName('updated-key')
167-
->setType('boolean')
168+
->setType(ConfigDataType::BOOLEAN)
168169
->setTags(['system'])//optional
169170
->setValue('0')
170171
->setDescription('updated description')

composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@
3131
}
3232
],
3333
"require": {
34-
"php": "^7.4|^8.0|^8.1|^8.2",
34+
"php": "^8.1|^8.2",
35+
"ext-json": "*",
3536
"illuminate/support": "^8.49|^9.0|^10.0",
3637
"laravel/legacy-factories": "^1.0"
3738
},
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
3+
use Illuminate\Database\Migrations\Migration;
4+
use Illuminate\Database\Schema\Blueprint;
5+
use Illuminate\Support\Facades\Schema;
6+
7+
class UpdateTypeColumnInConfigTable extends Migration
8+
{
9+
/**
10+
* Run the migrations.
11+
*
12+
* @return void
13+
*/
14+
public function up(): void
15+
{
16+
Schema::table(config('laravel-config.table'), function (Blueprint $table) {
17+
$table->string('type')->default('boolean')->change();
18+
});
19+
}
20+
21+
/**
22+
* Reverse the migrations.
23+
*
24+
* @return void
25+
*/
26+
public function down(): void
27+
{
28+
Schema::table(config('laravel-config.table'), function (Blueprint $table) {
29+
$table->enum('type', ['boolean', 'text'])->default('boolean')->change();
30+
});
31+
}
32+
}

src/Casts/ConfigValueCast.php

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
namespace TarfinLabs\LaravelConfig\Casts;
4+
5+
use Carbon\Carbon;
6+
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
7+
use Illuminate\Database\Eloquent\Model;
8+
use TarfinLabs\LaravelConfig\Enums\ConfigDataType;
9+
10+
class ConfigValueCast implements CastsAttributes
11+
{
12+
public function get(Model $model, string $key, mixed $value, array $attributes)
13+
{
14+
return match ($attributes['type']) {
15+
ConfigDataType::BOOLEAN->value => (bool) $value,
16+
ConfigDataType::INTEGER->value => (int) $value,
17+
ConfigDataType::DATE->value => Carbon::createFromFormat('Y-m-d', $value),
18+
ConfigDataType::DATE_TIME->value => Carbon::createFromFormat('Y-m-d H:i', $value),
19+
ConfigDataType::JSON->value => json_decode($value, true),
20+
default => $value,
21+
};
22+
}
23+
24+
public function set(Model $model, string $key, mixed $value, array $attributes)
25+
{
26+
return $value;
27+
}
28+
}

src/Config/Config.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace TarfinLabs\LaravelConfig\Config;
44

55
use Illuminate\Database\Eloquent\Model;
6+
use TarfinLabs\LaravelConfig\Casts\ConfigValueCast;
67

78
class Config extends Model
89
{
@@ -14,6 +15,7 @@ class Config extends Model
1415

1516
protected $casts = [
1617
'tags' => 'array',
18+
'val' => ConfigValueCast::class,
1719
];
1820

1921
public function __construct($attributes = [])

src/Enums/ConfigDataType.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
namespace TarfinLabs\LaravelConfig\Enums;
4+
5+
enum ConfigDataType: string
6+
{
7+
case INTEGER = 'integer';
8+
case BOOLEAN = 'boolean';
9+
case JSON = 'json';
10+
case DATE = 'date';
11+
case DATE_TIME = 'datetime';
12+
}

src/LaravelConfig.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,15 @@ public function getNested(string $namespace): Collection
4747
}
4848

4949
$param->name = rtrim($name, '.');
50+
5051
$config->push($param);
5152
}
5253

5354
return $config;
5455
}
5556

5657
/**
57-
* @param $tags
58+
* @param $tags
5859
* @return Collection
5960
*/
6061
public function getByTag($tags): ?Collection

tests/LaravelConfigTest.php

Lines changed: 93 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22

33
namespace TarfinLabs\LaravelConfig\Tests;
44

5+
use Carbon\Carbon;
56
use Illuminate\Support\Str;
67
use TarfinLabs\LaravelConfig\Config\Config;
78
use TarfinLabs\LaravelConfig\Config\ConfigFactory;
9+
use TarfinLabs\LaravelConfig\Enums\ConfigDataType;
810
use TarfinLabs\LaravelConfig\LaravelConfig;
911

1012
class LaravelConfigTest extends TestCase
@@ -24,17 +26,17 @@ public function it_create_a_new_config_parameter(): void
2426
{
2527
$factory = new ConfigFactory();
2628
$configItem = $factory->setName(Str::random(5))
27-
->setType('boolean')
29+
->setType(ConfigDataType::BOOLEAN)
2830
->setValue('1')
2931
->setDescription(Str::random(50))
3032
->get();
3133

3234
$this->laravelConfig->create($configItem);
3335

3436
$this->assertDatabaseHas(config('laravel-config.table'), [
35-
'name' => $configItem->name,
36-
'val' => $configItem->val,
37-
'type' => $configItem->type,
37+
'name' => $configItem->name,
38+
'val' => $configItem->val,
39+
'type' => $configItem->type,
3840
'description' => $configItem->description,
3941
]);
4042
}
@@ -44,7 +46,7 @@ public function it_create_a_new_config_parameter_with_tag(): void
4446
{
4547
$factory = new ConfigFactory();
4648
$configItem = $factory->setName(Str::random(5))
47-
->setType('boolean')
49+
->setType(ConfigDataType::BOOLEAN)
4850
->setValue('1')
4951
->setTags(['system'])
5052
->setDescription(Str::random(50))
@@ -53,9 +55,9 @@ public function it_create_a_new_config_parameter_with_tag(): void
5355
$this->laravelConfig->create($configItem);
5456

5557
$this->assertDatabaseHas(config('laravel-config.table'), [
56-
'name' => $configItem->name,
57-
'val' => $configItem->val,
58-
'type' => $configItem->type,
58+
'name' => $configItem->name,
59+
'val' => $configItem->val,
60+
'type' => $configItem->type,
5961
'description' => $configItem->description,
6062
]);
6163

@@ -70,7 +72,7 @@ public function it_does_not_create_a_config_parameter_with_the_same_name(): void
7072

7173
$factory = new ConfigFactory();
7274
$configItem = $factory->setName($config->name)
73-
->setType('boolean')
75+
->setType(ConfigDataType::BOOLEAN)
7476
->setValue('1')
7577
->setDescription(Str::random(50))
7678
->get();
@@ -87,17 +89,17 @@ public function it_updates_existing_config_parameter(): void
8789
$this->assertDatabaseHas(config('laravel-config.table'), ['name' => $config->name, 'val' => $config->val]);
8890

8991
$factory = new ConfigFactory($config);
90-
$configItem = $factory->setType('boolean')
92+
$configItem = $factory->setType(ConfigDataType::BOOLEAN)
9193
->setValue('0')
9294
->setDescription('updated-description')
9395
->get();
9496

9597
$this->laravelConfig->update($config, $configItem);
9698

9799
$this->assertDatabaseHas(config('laravel-config.table'), [
98-
'name' => $config->name,
99-
'val' => $configItem->val,
100-
'type' => $configItem->type,
100+
'name' => $config->name,
101+
'val' => $configItem->val,
102+
'type' => $configItem->type,
101103
'description' => $configItem->description,
102104
]);
103105
}
@@ -191,13 +193,13 @@ public function it_returns_all_config_parameters(): void
191193
public function it_returns_nested_config_parameters(): void
192194
{
193195
factory(Config::class)->create([
194-
'name' => 'foo.bar',
195-
'val' => true,
196+
'name' => 'foo.bar',
197+
'val' => true,
196198
]);
197199

198200
factory(Config::class)->create([
199-
'name' => 'foo.baz',
200-
'val' => false,
201+
'name' => 'foo.baz',
202+
'val' => false,
201203
]);
202204

203205
$response = $this->laravelConfig->getNested('foo');
@@ -206,4 +208,78 @@ public function it_returns_nested_config_parameters(): void
206208
$this->assertEquals('bar', $response->first()->name);
207209
$this->assertEquals('baz', $response->last()->name);
208210
}
211+
212+
/** @test */
213+
public function it_returns_boolean_value_for_boolean_type_config_parameter_if_exists(): void
214+
{
215+
$config = factory(Config::class)->create([
216+
'name' => 'yunus.was.here',
217+
'val' => '1',
218+
'type' => ConfigDataType::BOOLEAN,
219+
]);
220+
221+
$response = $this->laravelConfig->get($config->name);
222+
223+
$this->assertTrue($response);
224+
}
225+
226+
/** @test */
227+
public function it_returns_integer_value_for_integer_type_config_parameter_if_exists(): void
228+
{
229+
$config = factory(Config::class)->create([
230+
'name' => 'yunus.was.here',
231+
'val' => '123456',
232+
'type' => ConfigDataType::INTEGER,
233+
]);
234+
235+
$response = $this->laravelConfig->get($config->name);
236+
237+
$this->assertIsInt($response);
238+
}
239+
240+
/** @test */
241+
public function it_returns_datetime_value_for_datetime_type_config_parameter_if_exists(): void
242+
{
243+
$config = factory(Config::class)->create([
244+
'name' => 'yunus.was.here',
245+
'val' => '2024-02-29 12:00',
246+
'type' => ConfigDataType::DATE_TIME,
247+
]);
248+
249+
$response = $this->laravelConfig->get($config->name);
250+
251+
$this->assertInstanceOf(Carbon::class, $response);
252+
}
253+
254+
/** @test */
255+
public function it_returns_date_value_for_date_type_config_parameter_if_exists(): void
256+
{
257+
$config = factory(Config::class)->create([
258+
'name' => 'yunus.was.here',
259+
'val' => '2024-02-29',
260+
'type' => ConfigDataType::DATE,
261+
]);
262+
263+
$response = $this->laravelConfig->get($config->name);
264+
265+
$this->assertInstanceOf(Carbon::class, $response);
266+
}
267+
268+
/** @test */
269+
public function it_returns_json_value_for_json_type_config_parameter_if_exists(): void
270+
{
271+
$config = factory(Config::class)->create([
272+
'name' => 'yunus.was.here',
273+
'val' => '{"9":[7,8,9],"2":[7,8,9],"31":[10,11,12]}',
274+
'type' => ConfigDataType::JSON,
275+
]);
276+
277+
$response = $this->laravelConfig->get($config->name);
278+
279+
$this->assertIsArray($response);
280+
281+
$this->assertArrayHasKey(9, $response);
282+
$this->assertArrayHasKey(2, $response);
283+
$this->assertArrayHasKey(31, $response);
284+
}
209285
}

0 commit comments

Comments
 (0)