From 2d01614a8fdc90098bb4e3b4ceab1f7eb4e97ea1 Mon Sep 17 00:00:00 2001 From: brendt Date: Fri, 25 Jul 2025 13:48:13 +0200 Subject: [PATCH 1/2] wip --- .../src/Elements/ViewComponentElement.php | 5 ++- .../view/src/Export/ExportableViewObject.php | 14 +++++++ .../view/src/Export/ViewObjectExporter.php | 36 +++++++++++++++++ packages/view/src/Slot.php | 39 +++++++++++++++---- 4 files changed, 84 insertions(+), 10 deletions(-) create mode 100644 packages/view/src/Export/ExportableViewObject.php create mode 100644 packages/view/src/Export/ViewObjectExporter.php diff --git a/packages/view/src/Elements/ViewComponentElement.php b/packages/view/src/Elements/ViewComponentElement.php index 8e0b30e0e..34cbf8e0a 100644 --- a/packages/view/src/Elements/ViewComponentElement.php +++ b/packages/view/src/Elements/ViewComponentElement.php @@ -9,6 +9,7 @@ use Tempest\Support\Str\ImmutableString; use Tempest\Support\Str\MutableString; use Tempest\View\Element; +use Tempest\View\Export\ViewObjectExporter; use Tempest\View\Parser\TempestViewCompiler; use Tempest\View\Parser\TempestViewParser; use Tempest\View\Parser\Token; @@ -112,7 +113,7 @@ public function compile(): string ); // Add scoped variables - $slots = $this->getSlots()->toArray(); + $slots = $this->getSlots(); $compiled = $compiled ->prepend( @@ -122,7 +123,7 @@ public function compile(): string // Add dynamic slots to the current scope '', // Store previous slots in temporary variable to keep scope - sprintf('', var_export($slots, true)), // @mago-expect best-practices/no-debug-symbols Set the new value of $slots for this view component + sprintf('', ViewObjectExporter::export($slots)), // @mago-expect best-practices/no-debug-symbols Set the new value of $slots for this view component ) ->append( // Restore previous slots diff --git a/packages/view/src/Export/ExportableViewObject.php b/packages/view/src/Export/ExportableViewObject.php new file mode 100644 index 000000000..c05f64774 --- /dev/null +++ b/packages/view/src/Export/ExportableViewObject.php @@ -0,0 +1,14 @@ +map(fn (mixed $value) => rtrim(self::export($value), ';'))->implode(', '), + ); + } + + return sprintf( + '\%s::restore(%s);', + $object::class, + $object + ->exportData + ->map(function (mixed $value, string $key) { + $value = match (true) { + $value instanceof ExportableViewObject => self::export($value), + is_string($value) => "<<<'STRING'" . PHP_EOL . $value . PHP_EOL . 'STRING', + default => var_export($value, true), // @mago-expect best-practices/no-debug-symbols + }; + + return "{$key} : {$value}"; + }) + ->implode(','), + ); + } +} diff --git a/packages/view/src/Slot.php b/packages/view/src/Slot.php index 211352829..881c2c600 100644 --- a/packages/view/src/Slot.php +++ b/packages/view/src/Slot.php @@ -4,17 +4,45 @@ namespace Tempest\View; +use Tempest\Reflection\ClassReflector; +use Tempest\Support\Arr\ImmutableArray; +use Tempest\View\Export\ExportableViewObject; use Tempest\View\Parser\Token; -final class Slot +final class Slot implements ExportableViewObject { public const string DEFAULT = 'default'; public function __construct( public string $name, public array $attributes, - public string $content, - ) {} + string $content, + ) { + $this->content = base64_encode($content); + } + + public string $content { + get => base64_decode($this->content); + } + + public ImmutableArray $exportData { + get => new ImmutableArray([ + 'name' => $this->name, + 'attributes' => $this->attributes, + 'content' => base64_encode($this->content), + ]); + } + + public static function restore(mixed ...$data): ExportableViewObject + { + $self = new ClassReflector(self::class)->newInstanceWithoutConstructor(); + + $self->name = $data['name']; + $self->attributes = $data['attributes']; + $self->content = $data['content']; + + return $self; + } public function __get(string $name): mixed { @@ -50,9 +78,4 @@ public static function default(Token ...$tokens): self content: $content, ); } - - public static function __set_state(array $array): object - { - return new self(...$array); - } } From 47ac9550953f3d9d06cff11c9d08ff68d8f6f2dc Mon Sep 17 00:00:00 2001 From: brendt Date: Fri, 25 Jul 2025 13:53:42 +0200 Subject: [PATCH 2/2] wip --- packages/view/src/Elements/ViewComponentElement.php | 2 +- packages/view/src/Export/ViewObjectExporter.php | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/view/src/Elements/ViewComponentElement.php b/packages/view/src/Elements/ViewComponentElement.php index 34cbf8e0a..bc2674c67 100644 --- a/packages/view/src/Elements/ViewComponentElement.php +++ b/packages/view/src/Elements/ViewComponentElement.php @@ -123,7 +123,7 @@ public function compile(): string // Add dynamic slots to the current scope '', // Store previous slots in temporary variable to keep scope - sprintf('', ViewObjectExporter::export($slots)), // @mago-expect best-practices/no-debug-symbols Set the new value of $slots for this view component + sprintf('', ViewObjectExporter::export($slots)), ) ->append( // Restore previous slots diff --git a/packages/view/src/Export/ViewObjectExporter.php b/packages/view/src/Export/ViewObjectExporter.php index c9c6dd5c8..3479b5745 100644 --- a/packages/view/src/Export/ViewObjectExporter.php +++ b/packages/view/src/Export/ViewObjectExporter.php @@ -12,7 +12,11 @@ public static function export(ExportableViewObject|ImmutableArray $object): stri return sprintf( 'new \%s([%s])', ImmutableArray::class, - $object->map(fn (mixed $value) => rtrim(self::export($value), ';'))->implode(', '), + $object->map(function (mixed $value, string|int $key) { + $key = is_int($key) ? $key : "'{$key}'"; + + return $key . ' => ' . rtrim(self::export($value), ';'); + })->implode(', '), ); }