diff --git a/composer.json b/composer.json index 9a7962e..4e010a8 100644 --- a/composer.json +++ b/composer.json @@ -22,7 +22,6 @@ "zerodahero/laravel-workflow": "^4.0|^5.0" }, "require-dev": { - "larastan/larastan": "^2.9", "laravel/pint": "^1.14", "nunomaduro/collision": "^8.1.1||^7.10.0", "orchestra/canvas": "^8.8||^9.1", @@ -31,6 +30,7 @@ "pestphp/pest-plugin-arch": "^2.7", "pestphp/pest-plugin-laravel": "^2.3", "phpstan/extension-installer": "^1.3", + "phpstan/phpstan": "^1.0", "phpstan/phpstan-deprecation-rules": "^1.1", "phpstan/phpstan-phpunit": "^1.3", "spatie/laravel-ray": "^1.35" diff --git a/phpstan.neon.dist b/phpstan.neon.dist index ab1b4c3..9482051 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -7,6 +7,6 @@ parameters: - src - config - database + tmpDir: build/phpstan - checkOctaneCompatibility: true - checkModelProperties: true + \ No newline at end of file diff --git a/src/DatabaseLoader.php b/src/DatabaseLoader.php index 3f4cc5f..0d0a35e 100644 --- a/src/DatabaseLoader.php +++ b/src/DatabaseLoader.php @@ -57,14 +57,14 @@ public function getWorkflowStateTransitionTableName(): string public function load(string $workflowName): array { - //$repo = app()->make(WorkflowRepository::class); + // $repo = app()->make(WorkflowRepository::class); return $this->repo->findByName($workflowName); } public function all(): array { - //$repo = app()->make(WorkflowRepository::class); + // $repo = app()->make(WorkflowRepository::class); return $this->repo->all(); } diff --git a/src/Models/WorkflowTransition.php b/src/Models/WorkflowTransition.php index 299f6cf..bbf9a86 100644 --- a/src/Models/WorkflowTransition.php +++ b/src/Models/WorkflowTransition.php @@ -13,6 +13,8 @@ class WorkflowTransition extends Model { use HasFactory; + protected $table = 'workflow_transitions'; // Static fallback + protected $guarded = ['id']; protected $casts = [ @@ -21,7 +23,17 @@ class WorkflowTransition extends Model public function getTable(): string { - return app(DatabaseLoader::class)->getWorkflowTransitionTableName(); + // ใช้ static table name ในช่วงที่ analyze + if (app()->runningInConsole() && + (! app()->bound(DatabaseLoader::class) || app()->environment('testing'))) { + return $this->table; + } + + try { + return app(DatabaseLoader::class)->getWorkflowTransitionTableName(); + } catch (\Exception $e) { + return $this->table; + } } public function workflow(): BelongsTo diff --git a/src/WorkflowLoaderServiceProvider.php b/src/WorkflowLoaderServiceProvider.php index c6c4a81..bc043e0 100644 --- a/src/WorkflowLoaderServiceProvider.php +++ b/src/WorkflowLoaderServiceProvider.php @@ -10,11 +10,6 @@ class WorkflowLoaderServiceProvider extends PackageServiceProvider { public function configurePackage(Package $package): void { - /* - * This class is a Package Service Provider - * - * More info: https://github.com/spatie/laravel-package-tools - */ $package ->name('laravel-workflow-loader') ->hasConfigFile('workflow_loader') @@ -30,16 +25,41 @@ public function configurePackage(Package $package): void public function packageRegistered() { - $this->app->when(\Soap\WorkflowLoader\DatabaseLoader::class) - ->needs('$config') - ->give($this->app->make('config')->get('workflow_loader.loaders.database')); + // Register DatabaseLoader with safe config retrieval + $this->app->singleton(DatabaseLoader::class, function ($app) { + $config = $app['config']->get('workflow_loader.loaders.database', []); - $this->app->when(\Soap\WorkflowLoader\WorkflowLoaderRegistry::class) - ->needs('$loaders') - ->give($this->app->make('config')->get('workflow_loader.loaders')); + // Provide default config if not found + if (empty($config) || ! isset($config['tableNames'])) { + $config = [ + 'tableNames' => [ + 'workflows' => 'workflows', + 'workflow_states' => 'workflow_states', + 'workflow_transitions' => 'workflow_transitions', + 'workflow_state_transitions' => 'workflow_state_transitions', + ], + ]; + } - $this->app->bind(\Soap\WorkflowLoader\Contracts\WorkflowDatabaseLoader::class, \Soap\WorkflowLoader\DatabaseLoader::class); + return new DatabaseLoader( + $config, + $app->make(Repositories\WorkflowRepository::class) + ); + }); - $this->app->singleton('workflowLoaderRegistry', \Soap\WorkflowLoader\WorkflowLoaderRegistry::class); + // Register WorkflowLoaderRegistry + $this->app->singleton(WorkflowLoaderRegistry::class, function ($app) { + $loaders = $app['config']->get('workflow_loader.loaders', []); + + return new WorkflowLoaderRegistry($loaders); + }); + + // Bind contracts + $this->app->bind( + Contracts\WorkflowDatabaseLoader::class, + DatabaseLoader::class + ); + + $this->app->singleton('workflowLoaderRegistry', WorkflowLoaderRegistry::class); } }