diff --git a/README.md b/README.md index b5a9d0d..4003684 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,12 @@ Automatically generate interactive entity relationship diagram for models & thei This package is a heavily-customized fork from [kevincobain2000/laravel-erd](https://github.com/kevincobain2000/laravel-erd) meant for use in some very specific circumstances. If you're not part of @NIT-Administrative-Systems, you should probably check out the original package instead! +The changes include: + +- Adding ribbons to models in the diagram with PHP attributes on the model class +- Different default settings for goJS to render huge diagrams efficiently +- Different default settings for discovering models in `App\Domains\\Models` namespaces + ## Installation You can install the package via composer. @@ -18,3 +24,66 @@ php artisan erd:generate ``` This will be placed in `docs/.vuepress/public/erd`, or whatever path you have configured in `config/laravel-erd.php`. + +## Using Ribbons +Enabling ribbon support is done by registering a function to get ribbons. + +First, create an attribute with some properties you want to include in the ribbon: + +```php +#[Attribute(Attribute::TARGET_CLASS)] +class LookupAttr +{ + public function __construct( + public readonly string $source, + ) { + // + } +} +``` + +Next, register a callback in a provider's + +```php +class AppServiceProvider extends ServiceProvider { + public function boot(): void + { + /** @var ModelRibbonAdapter $adapter */ + $adapter = resolve(ModelRibbonAdapter::class); + + \Kevincobain2000\LaravelERD\LaravelERDServiceProvider::setRibbonClosure($adapter->callback()); + } + + private function ribbonCallback(): Closure + { + return function (Model $model) { + $reflection = new ReflectionClass($model); + $attributes = collect($reflection->getAttributes()) + ->map->newInstance() + ->filter(fn (object $attrObj) => $attrObj instanceof LookupAttr); + + return $attributes + ->map(function (LookupAttr $attr) { + return new \Kevincobain2000\LaravelERD\Diagram\Ribbon( + text: $attribute->source, + bgColour: '#FFE342', + textColour: 'black', + ); + }) + ->first(); + }; + } +} +``` + +And then use the attribute on some models: + +```php +#[LookupAttr('Student System')] +class DegreeType extends Model +{ + // . . . +} +``` + +This will pick them up and add a ribbon with the "Student System" text on it, indicating the table is populated from the student system's degree types. diff --git a/composer.json b/composer.json index d7b8b58..9cc7b1c 100644 --- a/composer.json +++ b/composer.json @@ -19,10 +19,10 @@ "require-dev": { "brianium/paratest": "^7.0", "laravel/pint": "^1.10", - "nunomaduro/collision": "^7.0", - "nunomaduro/larastan": "^2.0", - "orchestra/testbench": "^8.0", - "phpunit/phpunit": "^10.0" + "nunomaduro/collision": "^8.0", + "larastan/larastan": "^3.1", + "orchestra/testbench": "^10.0", + "phpunit/phpunit": "^11.0" }, "autoload": { "psr-4": { diff --git a/phpstan.neon.dist b/phpstan.neon.dist index e41eddd..e3d3132 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -1,5 +1,6 @@ includes: - - ./vendor/nunomaduro/larastan/extension.neon + - vendor/larastan/larastan/extension.neon + - vendor/nesbot/carbon/extension.neon parameters: diff --git a/src/Commands/LaravelERDCommand.php b/src/Commands/LaravelERDCommand.php index 636e54b..9121e9c 100644 --- a/src/Commands/LaravelERDCommand.php +++ b/src/Commands/LaravelERDCommand.php @@ -43,8 +43,15 @@ public function handle(LaravelERD $modelReflector): int File::makeDirectory($this->destinationPath, 0755, true); } + /** + * I think the package erd:: prefix is confusing it; it doesn't see this as a view-string. + * + * @var view-string $view + */ + $view = 'erd::index'; + File::put($this->destinationPath.'/index.html', - view('erd::index') + view($view) ->with([ 'appName' => $this->appName, 'routingType' => $this->routingType->value,