Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Error when calling toArray on revisions of an entry #11454

Closed
lostgeek opened this issue Feb 14, 2025 · 9 comments · Fixed by #11463
Closed

Error when calling toArray on revisions of an entry #11454

lostgeek opened this issue Feb 14, 2025 · 9 comments · Fixed by #11463

Comments

@lostgeek
Copy link

Bug description

Calling $entry->revisions()->toArray() causes an Error:
pathinfo(): Argument #1 ($path) must be of type string, Statamic\Revisions\Revision given

Raying the result of $entry->revisions() yields:
Image

How to reproduce

Calling $entry->revisions()->toArray() on any revision-enabled entry with revisions.

Logs

Environment

Environment
Application Name: desitin-cms
Laravel Version: 11.42.1
PHP Version: 8.3.15
Composer Version: 2.8.1
Environment: local
Debug Mode: ENABLED
URL: desitin-cms.novu.io
Maintenance Mode: OFF
Timezone: UTC
Locale: de

Cache
Config: NOT CACHED
Events: NOT CACHED
Routes: NOT CACHED
Views: CACHED

Drivers
Broadcasting: log
Cache: redis
Database: pgsql
Logs: stack / daily
Mail: smtp
Queue: redis
Scout: algolia
Session: redis

Sentry
Enabled: MISSING DSN
Environment: local
Laravel SDK Version: 4.12.0
PHP SDK Version: 4.10.0
Release: 144b52b
Sample Rate Errors: 100%
Sample Rate Performance Monitoring: 1%
Sample Rate Profiling: 1%
Send Default PII: ENABLED

Statamic
Addons: 4
Sites: 2 (🇩🇪 Deutsch, 🇫🇷 Français)
Stache Watcher: Enabled
Static Caching: Disabled
Version: 5.46.1 PRO

Statamic Addons
cnj/seotamic: 5.0.0
teamnovu/graphql-breadcrumbs: 1.0.7
teamnovu/localize: 1.1.3
teamnovu/statamic-gql-swr-cache: 1.0.0

Installation

Fresh statamic/statamic site via CLI

Additional details

No response

@duncanmcclean
Copy link
Member

Are you able to provide the full stack trace?

@lostgeek
Copy link
Author

Sure:

