diff --git a/demos/hello-world/bin/be.php b/demos/hello-world/bin/be.php new file mode 100644 index 0000000..1a2109e --- /dev/null +++ b/demos/hello-world/bin/be.php @@ -0,0 +1,29 @@ +getInstance(BecomingInterface::class); + +$final = $becoming(new HelloInput(name: 'World')); +assert($final instanceof Hello); +printf("greeting: %s\n", $final->greeting); + +echo "\n--- stree ---\n"; +passthru('vendor/bin/stree ' . escapeshellarg(dirname(__DIR__) . '/var/log/hello-world.json')); diff --git a/demos/hello-world/src/Becoming/DevBecoming.php b/demos/hello-world/src/Becoming/DevBecoming.php new file mode 100644 index 0000000..c208246 --- /dev/null +++ b/demos/hello-world/src/Becoming/DevBecoming.php @@ -0,0 +1,47 @@ +becoming)($input); + } finally { + $dir = dirname(__DIR__, 2) . '/var/log'; + if (! is_dir($dir)) { + mkdir($dir, 0755, true); + } + + file_put_contents( + $dir . '/hello-world.json', + json_encode($this->logger->flush(), JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) . PHP_EOL, + ); + } + } +} diff --git a/demos/hello-world/src/Module/AppModule.php b/demos/hello-world/src/Module/AppModule.php index 4d83001..1b6107f 100644 --- a/demos/hello-world/src/Module/AppModule.php +++ b/demos/hello-world/src/Module/AppModule.php @@ -4,15 +4,14 @@ namespace Be\Pattern\Hello\Module; -use Be\Pattern\Hello\Reason\Greeting; use Be\Framework\Module\BeModule; +use Be\Pattern\Hello\Reason\Greeting; use Ray\Di\AbstractModule; final class AppModule extends AbstractModule { protected function configure(): void { - // Install BeModule with demo's semantic namespace $this->install(new BeModule('Be\Pattern\Hello\Semantic')); $this->bind(Greeting::class); diff --git a/demos/hello-world/src/Module/DevModule.php b/demos/hello-world/src/Module/DevModule.php new file mode 100644 index 0000000..8717ae1 --- /dev/null +++ b/demos/hello-world/src/Module/DevModule.php @@ -0,0 +1,26 @@ +install(new AppModule()); + + $this->bind(Becoming::class); + $this->bind(BecomingInterface::class)->to(DevBecoming::class); + $this->bind(SemanticLoggerInterface::class) + ->toProvider(DevSemanticLoggerProvider::class) + ->in(Scope::SINGLETON); + } +} diff --git a/demos/hello-world/src/Module/DevSemanticLoggerProvider.php b/demos/hello-world/src/Module/DevSemanticLoggerProvider.php new file mode 100644 index 0000000..6692934 --- /dev/null +++ b/demos/hello-world/src/Module/DevSemanticLoggerProvider.php @@ -0,0 +1,21 @@ + */ +final class DevSemanticLoggerProvider implements ProviderInterface +{ + #[Override] + public function get(): SemanticLoggerInterface + { + return new DevSemanticLogger(new SemanticLogger()); + } +} diff --git a/demos/hello-world/var/log/hello-world.json b/demos/hello-world/var/log/hello-world.json new file mode 100644 index 0000000..d7c3a53 --- /dev/null +++ b/demos/hello-world/var/log/hello-world.json @@ -0,0 +1,35 @@ +{ + "$schema": "https://koriym.github.io/Koriym.SemanticLogger/schemas/combined.json", + "open": { + "id": "becoming_open_1", + "type": "becoming_open", + "schemaUrl": "https://be-framework.org/schemas/becoming-open.json", + "context": { + "from": "Be\\Pattern\\Hello\\Input\\HelloInput", + "be": "Be\\Pattern\\Hello\\Final\\Hello", + "input": { + "name": "Be\\Pattern\\Hello\\Input\\HelloInput::name" + }, + "inject": { + "greeting": "Be\\Pattern\\Hello\\Reason\\Greeting" + } + } + }, + "close": { + "id": "becoming_final_1", + "type": "becoming_final", + "schemaUrl": "https://be-framework.org/schemas/becoming-final.json", + "context": { + "final": "Be\\Pattern\\Hello\\Final\\Hello", + "prop": { + "greeting": "Hello World" + } + }, + "openId": "becoming_open_1", + "profile": { + "wallTime": 0.0008828639984130859, + "xdebug": [], + "xhprof": [] + } + } +} diff --git a/demos/medical-triage/bin/be.php b/demos/medical-triage/bin/be.php new file mode 100644 index 0000000..8b8abb5 --- /dev/null +++ b/demos/medical-triage/bin/be.php @@ -0,0 +1,30 @@ +getInstance(BecomingInterface::class); + +$final = $becoming(new PatientInput( + patientId: 'PT-10001', + chiefComplaint: 'severe chest pain', + consciousnessLevel: 0, +)); +printf("triage: %s\n", $final::class); + +echo "\n--- stree ---\n"; +passthru('vendor/bin/stree ' . escapeshellarg(dirname(__DIR__) . '/var/log/medical-triage.json')); diff --git a/demos/medical-triage/src/Becoming/DevBecoming.php b/demos/medical-triage/src/Becoming/DevBecoming.php new file mode 100644 index 0000000..57b14da --- /dev/null +++ b/demos/medical-triage/src/Becoming/DevBecoming.php @@ -0,0 +1,47 @@ +becoming)($input); + } finally { + $dir = dirname(__DIR__, 2) . '/var/log'; + if (! is_dir($dir)) { + mkdir($dir, 0755, true); + } + + file_put_contents( + $dir . '/medical-triage.json', + json_encode($this->logger->flush(), JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) . PHP_EOL, + ); + } + } +} diff --git a/demos/medical-triage/src/Module/DevModule.php b/demos/medical-triage/src/Module/DevModule.php new file mode 100644 index 0000000..a4fa9d4 --- /dev/null +++ b/demos/medical-triage/src/Module/DevModule.php @@ -0,0 +1,26 @@ +install(new AppModule()); + + $this->bind(Becoming::class); + $this->bind(BecomingInterface::class)->to(DevBecoming::class); + $this->bind(SemanticLoggerInterface::class) + ->toProvider(DevSemanticLoggerProvider::class) + ->in(Scope::SINGLETON); + } +} diff --git a/demos/medical-triage/src/Module/DevSemanticLoggerProvider.php b/demos/medical-triage/src/Module/DevSemanticLoggerProvider.php new file mode 100644 index 0000000..d11e6a1 --- /dev/null +++ b/demos/medical-triage/src/Module/DevSemanticLoggerProvider.php @@ -0,0 +1,21 @@ + */ +final class DevSemanticLoggerProvider implements ProviderInterface +{ + #[Override] + public function get(): SemanticLoggerInterface + { + return new DevSemanticLogger(new SemanticLogger()); + } +} diff --git a/demos/medical-triage/var/log/medical-triage.json b/demos/medical-triage/var/log/medical-triage.json new file mode 100644 index 0000000..9ac1276 --- /dev/null +++ b/demos/medical-triage/var/log/medical-triage.json @@ -0,0 +1,79 @@ +{ + "$schema": "https://koriym.github.io/Koriym.SemanticLogger/schemas/combined.json", + "open": { + "id": "becoming_open_2", + "type": "becoming_open", + "schemaUrl": "https://be-framework.org/schemas/becoming-open.json", + "context": { + "from": "Be\\Pattern\\MedicalTriage\\Being\\TriageLevelDetermined", + "be": "Be\\Pattern\\MedicalTriage\\Final\\EmergencyAdmitted", + "input": { + "being": "Be\\Pattern\\MedicalTriage\\Being\\TriageLevelDetermined::being", + "patientId": "Be\\Pattern\\MedicalTriage\\Being\\TriageLevelDetermined::patientId" + }, + "inject": {} + }, + "open": { + "id": "becoming_open_1", + "type": "becoming_open", + "schemaUrl": "https://be-framework.org/schemas/becoming-open.json", + "context": { + "from": "Be\\Pattern\\MedicalTriage\\Input\\PatientInput", + "be": "Be\\Pattern\\MedicalTriage\\Being\\TriageLevelDetermined", + "input": { + "patientId": "Be\\Pattern\\MedicalTriage\\Input\\PatientInput::patientId", + "chiefComplaint": "Be\\Pattern\\MedicalTriage\\Input\\PatientInput::chiefComplaint", + "consciousnessLevel": "Be\\Pattern\\MedicalTriage\\Input\\PatientInput::consciousnessLevel" + }, + "inject": { + "protocol": "Be\\Pattern\\MedicalTriage\\Reason\\JTASProtocol" + } + } + } + }, + "close": { + "id": "becoming_final_1", + "type": "becoming_final", + "schemaUrl": "https://be-framework.org/schemas/becoming-final.json", + "context": { + "final": "Be\\Pattern\\MedicalTriage\\Final\\EmergencyAdmitted", + "prop": { + "admissionId": "ADM-20260420-9b8b8250", + "status": "admitted", + "triageCode": "RED", + "being": { + "triageCode": "RED" + }, + "patientId": "PT-10001" + } + }, + "openId": "becoming_open_2", + "profile": { + "wallTime": 0.0006999969482421875, + "xdebug": [], + "xhprof": [] + }, + "close": { + "id": "becoming_being_1", + "type": "becoming_being", + "schemaUrl": "https://be-framework.org/schemas/becoming-being.json", + "context": { + "being": "Be\\Pattern\\MedicalTriage\\Being\\TriageLevelDetermined", + "prop": { + "being": { + "triageCode": "RED" + }, + "patientId": "PT-10001", + "chiefComplaint": "severe chest pain", + "consciousnessLevel": 0 + } + }, + "openId": "becoming_open_1", + "profile": { + "wallTime": 0.001873016357421875, + "xdebug": [], + "xhprof": [] + } + } + } +} diff --git a/demos/order-processing/bin/app.php b/demos/order-processing/bin/be.php similarity index 61% rename from demos/order-processing/bin/app.php rename to demos/order-processing/bin/be.php index c90da65..af4c73c 100644 --- a/demos/order-processing/bin/app.php +++ b/demos/order-processing/bin/be.php @@ -6,15 +6,20 @@ require dirname(__DIR__) . '/vendor/autoload.php'; -use Be\Pattern\OrderProcessing\Input\OrderInput; -use Be\Pattern\OrderProcessing\Module\AppModule; -use Be\Framework\Becoming; +use Be\Framework\BecomingInterface; use Be\Framework\Exception\SemanticVariableException; +use Be\Pattern\OrderProcessing\Final\OrderConfirmed; +use Be\Pattern\OrderProcessing\Input\OrderInput; +use Be\Pattern\OrderProcessing\Module\DevModule; use Ray\Di\Injector; + +use function assert; use function dirname; +use function escapeshellarg; +use function passthru; -$injector = new Injector(new AppModule()); -$becoming = new Becoming($injector, __NAMESPACE__ . '\\Semantic'); +$injector = new Injector(new DevModule()); +$becoming = $injector->getInstance(BecomingInterface::class); $input = new OrderInput( cartId: 'CART-001', @@ -27,7 +32,7 @@ ); try { $order = $becoming($input); - assert($order instanceof Final\OrderConfirmed); + assert($order instanceof OrderConfirmed); echo "Order confirmed: {$order->orderId}" . PHP_EOL; } catch (SemanticVariableException $e) { $messages = $e->getErrors()->getMessages('ja'); @@ -35,3 +40,5 @@ echo $errorMessage . PHP_EOL; } +echo "\n--- stree ---\n"; +passthru('vendor/bin/stree ' . escapeshellarg(dirname(__DIR__) . '/var/log/order-processing.json')); diff --git a/demos/order-processing/src/Becoming/DevBecoming.php b/demos/order-processing/src/Becoming/DevBecoming.php new file mode 100644 index 0000000..906575a --- /dev/null +++ b/demos/order-processing/src/Becoming/DevBecoming.php @@ -0,0 +1,47 @@ +becoming)($input); + } finally { + $dir = dirname(__DIR__, 2) . '/var/log'; + if (! is_dir($dir)) { + mkdir($dir, 0755, true); + } + + file_put_contents( + $dir . '/order-processing.json', + json_encode($this->logger->flush(), JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) . PHP_EOL, + ); + } + } +} diff --git a/demos/order-processing/src/Module/DevModule.php b/demos/order-processing/src/Module/DevModule.php new file mode 100644 index 0000000..6c34ad4 --- /dev/null +++ b/demos/order-processing/src/Module/DevModule.php @@ -0,0 +1,26 @@ +install(new AppModule()); + + $this->bind(Becoming::class); + $this->bind(BecomingInterface::class)->to(DevBecoming::class); + $this->bind(SemanticLoggerInterface::class) + ->toProvider(DevSemanticLoggerProvider::class) + ->in(Scope::SINGLETON); + } +} diff --git a/demos/order-processing/src/Module/DevSemanticLoggerProvider.php b/demos/order-processing/src/Module/DevSemanticLoggerProvider.php new file mode 100644 index 0000000..91fcc81 --- /dev/null +++ b/demos/order-processing/src/Module/DevSemanticLoggerProvider.php @@ -0,0 +1,21 @@ + */ +final class DevSemanticLoggerProvider implements ProviderInterface +{ + #[Override] + public function get(): SemanticLoggerInterface + { + return new DevSemanticLogger(new SemanticLogger()); + } +} diff --git a/demos/order-processing/var/log/order-processing.json b/demos/order-processing/var/log/order-processing.json new file mode 100644 index 0000000..76a4b9a --- /dev/null +++ b/demos/order-processing/var/log/order-processing.json @@ -0,0 +1,73 @@ +{ + "$schema": "https://koriym.github.io/Koriym.SemanticLogger/schemas/combined.json", + "open": { + "id": "becoming_open_1", + "type": "becoming_open", + "schemaUrl": "https://be-framework.org/schemas/becoming-open.json", + "context": { + "from": "Be\\Pattern\\OrderProcessing\\Input\\OrderInput", + "be": "Be\\Pattern\\OrderProcessing\\Final\\OrderConfirmed", + "input": {}, + "inject": { + "inventory": "Be\\Pattern\\OrderProcessing\\Moment\\InventoryReserved", + "payment": "Be\\Pattern\\OrderProcessing\\Moment\\PaymentCompleted", + "shipping": "Be\\Pattern\\OrderProcessing\\Moment\\ShippingArranged", + "been": "Be\\Framework\\SemanticLog\\Been" + } + } + }, + "events": [ + { + "id": "order_finalized_1", + "type": "order_finalized", + "schemaUrl": "https://be-framework.github.io/schemas/order-processing/order-finalized.json", + "context": { + "orderId": "ORD-20260420-f239e28a", + "status": "confirmed" + }, + "openId": "becoming_open_1" + } + ], + "close": { + "id": "becoming_final_1", + "type": "becoming_final", + "schemaUrl": "https://be-framework.org/schemas/becoming-final.json", + "context": { + "final": "Be\\Pattern\\OrderProcessing\\Final\\OrderConfirmed", + "prop": { + "orderId": "ORD-20260420-f239e28a", + "status": "confirmed", + "inventory": { + "reservation": { + "reservationId": "RSV-TOKYO-20260420122626-7948" + }, + "productId": "PROD-001", + "quantity": 1, + "warehouseId": "WH-TOKYO-01" + }, + "payment": { + "capture": { + "authorizationCode": "AUTH-10000-08e6ef82", + "amount": 10000 + }, + "cardNumber": "4111111111111111", + "amount": 10000 + }, + "shipping": { + "dispatch": { + "trackingNumber": "YAMATO-202604201226261461", + "shippingRate": 800 + }, + "carrierId": "YAMATO", + "address": "Tokyo, Japan" + } + } + }, + "openId": "becoming_open_1", + "profile": { + "wallTime": 0.0006608963012695312, + "xdebug": [], + "xhprof": [] + } + } +} diff --git a/demos/user-registration/bin/be.php b/demos/user-registration/bin/be.php new file mode 100644 index 0000000..95d24a1 --- /dev/null +++ b/demos/user-registration/bin/be.php @@ -0,0 +1,33 @@ +getInstance(BecomingInterface::class); + +$final = $becoming(new RegistrationInput( + email: 'alice@example.com', + password: 'Str0ngP@ss', + displayName: 'Alice', +)); +assert($final instanceof UserRegistered); +printf("userId: %s\n", $final->userId); + +echo "\n--- stree ---\n"; +passthru('vendor/bin/stree ' . escapeshellarg(dirname(__DIR__) . '/var/log/user-registration.json')); diff --git a/demos/user-registration/src/Becoming/DevBecoming.php b/demos/user-registration/src/Becoming/DevBecoming.php new file mode 100644 index 0000000..5987750 --- /dev/null +++ b/demos/user-registration/src/Becoming/DevBecoming.php @@ -0,0 +1,47 @@ +becoming)($input); + } finally { + $dir = dirname(__DIR__, 2) . '/var/log'; + if (! is_dir($dir)) { + mkdir($dir, 0755, true); + } + + file_put_contents( + $dir . '/user-registration.json', + json_encode($this->logger->flush(), JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) . PHP_EOL, + ); + } + } +} diff --git a/demos/user-registration/src/Module/AppModule.php b/demos/user-registration/src/Module/AppModule.php index 6ee7859..94c69e0 100644 --- a/demos/user-registration/src/Module/AppModule.php +++ b/demos/user-registration/src/Module/AppModule.php @@ -4,26 +4,23 @@ namespace Be\Pattern\UserRegistration\Module; +use Be\Framework\Module\BeModule; use Be\Pattern\UserRegistration\Reason\EmailVerifier; use Be\Pattern\UserRegistration\Reason\EmailVerifierInterface; use Be\Pattern\UserRegistration\Reason\GravatarResolver; use Be\Pattern\UserRegistration\Reason\PasswordHasher; use Be\Pattern\UserRegistration\Reason\UserIdGenerator; use Be\Pattern\UserRegistration\Reason\WelcomeTokenGenerator; -use Be\Framework\Module\BeModule; use Ray\Di\AbstractModule; final class AppModule extends AbstractModule { protected function configure(): void { - // Install BeModule with demo's semantic namespace $this->install(new BeModule('Be\Pattern\UserRegistration\Semantic')); - // Reason bindings (via interface for testability) $this->bind(EmailVerifierInterface::class)->to(EmailVerifier::class); - // Reason bindings (concrete classes) $this->bind(PasswordHasher::class); $this->bind(GravatarResolver::class); $this->bind(UserIdGenerator::class); diff --git a/demos/user-registration/src/Module/DevModule.php b/demos/user-registration/src/Module/DevModule.php new file mode 100644 index 0000000..57927cb --- /dev/null +++ b/demos/user-registration/src/Module/DevModule.php @@ -0,0 +1,26 @@ +install(new AppModule()); + + $this->bind(Becoming::class); + $this->bind(BecomingInterface::class)->to(DevBecoming::class); + $this->bind(SemanticLoggerInterface::class) + ->toProvider(DevSemanticLoggerProvider::class) + ->in(Scope::SINGLETON); + } +} diff --git a/demos/user-registration/src/Module/DevSemanticLoggerProvider.php b/demos/user-registration/src/Module/DevSemanticLoggerProvider.php new file mode 100644 index 0000000..3ef5658 --- /dev/null +++ b/demos/user-registration/src/Module/DevSemanticLoggerProvider.php @@ -0,0 +1,21 @@ + */ +final class DevSemanticLoggerProvider implements ProviderInterface +{ + #[Override] + public function get(): SemanticLoggerInterface + { + return new DevSemanticLogger(new SemanticLogger()); + } +} diff --git a/demos/user-registration/var/log/user-registration.json b/demos/user-registration/var/log/user-registration.json new file mode 100644 index 0000000..079cfee --- /dev/null +++ b/demos/user-registration/var/log/user-registration.json @@ -0,0 +1,166 @@ +{ + "$schema": "https://koriym.github.io/Koriym.SemanticLogger/schemas/combined.json", + "open": { + "id": "becoming_open_4", + "type": "becoming_open", + "schemaUrl": "https://be-framework.org/schemas/becoming-open.json", + "context": { + "from": "Be\\Pattern\\UserRegistration\\Being\\ProfileEnriched", + "be": "Be\\Pattern\\UserRegistration\\Final\\UserRegistered", + "input": { + "email": "Be\\Pattern\\UserRegistration\\Being\\ProfileEnriched::email", + "displayName": "Be\\Pattern\\UserRegistration\\Being\\ProfileEnriched::displayName", + "hashedPassword": "Be\\Pattern\\UserRegistration\\Being\\ProfileEnriched::hashedPassword", + "avatarUrl": "Be\\Pattern\\UserRegistration\\Being\\ProfileEnriched::avatarUrl" + }, + "inject": { + "idGen": "Be\\Pattern\\UserRegistration\\Reason\\UserIdGenerator", + "tokenGen": "Be\\Pattern\\UserRegistration\\Reason\\WelcomeTokenGenerator", + "been": "Be\\Framework\\SemanticLog\\Been" + } + }, + "open": { + "id": "becoming_open_3", + "type": "becoming_open", + "schemaUrl": "https://be-framework.org/schemas/becoming-open.json", + "context": { + "from": "Be\\Pattern\\UserRegistration\\Being\\PasswordHashed", + "be": "Be\\Pattern\\UserRegistration\\Being\\ProfileEnriched", + "input": { + "email": "Be\\Pattern\\UserRegistration\\Being\\PasswordHashed::email", + "displayName": "Be\\Pattern\\UserRegistration\\Being\\PasswordHashed::displayName", + "hashedPassword": "Be\\Pattern\\UserRegistration\\Being\\PasswordHashed::hashedPassword" + }, + "inject": { + "resolver": "Be\\Pattern\\UserRegistration\\Reason\\GravatarResolver" + } + }, + "open": { + "id": "becoming_open_2", + "type": "becoming_open", + "schemaUrl": "https://be-framework.org/schemas/becoming-open.json", + "context": { + "from": "Be\\Pattern\\UserRegistration\\Being\\EmailVerified", + "be": "Be\\Pattern\\UserRegistration\\Being\\PasswordHashed", + "input": { + "email": "Be\\Pattern\\UserRegistration\\Being\\EmailVerified::email", + "password": "Be\\Pattern\\UserRegistration\\Being\\EmailVerified::password", + "displayName": "Be\\Pattern\\UserRegistration\\Being\\EmailVerified::displayName" + }, + "inject": { + "hasher": "Be\\Pattern\\UserRegistration\\Reason\\PasswordHasher" + } + }, + "open": { + "id": "becoming_open_1", + "type": "becoming_open", + "schemaUrl": "https://be-framework.org/schemas/becoming-open.json", + "context": { + "from": "Be\\Pattern\\UserRegistration\\Input\\RegistrationInput", + "be": "Be\\Pattern\\UserRegistration\\Being\\EmailVerified", + "input": { + "email": "Be\\Pattern\\UserRegistration\\Input\\RegistrationInput::email", + "password": "Be\\Pattern\\UserRegistration\\Input\\RegistrationInput::password", + "displayName": "Be\\Pattern\\UserRegistration\\Input\\RegistrationInput::displayName" + }, + "inject": { + "verifier": "Be\\Pattern\\UserRegistration\\Reason\\EmailVerifier" + } + } + } + } + } + }, + "events": [ + { + "id": "user_created_1", + "type": "user_created", + "schemaUrl": "https://be-framework.github.io/schemas/user-registration/user-created.json", + "context": { + "userId": "USR-20260420-fb66ef83c08236b2", + "email": "alice@example.com" + }, + "openId": "becoming_open_4" + } + ], + "close": { + "id": "becoming_final_1", + "type": "becoming_final", + "schemaUrl": "https://be-framework.org/schemas/becoming-final.json", + "context": { + "final": "Be\\Pattern\\UserRegistration\\Final\\UserRegistered", + "prop": { + "userId": "USR-20260420-fb66ef83c08236b2", + "welcomeToken": "870dc0778580246f38d7248c24085eed34828ba07ee29540919c4f9e79156b30", + "email": "alice@example.com", + "displayName": "Alice", + "hashedPassword": "$2y$12$ypkeDoTNzeS8BYm/.HsG0uAYXsOsCraLvKseZ6kiR2jIml0rBSE8e", + "avatarUrl": "https://www.gravatar.com/avatar/c160f8cc69a4f0bf2b0362752353d060" + } + }, + "openId": "becoming_open_4", + "profile": { + "wallTime": 0.0009059906005859375, + "xdebug": [], + "xhprof": [] + }, + "close": { + "id": "becoming_being_3", + "type": "becoming_being", + "schemaUrl": "https://be-framework.org/schemas/becoming-being.json", + "context": { + "being": "Be\\Pattern\\UserRegistration\\Being\\ProfileEnriched", + "prop": { + "avatarUrl": "https://www.gravatar.com/avatar/c160f8cc69a4f0bf2b0362752353d060", + "email": "alice@example.com", + "displayName": "Alice", + "hashedPassword": "$2y$12$ypkeDoTNzeS8BYm/.HsG0uAYXsOsCraLvKseZ6kiR2jIml0rBSE8e" + } + }, + "openId": "becoming_open_3", + "profile": { + "wallTime": 0.00021505355834960938, + "xdebug": [], + "xhprof": [] + }, + "close": { + "id": "becoming_being_2", + "type": "becoming_being", + "schemaUrl": "https://be-framework.org/schemas/becoming-being.json", + "context": { + "being": "Be\\Pattern\\UserRegistration\\Being\\PasswordHashed", + "prop": { + "hashedPassword": "$2y$12$ypkeDoTNzeS8BYm/.HsG0uAYXsOsCraLvKseZ6kiR2jIml0rBSE8e", + "email": "alice@example.com", + "displayName": "Alice" + } + }, + "openId": "becoming_open_2", + "profile": { + "wallTime": 0.23204898834228516, + "xdebug": [], + "xhprof": [] + }, + "close": { + "id": "becoming_being_1", + "type": "becoming_being", + "schemaUrl": "https://be-framework.org/schemas/becoming-being.json", + "context": { + "being": "Be\\Pattern\\UserRegistration\\Being\\EmailVerified", + "prop": { + "email": "alice@example.com", + "password": "Str0ngP@ss", + "displayName": "Alice" + } + }, + "openId": "becoming_open_1", + "profile": { + "wallTime": 0.0007009506225585938, + "xdebug": [], + "xhprof": [] + } + } + } + } + } +}