diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..227bb36 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,23 @@ +{ + "name": "codespaces-laravel", + "dockerComposeFile": ["docker-compose.yml"], + "workspaceFolder": "/workspace", + "service": "app", + "shutdownAction": "stopCompose", + "extensions": [ + "editorconfig.editorconfig", + "ryannaddy.laravel-artisan", + "amiralizadeh9480.laravel-extra-intellisense", + "stef-k.laravel-goto-controller", + "codingyu.laravel-goto-view", + "mikestead.dotenv", + "eg2.tslint", + "christian-kohler.path-intellisense", + "esbenp.prettier-vscode", + "CoenraadS.bracket-pair-colorizer" + ], + "settings": { + "#terminal.integrated.shell.linux": "/bin/bash" + }, + "postCreateCommand": "cp .env.example .env && composer install", +} diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml new file mode 100644 index 0000000..94fbb18 --- /dev/null +++ b/.devcontainer/docker-compose.yml @@ -0,0 +1,32 @@ +version: "3" +services: + app: + build: ./docker/app + volumes: + - ../:/workspace:cached + ports: + - 80:80 + tty: true + environment: + APP_ENV: local + PHP_EXTENSION_XDEBUG: 1 + PHP_EXTENSION_PGSQL: 1 + PHP_EXTENSION_PDO_PGSQL: 1 + APACHE_DOCUMENT_ROOT: /workspace/public + db: + image: postgres:13 + restart: unless-stopped + ports: + - 5432:5432 + environment: + POSTGRES_DB: laravel + POSTGRES_USER: laravel + POSTGRES_PASSWORD: laravel + redis: + image: redis:6-alpine + ports: + - 6379:6379 + mailhog: + image: mailhog/mailhog + ports: + - 8025:8025 diff --git a/.devcontainer/docker/app/Dockerfile b/.devcontainer/docker/app/Dockerfile new file mode 100644 index 0000000..ee3c2e0 --- /dev/null +++ b/.devcontainer/docker/app/Dockerfile @@ -0,0 +1,4 @@ +ARG PHP_EXTENSIONS="mysqli pgsql pdo_mysql pdo_pgsql" + +FROM thecodingmachine/php:8.1-v4-apache-node12 +WORKDIR /workspace diff --git a/src/Serializers/Y.php b/src/Serializers/Y.php index 44a99ff..791d368 100644 --- a/src/Serializers/Y.php +++ b/src/Serializers/Y.php @@ -4,7 +4,9 @@ namespace Workflow\Serializers; +use Closure; use Laravel\SerializableClosure\SerializableClosure; +use Throwable; final class Y implements SerializerInterface { @@ -40,6 +42,17 @@ public static function decode(string $data): string public static function serialize($data): string { SerializableClosure::setSecretKey(config('app.key')); + if ($data instanceof Throwable) { + $data = [ + 'class' => get_class($data), + 'message' => $data->getMessage(), + 'code' => $data->getCode(), + 'line' => $data->getLine(), + 'trace' => collect($data->getTrace()) + ->filter(static fn ($trace) => $trace instanceof Closure) + ->toArray(), + ]; + } return self::encode(serialize(new SerializableClosure(static fn () => $data))); } diff --git a/tests/Feature/ExceptionWorkflowTest.php b/tests/Feature/ExceptionWorkflowTest.php index a771ef6..482f939 100644 --- a/tests/Feature/ExceptionWorkflowTest.php +++ b/tests/Feature/ExceptionWorkflowTest.php @@ -23,7 +23,7 @@ public function testRetry(): void $this->assertSame(WorkflowCompletedStatus::class, $workflow->status()); $this->assertSame('workflow_activity_other', $workflow->output()); if ($workflow->exceptions()->first()) { - $this->assertSame('failed', Y::unserialize($workflow->exceptions()->first()->exception)->getMessage()); + $this->assertSame('failed', Y::unserialize($workflow->exceptions()->first()->exception)['message']); } } } diff --git a/tests/Unit/Serializers/SerializeTest.php b/tests/Unit/Serializers/SerializeTest.php index c7d13bf..120a274 100644 --- a/tests/Unit/Serializers/SerializeTest.php +++ b/tests/Unit/Serializers/SerializeTest.php @@ -4,8 +4,10 @@ namespace Tests\Unit\Serializers; +use Closure; use Tests\Fixtures\TestEnum; use Tests\TestCase; +use Throwable; use Workflow\Serializers\Y; final class SerializeTest extends TestCase @@ -17,7 +19,19 @@ public function testSerialize($data): void { $unserialized = Y::unserialize(Y::serialize($data)); if (is_object($data)) { - $this->assertEqualsCanonicalizing($data, $unserialized); + if ($data instanceof Throwable) { + $this->assertEquals([ + 'class' => get_class($data), + 'message' => $data->getMessage(), + 'code' => $data->getCode(), + 'line' => $data->getLine(), + 'trace' => collect($data->getTrace()) + ->filter(static fn ($trace) => $trace instanceof Closure) + ->toArray(), + ], $unserialized); + } else { + $this->assertEqualsCanonicalizing($data, $unserialized); + } } else { $this->assertSame($data, $unserialized); }
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: