statamic / ideas

đź’ˇDiscussions on ideas and feature requests for Statamic
https://statamic.dev
31 stars 1 forks source link

Call to a member function collections() on null #1058

Closed geertjanknapen1 closed 6 months ago

geertjanknapen1 commented 1 year ago

Bug description

I'm trying to fetch all terms of a particular collection in a service I'm writing.

So I created a taxonomy (recievers) in this case;

image

With the following blueprint (where Reciever has a handle of title and the other is a toggle switch);

image

I'm trying to fetch them as follows;

public function getTerms(TaxonomyEnum|string $taxonomy) : TermCollection|null
{
    $taxonomy = (is_string($taxonomy)) ? TaxonomyEnum::tryFrom($taxonomy) : $taxonomy;

    return Term::whereTaxonomy($taxonomy->value); // $taxonomy->value === 'recievers' in this case
}

But it keeps throwing the following error;

image

How to reproduce

Create a Taxonomy using above blueprint (or any for that matter, happens on all taxonomies for me).

Try to fetch all the taxonomies using the code-snippet provided above.

Error.

Logs

[2023-10-02 14:58:43] local.ERROR: Call to a member function collections() on null {"userId":"6264c9cd-9c2a-457e-9fce-360708b5aa4d","exception":"[object] (Error(code: 0): Call to a member function collections() on null at /usr/share/nginx/html/vendor/statamic/cms/src/Stache/Stores/TaxonomyTermsStore.php:141)
[stacktrace]
#0 /usr/share/nginx/html/vendor/statamic/cms/src/Stache/Stores/Store.php(44): Statamic\\Stache\\Stores\\TaxonomyTermsStore->handleFileChanges()
statamic/cms#1 /usr/share/nginx/html/vendor/statamic/cms/src/Stache/Query/TermQueryBuilder.php(78): Statamic\\Stache\\Stores\\Store->index('title')
statamic/cms#2 [internal function]: Statamic\\Stache\\Query\\TermQueryBuilder->Statamic\\Stache\\Query\\{closure}('cost_carries', 0)
statamic/cms#3 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Collections/Arr.php(558): array_map(Object(Closure), Array, Array)
statamic/cms#4 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Collections/Collection.php(777): Illuminate\\Support\\Arr::map(Array, Object(Closure))
statamic/cms#5 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Collections/Traits/EnumeratesValues.php(394): Illuminate\\Support\\Collection->map(Object(Closure))
statamic/cms#6 /usr/share/nginx/html/vendor/statamic/cms/src/Stache/Query/TermQueryBuilder.php(75): Illuminate\\Support\\Collection->flatMap(Object(Closure))
statamic/cms#7 /usr/share/nginx/html/vendor/statamic/cms/src/Stache/Query/TermQueryBuilder.php(69): Statamic\\Stache\\Query\\TermQueryBuilder->getKeysFromTaxonomies(Array)
statamic/cms#8 /usr/share/nginx/html/vendor/statamic/cms/src/Stache/Query/Builder.php(26): Statamic\\Stache\\Query\\TermQueryBuilder->getFilteredKeys()
statamic/cms#9 /usr/share/nginx/html/vendor/statamic/cms/src/Stache/Query/TermQueryBuilder.php(139): Statamic\\Stache\\Query\\Builder->get(Array)
statamic/cms#10 /usr/share/nginx/html/vendor/statamic/cms/src/Stache/Repositories/TermRepository.php(35): Statamic\\Stache\\Query\\TermQueryBuilder->get()
statamic/cms#11 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php(353): Statamic\\Stache\\Repositories\\TermRepository->whereTaxonomy('cost_carries')
statamic/cms#12 /usr/share/nginx/html/app/Services/TaxonomyService.php(17): Illuminate\\Support\\Facades\\Facade::__callStatic('whereTaxonomy', Array)
statamic/cms#13 /usr/share/nginx/html/app/Http/Controllers/Controller.php(54): App\\Services\\TaxonomyService->getTerms(Object(App\\Enums\\Taxonomy))
statamic/cms#14 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): App\\Http\\Controllers\\Controller->create(Object(Illuminate\\Http\\Request), 'en')
statamic/cms#15 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(43): Illuminate\\Routing\\Controller->callAction('create', Array)
statamic/cms#16 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Routing/Route.php(259): Illuminate\\Routing\\ControllerDispatcher->dispatch(Object(Illuminate\\Routing\\Route), Object(App\\Http\\Controllers\\Controller), 'create')
statamic/cms#17 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Routing/Route.php(205): Illuminate\\Routing\\Route->runController()
statamic/cms#18 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(799): Illuminate\\Routing\\Route->run()
statamic/cms#19 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(141): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
statamic/cms#20 /usr/share/nginx/html/vendor/aryehraber/statamic-impersonator/src/ImpersonatorMiddleware.php(15): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
statamic/cms#21 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): AryehRaber\\Impersonator\\ImpersonatorMiddleware->handle(Object(Illuminate\\Http\\Request), Object(Closure))
statamic/cms#22 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
statamic/cms#23 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle(Object(Illuminate\\Http\\Request), Object(Closure))
statamic/cms#24 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(78): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
statamic/cms#25 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->handle(Object(Illuminate\\Http\\Request), Object(Closure))
statamic/cms#26 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
statamic/cms#27 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\View\\Middleware\\ShareErrorsFromSession->handle(Object(Illuminate\\Http\\Request), Object(Closure))
statamic/cms#28 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(121): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
statamic/cms#29 /usr/share/nginx/html/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))
statamic/cms#30 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Session\\Middleware\\StartSession->handle(Object(Illuminate\\Http\\Request), Object(Closure))
statamic/cms#31 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
statamic/cms#32 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse->handle(Object(Illuminate\\Http\\Request), Object(Closure))
statamic/cms#33 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(67): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
statamic/cms#34 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Cookie\\Middleware\\EncryptCookies->handle(Object(Illuminate\\Http\\Request), Object(Closure))
statamic/cms#35 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(116): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
statamic/cms#36 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(798): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
statamic/cms#37 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(777): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request))
statamic/cms#38 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(741): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route))
statamic/cms#39 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(730): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request))
statamic/cms#40 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request))
statamic/cms#41 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(141): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request))
statamic/cms#42 /usr/share/nginx/html/vendor/statamic/cms/src/Http/Middleware/DisableFloc.php(18): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
statamic/cms#43 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Statamic\\Http\\Middleware\\DisableFloc->handle(Object(Illuminate\\Http\\Request), Object(Closure))
statamic/cms#44 /usr/share/nginx/html/vendor/statamic/cms/src/Http/Middleware/CheckMultisite.php(14): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
statamic/cms#45 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Statamic\\Http\\Middleware\\CheckMultisite->handle(Object(Illuminate\\Http\\Request), Object(Closure))
statamic/cms#46 /usr/share/nginx/html/vendor/statamic/cms/src/Http/Middleware/CheckComposerJsonScripts.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
statamic/cms#47 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Statamic\\Http\\Middleware\\CheckComposerJsonScripts->handle(Object(Illuminate\\Http\\Request), Object(Closure))
statamic/cms#48 /usr/share/nginx/html/vendor/statamic/cms/src/Http/Middleware/PoweredByHeader.php(19): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
statamic/cms#49 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Statamic\\Http\\Middleware\\PoweredByHeader->handle(Object(Illuminate\\Http\\Request), Object(Closure))
statamic/cms#50 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
statamic/cms#51 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure))
statamic/cms#52 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull->handle(Object(Illuminate\\Http\\Request), Object(Closure))
statamic/cms#53 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
statamic/cms#54 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure))
statamic/cms#55 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure))
statamic/cms#56 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
statamic/cms#57 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure))
statamic/cms#58 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
statamic/cms#59 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#60 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
statamic/cms#61 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure))
statamic/cms#62 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#63 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure))
statamic/cms#64 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(116): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
statamic/ideas#69 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
statamic/cms#66 /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request))
#67 /usr/share/nginx/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request))
statamic/cms#68 {main}
"}

Environment

Environment
Application Name: redacted
Laravel Version: 10.25.2
PHP Version: 8.2.10
Composer Version: 2.6.4
Environment: local
Debug Mode: ENABLED
URL: redacted.test
Maintenance Mode: OFF

Cache
Config: NOT CACHED
Events: NOT CACHED

Statamic
Addons: 2
Antlers: runtime
Stache Watcher: Enabled
Static Caching: Disabled
Version: 4.6.0 PRO

Statamic Addons
aryehraber/statamic-impersonator: 2.6.0
spatie/statamic-responsive-images: 4.1.1

Installation

Fresh statamic/statamic site via CLI

Antlers Parser

runtime (new)

Additional details

No response

jasonvarga commented 1 year ago

I get that same error when I do Term::whereTaxonomy('invalid')

Are you 100% sure what you're passing into whereTaxonomy is the correct taxonomy handle? Can you dump($taxonomy->value) there?

geertjanknapen1 commented 1 year ago

@jasonvarga

Seems correct to me.

TaxonomyService line 17; dump($taxonomy->value);

image image
jasonvarga commented 12 months ago

Oh actually it looks like its not recievers. It's cost_carriers.

The stack trace shows cost_carries (missing the final r). Do a search for that.

geertjanknapen1 commented 12 months ago

Oh actually it looks like its not recievers. It's cost_carriers.

The stack trace shows cost_carries (missing the final r). Do a search for that.

Damn must've messed up the handle in my Enum.. thanks for spotting it. Maybe unrelated to this issue but I feel like a "Taxonomy not found" or something would be a more helpful error.

geertjanknapen1 commented 12 months ago

@jasonvarga Do you want me to keep this issue open (preferably so a null check and Taxonomy not found error is added) or should I close this?

jasonvarga commented 12 months ago

I've moved it to the ideas repo so we can consider it a feature request.