Skip to content
Merged
Show file tree
Hide file tree
Changes from 14 commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
63db580
ADD laravel-backed-enum.stub
Jim-Webfox Jan 16, 2025
9d1c2ba
FIX LaravelBackedEnumsServiceProvider.php to register command correctly
Jim-Webfox Jan 16, 2025
1f26573
FIX LaravelBackedEnumMakeCommand.php resolve class_basename
Jim-Webfox Jan 16, 2025
478c2d3
MOD stub formatting
Jim-Webfox Jan 16, 2025
bf3487b
MOD changes as per comments from code rabbit
Jim-Webfox Jan 16, 2025
299be5a
Update to override og make enum command still need to update readme
Jim-Webfox Jan 20, 2025
ada774b
Update readme
Jim-Webfox Jan 20, 2025
c6c5433
Fix tests.
Jim-Webfox Jan 20, 2025
d71dbdb
Merge branch 'main' into Feature/add-make-command
Jim-Webfox Jan 20, 2025
4d6d63f
update phpstan
Jim-Webfox Jan 20, 2025
f49cc32
TEST
Jim-Webfox Jan 20, 2025
7af08f2
TEST
Jim-Webfox Jan 21, 2025
18ce1a7
TEST
Jim-Webfox Jan 21, 2025
d775c5c
TEST
Jim-Webfox Jan 21, 2025
6b9c36d
TEST
Jim-Webfox Jan 21, 2025
f379e1e
TEST
Jim-Webfox Jan 21, 2025
dcecfb9
TEST
Jim-Webfox Jan 21, 2025
cb81515
TEST
Jim-Webfox Jan 21, 2025
bfc9079
TEST
Jim-Webfox Jan 21, 2025
3c3fc77
TEST
Jim-Webfox Jan 21, 2025
bb27038
TEST
Jim-Webfox Jan 21, 2025
146b772
TEST
Jim-Webfox Jan 21, 2025
b71f137
TEST
Jim-Webfox Jan 21, 2025
71d8a5b
TEST
Jim-Webfox Jan 21, 2025
0b3599c
TEST
Jim-Webfox Jan 21, 2025
4e5db9c
TEST
Jim-Webfox Jan 21, 2025
5064e73
TEST
Jim-Webfox Jan 21, 2025
68a5032
Remove PHPStan
Jim-Webfox Jan 21, 2025
bb3e9c3
Remove PHPStan
Jim-Webfox Jan 21, 2025
fb12a1d
Update gitignro
Jim-Webfox Jan 21, 2025
554e8d4
Merge branch 'main' into Feature/add-make-command
Jim-Webfox Jan 21, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions .github/workflows/run-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,20 @@ name: run-tests

on:
push:
branches: [main]
branches: [ main ]
pull_request:
branches: [main]
workflow_dispatch:
branches: [ main ]

jobs:
test:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: true
matrix:
os: [ubuntu-latest]
php: [8.2]
laravel: [11.*]
stability: [prefer-lowest, prefer-stable]
os: [ ubuntu-latest ]
php: [ 8.2 ]
laravel: [ 10.*,11.* ]
stability: [ prefer-lowest, prefer-stable ]

name: P${{ matrix.php }} - L${{ matrix.laravel }} - ${{ matrix.stability }} - ${{ matrix.os }}

Expand All @@ -38,6 +37,7 @@ jobs:

- name: Install dependencies
run: |
composer require "laravel/framework:${{ matrix.laravel }}" --no-interaction --no-update
composer install

- name: Execute tests
Expand Down
86 changes: 66 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,45 @@ composer require webfox/laravel-backed-enums

## Usage

### Setup your enum
### Make Command

Conveniently create a new laravel backed enum using the existing enum make command.

#### Command:

```Bash
php artisan make:enum {name} {type?}
```

#### Arguments:

* `{name}`: The name of the enum class to be created (e.g., OrderStatus). The command will automatically append "Enum" to the name (e.g., OrderStatusEnum).
* `{type?}`: The underlying data type for the enum. Can be either --int --string or if not specified it will be a pure enum.
* `{--force}`: Overwrite the enum if it already exists.
Example Usage:

To create an enum named OrderStatusEnum backed by integers:

``` Bash
php artisan make:enum OrderStatus --int
```

To create an enum named OrderStatusEnum backed by strings:

``` Bash
php artisan make:enum OrderStatus --string
```

To create a pure enum named OrderStatusEnum:

``` Bash
php artisan make:enum OrderStatus

```

This will generate an OrderStatusEnums in the `app/Enums` directory.

### Upgrade your existing enums

The enum you create must implement the `BackedEnum` interface and also use the `IsBackedEnum` trait.
The interface is required for Laravel to cast your enum correctly and the trait is what gives your enum its superpowers.
Expand Down Expand Up @@ -316,6 +354,7 @@ The backed enums may be validated using Laravel's standard Enum validation rule
This method a shortcut for the validation rule.

#### Usage

