From 45a1ccd27f69fb2d110676f1247749483e4bed3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Munsch?= Date: Tue, 2 Mar 2021 21:24:04 +0100 Subject: [PATCH] Breaking change BaseEnum to Array indexes where cast to integers This would break enum values that where numeric strings ToArray now returns a list of BaseEnums --- changelog.md | 7 +++++++ src/BaseEnum.php | 25 ++++++++++++++--------- tests/EnumTest.php | 27 +++++++++++++++++-------- tests/Enums/ForceStringsFromInteger.php | 22 ++++++++++++++++++++ 4 files changed, 64 insertions(+), 17 deletions(-) create mode 100644 tests/Enums/ForceStringsFromInteger.php diff --git a/changelog.md b/changelog.md index 5f7de29..c002ebe 100644 --- a/changelog.md +++ b/changelog.md @@ -19,3 +19,10 @@ All notable changes to `Enum` will be documented in this file. protected $enumCasts = [ 'status' => OrderStatus::class // This is a class that extends \Kwaadpepper\Enum\BaseEnum ]; + +## Version 0.1.0 + +### - Changed +- toArray Method now returns an array of BaseEnums + this is because php numeric string array indexes to int, this would break + origin enum values diff --git a/src/BaseEnum.php b/src/BaseEnum.php index b4c1f5c..9f6f517 100644 --- a/src/BaseEnum.php +++ b/src/BaseEnum.php @@ -28,17 +28,14 @@ abstract class BaseEnum implements JsonSerializable, UrlRoutable private static $definitionCache = []; /** - * @return string[] - * @return array + * @return array[BaseEnum] */ public static function toArray(): array { $array = []; - foreach (static::resolveDefinition() as $definition) { - $array[$definition->value] = $definition->label; + $array[] = static::make($definition->value); } - return $array; } @@ -47,7 +44,9 @@ abstract class BaseEnum implements JsonSerializable, UrlRoutable */ public static function toValues(): array { - return array_keys(static::toArray()); + return \array_map(function ($baseEnum) { + return $baseEnum->value; + }, static::toArray()); } /** @@ -55,7 +54,9 @@ abstract class BaseEnum implements JsonSerializable, UrlRoutable */ public static function toLabels(): array { - return array_values(static::toArray()); + return \array_map(function ($baseEnum) { + return $baseEnum->label; + }, static::toArray()); } /** @@ -84,7 +85,6 @@ abstract class BaseEnum implements JsonSerializable, UrlRoutable { if (!(is_string($value) || is_int($value))) { $enumClass = static::class; - throw new TypeError("Only string and integer are allowed values for enum {$enumClass}."); } @@ -300,11 +300,18 @@ abstract class BaseEnum implements JsonSerializable, UrlRoutable */ public function resolveRouteBinding($value, $field = null) { + // try to cast numeric value first try { return static::make(is_numeric($value) ? intval($value) : $value); } catch (BadMethodCallException $e) { - return null; } + // try string value after that + try { + return static::make($value); + } catch (BadMethodCallException $e) { + } + // could not find a suitable value + return null; } /** diff --git a/tests/EnumTest.php b/tests/EnumTest.php index 92346db..5ada54d 100644 --- a/tests/EnumTest.php +++ b/tests/EnumTest.php @@ -4,6 +4,7 @@ namespace Kwaadpepper\Enum\Tests; use Kwaadpepper\Enum\Tests\Enums\ContactFormCivility; use Kwaadpepper\Enum\Tests\Enums\Days; +use Kwaadpepper\Enum\Tests\Enums\ForceStringsFromInteger; use Orchestra\Testbench\TestCase; class EnumTest extends TestCase @@ -29,6 +30,9 @@ class EnumTest extends TestCase $router->get('/civilities/{civility}', function (ContactFormCivility $civility) { return response()->json([$civility]); })->middleware('bindings'); + $router->get('/force/{force}', function (ForceStringsFromInteger $force) { + return response()->json([$force]); + })->middleware('bindings'); } @@ -69,14 +73,14 @@ class EnumTest extends TestCase 7 => 'Sunday' ], Days::toLabels()); $this->assertEquals([ - 0 => 'None', - 1 => 'Monday', - 2 => 'Tuesday', - 4 => 'Wednesday', - 8 => 'Thursday', - 16 => 'Friday', - 32 => 'Saturday', - 64 => 'Sunday' + 0 => Days::none(), + 1 => Days::mon(), + 2 => Days::tue(), + 3 => Days::wed(), + 4 => Days::thu(), + 5 => Days::fri(), + 6 => Days::sat(), + 7 => Days::sun() ], Days::toArray()); $this->assertEquals('Monday', (string)$mon); } @@ -97,4 +101,11 @@ class EnumTest extends TestCase $response->assertOk(); $response->assertExactJson([ContactFormCivility::mme()]); } + + public function testRoutesWithEnumIntString() + { + $response = $this->call('GET', '/force/1'); + $response->assertOk(); + $response->assertExactJson([ForceStringsFromInteger::valueB()]); + } } diff --git a/tests/Enums/ForceStringsFromInteger.php b/tests/Enums/ForceStringsFromInteger.php new file mode 100644 index 0000000..0a65806 --- /dev/null +++ b/tests/Enums/ForceStringsFromInteger.php @@ -0,0 +1,22 @@ + '0', + 'valueB' => '1', + 'valueC' => '2' + ]; + } +}