From b6029f5e46af8b615d992f14f8c06b2bd4b69ba5 Mon Sep 17 00:00:00 2001 From: Duncan McClean Date: Thu, 6 Feb 2025 13:10:21 +0000 Subject: [PATCH] Ensure formatForTelescope method is used in request watcher --- src/Watchers/RequestWatcher.php | 4 +++- tests/Watchers/RequestWatchersTest.php | 28 ++++++++++++++++++++++++++ tests/stubs/views/fake-view.blade.php | 3 +++ 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 tests/stubs/views/fake-view.blade.php diff --git a/src/Watchers/RequestWatcher.php b/src/Watchers/RequestWatcher.php index 02fa0fbd7..3c2e54183 100644 --- a/src/Watchers/RequestWatcher.php +++ b/src/Watchers/RequestWatcher.php @@ -238,7 +238,9 @@ protected function extractDataFromView($view) } elseif (is_object($value)) { return [ 'class' => get_class($value), - 'properties' => json_decode(json_encode($value), true), + 'properties' => method_exists($value, 'formatForTelescope') + ? $value->formatForTelescope() + : json_decode(json_encode($value), true), ]; } else { return json_decode(json_encode($value), true); diff --git a/tests/Watchers/RequestWatchersTest.php b/tests/Watchers/RequestWatchersTest.php index 47e03fc8f..de780e3a1 100644 --- a/tests/Watchers/RequestWatchersTest.php +++ b/tests/Watchers/RequestWatchersTest.php @@ -5,6 +5,7 @@ use Illuminate\Http\UploadedFile; use Illuminate\Support\Facades\Response; use Illuminate\Support\Facades\Route; +use Illuminate\Support\Facades\View; use Laravel\Telescope\EntryType; use Laravel\Telescope\Tests\FeatureTestCase; use Laravel\Telescope\Watchers\RequestWatcher; @@ -176,4 +177,31 @@ public function test_request_watcher_plain_text_response() $this->assertSame(200, $entry->content['response_status']); $this->assertSame('plain telescope response', $entry->content['response']); } + + public function test_request_watcher_calls_format_for_telescope_method_if_it_exists() + { + View::addNamespace('tests', __DIR__.'/../stubs/views'); + + Route::get('/fake-view', function () { + return Response::make( + View::make('tests::fake-view', ['items' => new FormatForTelescopeClass]) + ); + }); + + $this->get('/fake-view')->assertSuccessful(); + + $entry = $this->loadTelescopeEntries()->first(); + $this->assertSame(EntryType::REQUEST, $entry->type); + $this->assertEquals(['Telescope', 'Laravel', 'PHP'], $entry->content['response']['data']['items']['properties']); + } +} + +class FormatForTelescopeClass +{ + public function formatForTelescope(): array + { + return [ + 'Telescope', 'Laravel', 'PHP', + ]; + } } diff --git a/tests/stubs/views/fake-view.blade.php b/tests/stubs/views/fake-view.blade.php new file mode 100644 index 000000000..fec8129f5 --- /dev/null +++ b/tests/stubs/views/fake-view.blade.php @@ -0,0 +1,3 @@ +@foreach($items as $item) +
{{ $item }}
+@endforeach