[stacktrace]
#0 /Users/lostgeek/devel/novu/desitin-cms/vendor/statamic/cms/src/Support/FileCollection.php(193): pathinfo(Object(Statamic\\Revisions\\Revision))
#1 /Users/lostgeek/devel/novu/desitin-cms/app/Http/Controllers/RevisionSummaryPdfController.php(48): Statamic\\Support\\FileCollection->toArray()
#2 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): App\\Http\\Controllers\\RevisionSummaryPdfController->index(Object(Illuminate\\Http\\Request))
#3 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(44): Illuminate\\Routing\\Controller->callAction('index', Array)
#4 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Routing/Route.php(266): Illuminate\\Routing\\ControllerDispatcher->dispatch(Object(Illuminate\\Routing\\Route), Object(App\\Http\\Controllers\\RevisionSummaryPdfController), 'index')
#5 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Routing/Route.php(212): Illuminate\\Routing\\Route->runController()
#6 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Routing/Router.php(808): Illuminate\\Routing\\Route->run()
#7 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(170): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#8 /Users/lostgeek/devel/novu/desitin-cms/vendor/teamnovu/statamic-redirect-entry-uri/src/Http/Middleware/RedirectEntryUri.php(42): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#9 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(209): Novu\\RedirectEntryUri\\Http\\Middleware\\RedirectEntryUri->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#10 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(51): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#11 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(209): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#12 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(88): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#13 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(209): Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#14 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#15 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(209): Illuminate\\View\\Middleware\\ShareErrorsFromSession->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#16 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(121): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#17 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(64): Illuminate\\Session\\Middleware\\StartSession->handleStatefulRequest(Object(Illuminate\\Http\\Request), Object(Illuminate\\Session\\Store), Object(Closure))
#18 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(209): Illuminate\\Session\\Middleware\\StartSession->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#19 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#20 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(209): Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#21 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(75): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#22 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(209): Illuminate\\Cookie\\Middleware\\EncryptCookies->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#23 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(127): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#24 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Routing/Router.php(807): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
#25 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Routing/Router.php(786): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request))
#26 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Routing/Router.php(750): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route))
#27 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Routing/Router.php(739): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request))
#28 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(201): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request))
#29 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(170): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request))
#30 /Users/lostgeek/devel/novu/desitin-cms/vendor/teamnovu/laravel-novu-auth/src/Http/Middleware/InjectNovuAuthButton.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#31 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(209): Novu\\Auth\\Http\\Middleware\\InjectNovuAuthButton->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#32 /Users/lostgeek/devel/novu/desitin-cms/vendor/statamic/cms/src/Http/Middleware/StopImpersonating.php(12): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#33 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(209): Statamic\\Http\\Middleware\\StopImpersonating->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#34 /Users/lostgeek/devel/novu/desitin-cms/vendor/statamic/cms/src/Http/Middleware/DisableFloc.php(17): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#35 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(209): Statamic\\Http\\Middleware\\DisableFloc->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#36 /Users/lostgeek/devel/novu/desitin-cms/vendor/statamic/cms/src/Http/Middleware/CheckMultisite.php(15): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#37 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(209): Statamic\\Http\\Middleware\\CheckMultisite->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#38 /Users/lostgeek/devel/novu/desitin-cms/vendor/statamic/cms/src/Http/Middleware/CheckComposerJsonScripts.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#39 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(209): Statamic\\Http\\Middleware\\CheckComposerJsonScripts->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#40 /Users/lostgeek/devel/novu/desitin-cms/vendor/statamic/cms/src/Http/Middleware/PoweredByHeader.php(18): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#41 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(209): Statamic\\Http\\Middleware\\PoweredByHeader->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#42 /Users/lostgeek/devel/novu/desitin-cms/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(59): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#43 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(209): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#44 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#45 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#46 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(209): Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#47 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#48 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(51): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#49 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(209): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#50 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#51 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(209): Illuminate\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#52 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(110): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#53 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(209): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#54 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#55 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(209): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#56 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(58): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#57 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(209): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#58 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/InvokeDeferredCallbacks.php(22): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#59 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(209): Illuminate\\Foundation\\Http\\Middleware\\InvokeDeferredCallbacks->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#60 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(127): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#61 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(176): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
#62 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(145): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request))
#63 /Users/lostgeek/devel/novu/desitin-cms/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(1220): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request))
#64 /Users/lostgeek/devel/novu/desitin-cms/public/index.php(17): Illuminate\\Foundation\\Application->handleRequest(Object(Illuminate\\Http\\Request))
#65 /Users/lostgeek/.composer/vendor/laravel/valet/server.php(110): require('/Users/lostgeek...')
#66 {main}
"} ```

@lostgeek
Copy link
Author

As I see it, the $entry->revisions() is a FilesCollection but contains things that are not just strings of filepaths, but rather Revision objects.

@duncanmcclean
Copy link
Member

Yes, they'll get transformed into Revision objects (that happens here).

Does $entry->revisions()->all() work?

@lostgeek
Copy link
Author

Yes, that actually works and gives the result that I'd expect from toArray:
Image

@edalzell
Copy link
Contributor

edalzell commented Feb 14, 2025

Yes, that actually works and gives the result that I'd expect from toArray:

That's the difference though, ->all() converts a collection to an array of "things". ->toArray() is recursive and try to convert EVERYTHING to an array.

Use the former if you can, it's always better to be dealing with real objects instead of arrays.

From Laravel:

Image

@edalzell
Copy link
Contributor

And also why do you need the ->all() method at all? are you just iterating over it? If so, Collections are iterable.

@lostgeek
Copy link
Author

I wasn't aware if the difference between toArray and all, but to be honest, I was mainly just exploring, what information I can find in the revisions, so I just called toArray to see what's there. I feel toArray should still never just throw an error, but fail more gracefully.

@duncanmcclean
Copy link
Member

Yep, agreed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants