代码同步
This commit is contained in:
74
Server/vendor/myclabs/php-enum/README.md
vendored
74
Server/vendor/myclabs/php-enum/README.md
vendored
@@ -1,9 +1,9 @@
|
||||
# PHP Enum implementation inspired from SplEnum
|
||||
|
||||
[](https://travis-ci.org/myclabs/php-enum)
|
||||
[![GitHub Actions][GA Image]][GA Link]
|
||||
[](https://packagist.org/packages/myclabs/php-enum)
|
||||
[](https://packagist.org/packages/myclabs/php-enum)
|
||||
[](https://shepherd.dev/github/myclabs/php-enum)
|
||||
[![Psalm Shepherd][Shepherd Image]][Shepherd Link]
|
||||
|
||||
Maintenance for this project is [supported via Tidelift](https://tidelift.com/subscription/pkg/packagist-myclabs-php-enum?utm_source=packagist-myclabs-php-enum&utm_medium=referral&utm_campaign=readme).
|
||||
|
||||
@@ -35,7 +35,7 @@ use MyCLabs\Enum\Enum;
|
||||
/**
|
||||
* Action enum
|
||||
*/
|
||||
class Action extends Enum
|
||||
final class Action extends Enum
|
||||
{
|
||||
private const VIEW = 'view';
|
||||
private const EDIT = 'edit';
|
||||
@@ -50,6 +50,8 @@ $action = Action::VIEW();
|
||||
// or with a dynamic key:
|
||||
$action = Action::$key();
|
||||
// or with a dynamic value:
|
||||
$action = Action::from($value);
|
||||
// or
|
||||
$action = new Action($value);
|
||||
```
|
||||
|
||||
@@ -73,17 +75,19 @@ function setAction(Action $action) {
|
||||
|
||||
Static methods:
|
||||
|
||||
- `from()` Creates an Enum instance, checking that the value exist in the enum
|
||||
- `toArray()` method Returns all possible values as an array (constant name in key, constant value in value)
|
||||
- `keys()` Returns the names (keys) of all constants in the Enum class
|
||||
- `values()` Returns instances of the Enum class of all Enum constants (constant name in key, Enum instance in value)
|
||||
- `isValid()` Check if tested value is valid on enum set
|
||||
- `isValidKey()` Check if tested key is valid on enum set
|
||||
- `assertValidValue()` Assert the value is valid on enum set, throwing exception otherwise
|
||||
- `search()` Return key for searched value
|
||||
|
||||
### Static methods
|
||||
|
||||
```php
|
||||
class Action extends Enum
|
||||
final class Action extends Enum
|
||||
{
|
||||
private const VIEW = 'view';
|
||||
private const EDIT = 'edit';
|
||||
@@ -99,7 +103,7 @@ Static method helpers are implemented using [`__callStatic()`](http://www.php.ne
|
||||
If you care about IDE autocompletion, you can either implement the static methods yourself:
|
||||
|
||||
```php
|
||||
class Action extends Enum
|
||||
final class Action extends Enum
|
||||
{
|
||||
private const VIEW = 'view';
|
||||
|
||||
@@ -119,16 +123,72 @@ or you can use phpdoc (this is supported in PhpStorm for example):
|
||||
* @method static Action VIEW()
|
||||
* @method static Action EDIT()
|
||||
*/
|
||||
class Action extends Enum
|
||||
final class Action extends Enum
|
||||
{
|
||||
private const VIEW = 'view';
|
||||
private const EDIT = 'edit';
|
||||
}
|
||||
```
|
||||
|
||||
## Native enums and migration
|
||||
Native enum arrived to PHP in version 8.1: https://www.php.net/enumerations
|
||||
If your project is running PHP 8.1+ or your library has it as a minimum requirement you should use it instead of this library.
|
||||
|
||||
When migrating from `myclabs/php-enum`, the effort should be small if the usage was in the recommended way:
|
||||
- private constants
|
||||
- final classes
|
||||
- no method overridden
|
||||
|
||||
Changes for migration:
|
||||
- Class definition should be changed from
|
||||
```php
|
||||
/**
|
||||
* @method static Action VIEW()
|
||||
* @method static Action EDIT()
|
||||
*/
|
||||
final class Action extends Enum
|
||||
{
|
||||
private const VIEW = 'view';
|
||||
private const EDIT = 'edit';
|
||||
}
|
||||
```
|
||||
to
|
||||
```php
|
||||
enum Action: string
|
||||
{
|
||||
case VIEW = 'view';
|
||||
case EDIT = 'edit';
|
||||
}
|
||||
```
|
||||
All places where the class was used as a type will continue to work.
|
||||
|
||||
Usages and the change needed:
|
||||
|
||||
| Operation | myclabs/php-enum | native enum |
|
||||
|----------------------------------------------------------------|----------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| Obtain an instance will change from | `$enumCase = Action::VIEW()` | `$enumCase = Action::VIEW` |
|
||||
| Create an enum from a backed value | `$enumCase = new Action('view')` | `$enumCase = Action::from('view')` |
|
||||
| Get the backed value of the enum instance | `$enumCase->getValue()` | `$enumCase->value` |
|
||||
| Compare two enum instances | `$enumCase1 == $enumCase2` <br/> or <br/> `$enumCase1->equals($enumCase2)` | `$enumCase1 === $enumCase2` |
|
||||
| Get the key/name of the enum instance | `$enumCase->getKey()` | `$enumCase->name` |
|
||||
| Get a list of all the possible instances of the enum | `Action::values()` | `Action::cases()` |
|
||||
| Get a map of possible instances of the enum mapped by name | `Action::values()` | `array_combine(array_map(fn($case) => $case->name, Action::cases()), Action::cases())` <br/> or <br/> `(new ReflectionEnum(Action::class))->getConstants()` |
|
||||
| Get a list of all possible names of the enum | `Action::keys()` | `array_map(fn($case) => $case->name, Action::cases())` |
|
||||
| Get a list of all possible backed values of the enum | `Action::toArray()` | `array_map(fn($case) => $case->value, Action::cases())` |
|
||||
| Get a map of possible backed values of the enum mapped by name | `Action::toArray()` | `array_combine(array_map(fn($case) => $case->name, Action::cases()), array_map(fn($case) => $case->value, Action::cases()))` <br/> or <br/> `array_map(fn($case) => $case->value, (new ReflectionEnum(Action::class))->getConstants()))` |
|
||||
|
||||
## Related projects
|
||||
|
||||
- [PHP 8.1+ native enum](https://www.php.net/enumerations)
|
||||
- [Doctrine enum mapping](https://github.com/acelaya/doctrine-enum-type)
|
||||
- [Symfony ParamConverter integration](https://github.com/Ex3v/MyCLabsEnumParamConverter)
|
||||
- [PHPStan integration](https://github.com/timeweb/phpstan-enum)
|
||||
- [Yii2 enum mapping](https://github.com/KartaviK/yii2-enum)
|
||||
|
||||
|
||||
[GA Image]: https://github.com/myclabs/php-enum/workflows/CI/badge.svg
|
||||
|
||||
[GA Link]: https://github.com/myclabs/php-enum/actions?query=workflow%3A%22CI%22+branch%3Amaster
|
||||
|
||||
[Shepherd Image]: https://shepherd.dev/github/myclabs/php-enum/coverage.svg
|
||||
|
||||
[Shepherd Link]: https://shepherd.dev/github/myclabs/php-enum
|
||||
|
||||
11
Server/vendor/myclabs/php-enum/composer.json
vendored
11
Server/vendor/myclabs/php-enum/composer.json
vendored
@@ -14,7 +14,10 @@
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"MyCLabs\\Enum\\": "src/"
|
||||
}
|
||||
},
|
||||
"classmap": [
|
||||
"stubs/Stringable.php"
|
||||
]
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
@@ -22,12 +25,12 @@
|
||||
}
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.1",
|
||||
"php": "^7.3 || ^8.0",
|
||||
"ext-json": "*"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^7",
|
||||
"phpunit/phpunit": "^9.5",
|
||||
"squizlabs/php_codesniffer": "1.*",
|
||||
"vimeo/psalm": "^3.8"
|
||||
"vimeo/psalm": "^4.6.2"
|
||||
}
|
||||
}
|
||||
|
||||
20
Server/vendor/myclabs/php-enum/psalm.xml
vendored
20
Server/vendor/myclabs/php-enum/psalm.xml
vendored
@@ -1,20 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<psalm
|
||||
totallyTyped="true"
|
||||
resolveFromConfigFile="true"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="https://getpsalm.org/schema/config"
|
||||
xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
|
||||
>
|
||||
<projectFiles>
|
||||
<directory name="src" />
|
||||
<ignoreFiles>
|
||||
<directory name="vendor" />
|
||||
<directory name="src/PHPUnit" />
|
||||
</ignoreFiles>
|
||||
</projectFiles>
|
||||
|
||||
<issueHandlers>
|
||||
<MixedAssignment errorLevel="info" />
|
||||
</issueHandlers>
|
||||
</psalm>
|
||||
88
Server/vendor/myclabs/php-enum/src/Enum.php
vendored
88
Server/vendor/myclabs/php-enum/src/Enum.php
vendored
@@ -17,8 +17,9 @@ namespace MyCLabs\Enum;
|
||||
*
|
||||
* @psalm-template T
|
||||
* @psalm-immutable
|
||||
* @psalm-consistent-constructor
|
||||
*/
|
||||
abstract class Enum implements \JsonSerializable
|
||||
abstract class Enum implements \JsonSerializable, \Stringable
|
||||
{
|
||||
/**
|
||||
* Enum value
|
||||
@@ -28,6 +29,13 @@ abstract class Enum implements \JsonSerializable
|
||||
*/
|
||||
protected $value;
|
||||
|
||||
/**
|
||||
* Enum key, the constant name
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $key;
|
||||
|
||||
/**
|
||||
* Store existing constants in a static cache per object.
|
||||
*
|
||||
@@ -51,7 +59,7 @@ abstract class Enum implements \JsonSerializable
|
||||
* @psalm-pure
|
||||
* @param mixed $value
|
||||
*
|
||||
* @psalm-param static<T>|T $value
|
||||
* @psalm-param T $value
|
||||
* @throws \UnexpectedValueException if incompatible type is given.
|
||||
*/
|
||||
public function __construct($value)
|
||||
@@ -61,15 +69,40 @@ abstract class Enum implements \JsonSerializable
|
||||
$value = $value->getValue();
|
||||
}
|
||||
|
||||
if (!$this->isValid($value)) {
|
||||
/** @psalm-suppress InvalidCast */
|
||||
throw new \UnexpectedValueException("Value '$value' is not part of the enum " . static::class);
|
||||
}
|
||||
/** @psalm-suppress ImplicitToStringCast assertValidValueReturningKey returns always a string but psalm has currently an issue here */
|
||||
$this->key = static::assertValidValueReturningKey($value);
|
||||
|
||||
/** @psalm-var T */
|
||||
$this->value = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method exists only for the compatibility reason when deserializing a previously serialized version
|
||||
* that didn't had the key property
|
||||
*/
|
||||
public function __wakeup()
|
||||
{
|
||||
/** @psalm-suppress DocblockTypeContradiction key can be null when deserializing an enum without the key */
|
||||
if ($this->key === null) {
|
||||
/**
|
||||
* @psalm-suppress InaccessibleProperty key is not readonly as marked by psalm
|
||||
* @psalm-suppress PossiblyFalsePropertyAssignmentValue deserializing a case that was removed
|
||||
*/
|
||||
$this->key = static::search($this->value);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $value
|
||||
* @return static
|
||||
*/
|
||||
public static function from($value): self
|
||||
{
|
||||
$key = static::assertValidValueReturningKey($value);
|
||||
|
||||
return self::__callStatic($key, []);
|
||||
}
|
||||
|
||||
/**
|
||||
* @psalm-pure
|
||||
* @return mixed
|
||||
@@ -84,11 +117,11 @@ abstract class Enum implements \JsonSerializable
|
||||
* Returns the enum key (i.e. the constant name).
|
||||
*
|
||||
* @psalm-pure
|
||||
* @return mixed
|
||||
* @return string
|
||||
*/
|
||||
public function getKey()
|
||||
{
|
||||
return static::search($this->value);
|
||||
return $this->key;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -163,7 +196,9 @@ abstract class Enum implements \JsonSerializable
|
||||
$class = static::class;
|
||||
|
||||
if (!isset(static::$cache[$class])) {
|
||||
/** @psalm-suppress ImpureMethodCall this reflection API usage has no side-effects here */
|
||||
$reflection = new \ReflectionClass($class);
|
||||
/** @psalm-suppress ImpureMethodCall this reflection API usage has no side-effects here */
|
||||
static::$cache[$class] = $reflection->getConstants();
|
||||
}
|
||||
|
||||
@@ -176,6 +211,7 @@ abstract class Enum implements \JsonSerializable
|
||||
* @param $value
|
||||
* @psalm-param mixed $value
|
||||
* @psalm-pure
|
||||
* @psalm-assert-if-true T $value
|
||||
* @return bool
|
||||
*/
|
||||
public static function isValid($value)
|
||||
@@ -183,6 +219,35 @@ abstract class Enum implements \JsonSerializable
|
||||
return \in_array($value, static::toArray(), true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Asserts valid enum value
|
||||
*
|
||||
* @psalm-pure
|
||||
* @psalm-assert T $value
|
||||
* @param mixed $value
|
||||
*/
|
||||
public static function assertValidValue($value): void
|
||||
{
|
||||
self::assertValidValueReturningKey($value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Asserts valid enum value
|
||||
*
|
||||
* @psalm-pure
|
||||
* @psalm-assert T $value
|
||||
* @param mixed $value
|
||||
* @return string
|
||||
*/
|
||||
private static function assertValidValueReturningKey($value): string
|
||||
{
|
||||
if (false === ($key = static::search($value))) {
|
||||
throw new \UnexpectedValueException("Value '$value' is not part of the enum " . static::class);
|
||||
}
|
||||
|
||||
return $key;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if is valid enum key
|
||||
*
|
||||
@@ -201,11 +266,11 @@ abstract class Enum implements \JsonSerializable
|
||||
/**
|
||||
* Return key for value
|
||||
*
|
||||
* @param $value
|
||||
* @param mixed $value
|
||||
*
|
||||
* @psalm-param mixed $value
|
||||
* @psalm-pure
|
||||
* @return mixed
|
||||
* @return string|false
|
||||
*/
|
||||
public static function search($value)
|
||||
{
|
||||
@@ -220,6 +285,8 @@ abstract class Enum implements \JsonSerializable
|
||||
*
|
||||
* @return static
|
||||
* @throws \BadMethodCallException
|
||||
*
|
||||
* @psalm-pure
|
||||
*/
|
||||
public static function __callStatic($name, $arguments)
|
||||
{
|
||||
@@ -243,6 +310,7 @@ abstract class Enum implements \JsonSerializable
|
||||
* @link http://php.net/manual/en/jsonserializable.jsonserialize.php
|
||||
* @psalm-pure
|
||||
*/
|
||||
#[\ReturnTypeWillChange]
|
||||
public function jsonSerialize()
|
||||
{
|
||||
return $this->getValue();
|
||||
|
||||
11
Server/vendor/myclabs/php-enum/stubs/Stringable.php
vendored
Normal file
11
Server/vendor/myclabs/php-enum/stubs/Stringable.php
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
|
||||
if (\PHP_VERSION_ID < 80000 && !interface_exists('Stringable')) {
|
||||
interface Stringable
|
||||
{
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function __toString();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user