```
public function rules(): array
{
Expand All @@ -328,34 +367,41 @@ public function rules(): array
## Other Classes

### AsFullEnumCollection
This cast is similar to the Laravel built in `AsEnumCollection` cast but unlike the built-in will maintain the full `toArray` structure

This cast is similar to the Laravel built in `AsEnumCollection` cast but unlike the built-in will maintain the full `toArray` structure
when converting to json.

E.g. the Laravel built in `AsEnumCollection` cast will return the following json:

```json
["MILLIGRAMS", "GRAMS"]
[
"MILLIGRAMS",
"GRAMS"
]
```

This cast will return

```json
[
{
"name": "MILLIGRAMS",
"value": "MILLIGRAMS",
"label": "mg",
"meta": {
"background_color": "bg-green-100",
"text_color": "text-green-800"
}
},
{
"name": "GRAMS",
"value": "GRAMS",
"label": "g",
"meta": {
"background_color": "bg-red-100",
"text_color": "text-red-800"
{
"name": "MILLIGRAMS",
"value": "MILLIGRAMS",
"label": "mg",
"meta": {
"background_color": "bg-green-100",
"text_color": "text-green-800"
}
},
{
"name": "GRAMS",
"value": "GRAMS",
"label": "g",
"meta": {
"background_color": "bg-red-100",
"text_color": "text-red-800"
}
}
}
]
```

Expand Down
27 changes: 14 additions & 13 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,20 +17,21 @@
],
"require": {
"php": "^8.1",
"spatie/laravel-package-tools": "^1.14.0",
"illuminate/contracts": "^10.0|^11.0"
"illuminate/console": "^10.0 | ^11.0",
"spatie/laravel-package-tools": "^1.18",
"illuminate/contracts": "^10.0 | ^11.0"
},
"require-dev": {
"laravel/pint": "^1.0",
"nunomaduro/collision": "^6.1",
"larastan/larastan": "^v2.9.2",
"orchestra/testbench": "^8.0",
"pestphp/pest": "^1.21",
"pestphp/pest-plugin-laravel": "^1.1",
"phpstan/extension-installer": "^1.1",
"phpstan/phpstan-deprecation-rules": "^1.0",
"phpstan/phpstan-phpunit": "^1.0",
"phpunit/phpunit": "^9.6"
"laravel/pint": "^1.20",
"nunomaduro/collision": "^7.11 | ^8.5",
"pestphp/pest": "^2.36 | ^3.7",
"pestphp/pest-plugin-laravel": "^2.4 | ^3.0",
"orchestra/testbench": "^8.31 | ^9.9",
"phpunit/phpunit": "^10.5 | ^11.5",
"phpstan/extension-installer": "^1.4",
"larastan/larastan": "^2.9 | ^3.0",
"phpstan/phpstan-phpunit": "^1.4 | ^2.0",
"phpstan/phpstan-deprecation-rules": "^1.2 | ^2.0"
},
"autoload": {
"psr-4": {
Expand Down Expand Up @@ -83,4 +84,4 @@
},
"minimum-stability": "dev",
"prefer-stable": true
}
}
1 change: 0 additions & 1 deletion phpstan.neon.dist
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,4 @@ parameters:
tmpDir: build/phpstan
checkOctaneCompatibility: true
checkModelProperties: true
checkMissingIterableValueType: false

1 change: 1 addition & 0 deletions src/IsBackedEnum.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
/**
* @implements \Webfox\LaravelBackedEnums\BackedEnum<string,string>
* @mixin \BackedEnum<string,string>
* @phpstan-ignore trait.unused
*/
trait IsBackedEnum
{
Expand Down
61 changes: 61 additions & 0 deletions src/LaravelBackedEnumMakeCommand.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
<?php

namespace Webfox\LaravelBackedEnums;

use InvalidArgumentException;
use Illuminate\Foundation\Console\EnumMakeCommand;


class LaravelBackedEnumMakeCommand extends EnumMakeCommand

Check failure on line 9 in src/LaravelBackedEnumMakeCommand.php

View workflow job for this annotation

GitHub Actions / phpstan

Class Webfox\LaravelBackedEnums\LaravelBackedEnumMakeCommand extends unknown class Illuminate\Foundation\Console\EnumMakeCommand.
{
protected $description = 'Create a new laravel backed enum';

protected function getStub(): string
{
if ($this->option('string') || $this->option('int')) {

Check failure on line 15 in src/LaravelBackedEnumMakeCommand.php

View workflow job for this annotation

GitHub Actions / phpstan

Call to an undefined method Webfox\LaravelBackedEnums\LaravelBackedEnumMakeCommand::option().

Check failure on line 15 in src/LaravelBackedEnumMakeCommand.php

View workflow job for this annotation

GitHub Actions / phpstan

Call to an undefined method Webfox\LaravelBackedEnums\LaravelBackedEnumMakeCommand::option().
return $this->resolveStubPath('/stubs/laravel-backed-enum.stub');
}
return parent::getStub();

Check failure on line 18 in src/LaravelBackedEnumMakeCommand.php

View workflow job for this annotation

GitHub Actions / phpstan

Webfox\LaravelBackedEnums\LaravelBackedEnumMakeCommand::getStub() calls parent::getStub() but Webfox\LaravelBackedEnums\LaravelBackedEnumMakeCommand does not extend any class.
}

protected function buildClass($name): array|string
{
if ($this->option('string') || $this->option('int')) {

Check failure on line 23 in src/LaravelBackedEnumMakeCommand.php

View workflow job for this annotation

GitHub Actions / phpstan

Call to an undefined method Webfox\LaravelBackedEnums\LaravelBackedEnumMakeCommand::option().

Check failure on line 23 in src/LaravelBackedEnumMakeCommand.php

View workflow job for this annotation

GitHub Actions / phpstan

Call to an undefined method Webfox\LaravelBackedEnums\LaravelBackedEnumMakeCommand::option().
return str_replace(
['{{ value }}'],
$this->option('string') ? '\'standard\'' : '0',

Check failure on line 26 in src/LaravelBackedEnumMakeCommand.php

View workflow job for this annotation

GitHub Actions / phpstan

Call to an undefined method Webfox\LaravelBackedEnums\LaravelBackedEnumMakeCommand::option().
parent::buildClass($name)

Check failure on line 27 in src/LaravelBackedEnumMakeCommand.php

View workflow job for this annotation

GitHub Actions / phpstan

Webfox\LaravelBackedEnums\LaravelBackedEnumMakeCommand::buildClass() calls parent::buildClass() but Webfox\LaravelBackedEnums\LaravelBackedEnumMakeCommand does not extend any class.
);
}
return parent::buildClass($name);

Check failure on line 30 in src/LaravelBackedEnumMakeCommand.php

View workflow job for this annotation

GitHub Actions / phpstan

Webfox\LaravelBackedEnums\LaravelBackedEnumMakeCommand::buildClass() calls parent::buildClass() but Webfox\LaravelBackedEnums\LaravelBackedEnumMakeCommand does not extend any class.
}


protected function resolveStubPath($stub): string
{

if (file_exists($customPath = $this->laravel->basePath(trim($stub, '/')))) {

Check failure on line 37 in src/LaravelBackedEnumMakeCommand.php

View workflow job for this annotation

GitHub Actions / phpstan

Access to an undefined property Webfox\LaravelBackedEnums\LaravelBackedEnumMakeCommand::$laravel.
return $customPath;
}

if (file_exists(__DIR__ . "/../" . $stub)) {
return __DIR__ . "/../" . $stub;
}

return parent::resolveStubPath($stub);
}

protected function getNameInput(): string
{
$name = trim($this->argument('name'));
if (!preg_match('/^[A-Za-z_\x7f-\xff][A-Za-z0-9_\x7f-\xff]*$/', $name)) {
throw new InvalidArgumentException('Invalid enum name format');
}

if (str_ends_with($name, 'Enum')) {
return $name;
}

return $name . 'Enum';
}
}
6 changes: 6 additions & 0 deletions src/LaravelBackedEnumsServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,11 @@ public function configurePackage(Package $package): void
$package
->name('laravel-backed-enums')
->hasConfigFile();


/** @noinspection PhpFullyQualifiedNameUsageInspection */
if (class_exists(\Illuminate\Foundation\Console\EnumMakeCommand::class)) {
$package->hasConsoleCommand(LaravelBackedEnumMakeCommand::class);
}
}
}
17 changes: 17 additions & 0 deletions stubs/laravel-backed-enum.stub
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php

namespace {{ namespace }};

use Webfox\LaravelBackedEnums\BackedEnum;
use Webfox\LaravelBackedEnums\IsBackedEnum;

enum {{ class }}: {{ type }} implements BackedEnum
{
use IsBackedEnum;

/**
* Add your Enums below using.
* e.g. case Standard = {{ value }};
*/

}
17 changes: 17 additions & 0 deletions tests/Fixtures/ExpectedIntEnum.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php

namespace Workbench\App\Enums;

use Webfox\LaravelBackedEnums\BackedEnum;
use Webfox\LaravelBackedEnums\IsBackedEnum;

enum IntEnum: int implements BackedEnum
{
use IsBackedEnum;

/**
* Add your Enums below using.
* e.g. case Standard = 0;
*/

}
8 changes: 8 additions & 0 deletions tests/Fixtures/ExpectedPureEnum.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?php

namespace Workbench\App\Enums;

enum PureEnum
{
//
}
17 changes: 17 additions & 0 deletions tests/Fixtures/ExpectedStringEnum.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php

namespace Workbench\App\Enums;

use Webfox\LaravelBackedEnums\BackedEnum;
use Webfox\LaravelBackedEnums\IsBackedEnum;

enum StringEnum: string implements BackedEnum
{
use IsBackedEnum;

/**
* Add your Enums below using.
* e.g. case Standard = 'standard';
*/

}
Loading
Loading