$objectManager not injected - Call to a member function get() on null

Hi everybody,

I am working on an existing Neos project an after some modifications in our packages, I run in a problem, I cannot explain.

Our plugins which are based on ActionController do not work anymore but throw an error (see below). It looks like $objectManager is not injected. I have no idea how this could happen and where I should start with my research. Maybe someone has a hint, where to look.

My current Neos version is the latest 8.3 - I know this is not much information, but at the moment I do not know more about the problem and hope, somebody already had a simiar problem.

Exception [0] in line 271 of /var/www/html/Packages/Framework/Neos.Flow/Classes/Mvc/Controller/ActionController.php: Call to a member function get() on null

100 Neos\Flow\Mvc\Controller\ActionController::getPublicActionMethods(NULL)
99 Neos\Flow\Mvc\Controller\ActionController::resolveActionMethodName()
98 Neos\Flow\Mvc\Controller\ActionController::processRequest(Neos\Flow\Mvc\ActionRequest, Neos\Flow\Mvc\ActionResponse)
97 Neos\Flow\Mvc\Dispatcher_Original::initiateDispatchLoop(Neos\Flow\Mvc\ActionRequest, Neos\Flow\Mvc\ActionResponse)
96 Neos\Flow\Mvc\Dispatcher_Original::dispatch(Neos\Flow\Mvc\ActionRequest, Neos\Flow\Mvc\ActionResponse)
95 Neos\Neos\Fusion\PluginImplementation_Original::evaluate()
94 Neos\Fusion\Core\Runtime_Original::evaluateObjectOrRetrieveFromCache(Neos\Neos\Fusion\PluginImplementation, "root<Neos.Fusion:Case>/documentType<Neos.Fusion:Ma…t<Neos.Fusion:Matcher>/element<DAV.Obis:LoginForm>", array|18|, array|5|)
93 Neos\Fusion\Core\Runtime_Original::evaluate("root<Neos.Fusion:Case>/documentType<Neos.Fusion:Ma…t<Neos.Fusion:Matcher>/element<DAV.Obis:LoginForm>", NULL, "Exception")
92 Neos\Fusion\Core\Runtime_Original::render("root<Neos.Fusion:Case>/documentType<Neos.Fusion:Ma…t<Neos.Fusion:Matcher>/element<DAV.Obis:LoginForm>")
91 Neos\Fusion\FusionObjects\RendererImplementation_Original::evaluate()
90 Neos\Fusion\FusionObjects\MatcherImplementation_Original::evaluate()
89 Neos\Fusion\Core\Runtime_Original::evaluateObjectOrRetrieveFromCache(Neos\Fusion\FusionObjects\MatcherImplementation, "root<Neos.Fusion:Case>/documentType<Neos.Fusion:Ma…eos.Neos:ContentCase>/default<Neos.Fusion:Matcher>", array|6|, array|5|)
88 Neos\Fusion\Core\Runtime_Original::evaluate("root<Neos.Fusion:Case>/documentType<Neos.Fusion:Ma…eos.Neos:ContentCase>/default<Neos.Fusion:Matcher>", NULL, "Exception")
87 Neos\Fusion\Core\Runtime_Original::render("root<Neos.Fusion:Case>/documentType<Neos.Fusion:Ma…eos.Neos:ContentCase>/default<Neos.Fusion:Matcher>")
86 Neos\Fusion\FusionObjects\CaseImplementation_Original::renderMatcher("default")
85 Neos\Fusion\FusionObjects\CaseImplementation_Original::evaluate()
84 Neos\Fusion\Core\Runtime_Original::evaluateObjectOrRetrieveFromCache(Neos\Fusion\FusionObjects\CaseImplementation, "root<Neos.Fusion:Case>/documentType<Neos.Fusion:Ma…<Neos.Neos:ContentCollectionRenderer>/itemRenderer", array|7|, array|5|)
83 Neos\Fusion\Core\Runtime_Original::evaluate("root<Neos.Fusion:Case>/documentType<Neos.Fusion:Ma…<Neos.Neos:ContentCollectionRenderer>/itemRenderer", NULL, "Exception")
82 Neos\Fusion\Core\Runtime_Original::render("root<Neos.Fusion:Case>/documentType<Neos.Fusion:Ma…<Neos.Neos:ContentCollectionRenderer>/itemRenderer")
81 Neos\Fusion\FusionObjects\MapImplementation_Original::evaluate()
80 Neos\Fusion\FusionObjects\LoopImplementation_Original::evaluate()
79 Neos\Fusion\Core\Runtime_Original::evaluateObjectOrRetrieveFromCache(Neos\Fusion\FusionObjects\LoopImplementation, "root<Neos.Fusion:Case>/documentType<Neos.Fusion:Ma…her>/renderer<Neos.Neos:ContentCollection>/content", array|11|, array|5|)
78 Neos\Fusion\Core\Runtime_Original::evaluate("root<Neos.Fusion:Case>/documentType<Neos.Fusion:Ma…her>/renderer<Neos.Neos:ContentCollection>/content", Neos\Fusion\FusionObjects\TagImplementation)
77 Neos\Fusion\FusionObjects\AbstractFusionObject::fusionValue("content")
76 Neos\Fusion\FusionObjects\TagImplementation_Original::getContent()
75 Neos\Fusion\FusionObjects\TagImplementation_Original::evaluate()
74 Neos\Fusion\Core\Runtime_Original::evaluateObjectOrRetrieveFromCache(Neos\Fusion\FusionObjects\TagImplementation, "root<Neos.Fusion:Case>/documentType<Neos.Fusion:Ma…maryContent>/default<Neos.Fusion:Matcher>/renderer", array|14|, array|6|)
73 Neos\Fusion\Core\Runtime_Original::evaluate("root<Neos.Fusion:Case>/documentType<Neos.Fusion:Ma…maryContent>/default<Neos.Fusion:Matcher>/renderer", Neos\Fusion\FusionObjects\MatcherImplementation)
72 Neos\Fusion\FusionObjects\RendererImplementation_Original::evaluate()
71 Neos\Fusion\FusionObjects\MatcherImplementation_Original::evaluate()
70 Neos\Fusion\Core\Runtime_Original::evaluateObjectOrRetrieveFromCache(Neos\Fusion\FusionObjects\MatcherImplementation, "root<Neos.Fusion:Case>/documentType<Neos.Fusion:Ma….Neos:PrimaryContent>/default<Neos.Fusion:Matcher>", array|6|, array|5|)
69 Neos\Fusion\Core\Runtime_Original::evaluate("root<Neos.Fusion:Case>/documentType<Neos.Fusion:Ma….Neos:PrimaryContent>/default<Neos.Fusion:Matcher>", NULL, "Exception")
68 Neos\Fusion\Core\Runtime_Original::render("root<Neos.Fusion:Case>/documentType<Neos.Fusion:Ma….Neos:PrimaryContent>/default<Neos.Fusion:Matcher>")
67 Neos\Fusion\FusionObjects\CaseImplementation_Original::renderMatcher("default")
66 Neos\Fusion\FusionObjects\CaseImplementation_Original::evaluate()
65 Neos\Fusion\Core\Runtime_Original::evaluateObjectOrRetrieveFromCache(Neos\Fusion\FusionObjects\CaseImplementation, "root<Neos.Fusion:Case>/documentType<Neos.Fusion:Ma…tentseite>/body<Neos.Fusion:Template>/content/main", array|8|, array|5|)
64 Neos\Fusion\Core\Runtime_Original::evaluate("root<Neos.Fusion:Case>/documentType<Neos.Fusion:Ma…tentseite>/body<Neos.Fusion:Template>/content/main", Neos\Fusion\FusionObjects\TemplateImplementation)
63 Neos\Fusion\FusionObjects\Helpers\FusionPathProxy_Original::objectAccess()
62 Neos\FluidAdaptor\Core\ViewHelper\TemplateVariableContainer::extractWithAccessor(Neos\Fusion\FusionObjects\Helpers\FusionPathProxy, "main", "object_access")
61 TYPO3Fluid\Fluid\Core\Variables\StandardVariableProvider::extractSingleValue(Neos\Fusion\FusionObjects\Helpers\FusionPathProxy, "main", "object_access")
60 TYPO3Fluid\Fluid\Core\Variables\StandardVariableProvider::getByPath("content.main", array|0|)
59 Neos\FluidAdaptor\Core\ViewHelper\TemplateVariableContainer::getByPath("content.main", array|0|)
58 Frontend_Node_action_show_f6e52e8a6b58ad09214fb1558ed9d02339a690d7::{closure}()
57 Frontend_Node_action_show_f6e52e8a6b58ad09214fb1558ed9d02339a690d7::render(Neos\FluidAdaptor\Core\Rendering\RenderingContext)
56 TYPO3Fluid\Fluid\View\AbstractTemplateView::render()
55 Neos\Fusion\FusionObjects\TemplateImplementation_Original::evaluate()
54 Neos\Fusion\Core\Runtime_Original::evaluateObjectOrRetrieveFromCache(Neos\Fusion\FusionObjects\TemplateImplementation, "root<Neos.Fusion:Case>/documentType<Neos.Fusion:Ma…tcher>/element<DAV.MagazineBase:Contentseite>/body", array|16|, array|5|)
53 Neos\Fusion\Core\Runtime_Original::evaluate("root<Neos.Fusion:Case>/documentType<Neos.Fusion:Ma…tcher>/element<DAV.MagazineBase:Contentseite>/body", Neos\Fusion\FusionObjects\HttpResponseImplementation)
52 Neos\Fusion\FusionObjects\AbstractFusionObject::fusionValue("body")
51 Neos\Fusion\FusionObjects\AbstractArrayFusionObject::evaluateNestedProperties()
50 Neos\Fusion\FusionObjects\HttpResponseImplementation_Original::evaluate()
49 Neos\Fusion\Core\Runtime_Original::evaluateObjectOrRetrieveFromCache(Neos\Fusion\FusionObjects\HttpResponseImplementation, "root<Neos.Fusion:Case>/documentType<Neos.Fusion:Matcher>/element<DAV.MagazineBase:Contentseite>", array|21|, array|6|)
48 Neos\Fusion\Core\Runtime_Original::evaluate("root<Neos.Fusion:Case>/documentType<Neos.Fusion:Matcher>/element<DAV.MagazineBase:Contentseite>", NULL, "Exception")
47 Neos\Fusion\Core\Runtime_Original::render("root<Neos.Fusion:Case>/documentType<Neos.Fusion:Matcher>/element<DAV.MagazineBase:Contentseite>")
46 Neos\Fusion\FusionObjects\RendererImplementation_Original::evaluate()
45 Neos\Fusion\FusionObjects\MatcherImplementation_Original::evaluate()
44 Neos\Fusion\Core\Runtime_Original::evaluateObjectOrRetrieveFromCache(Neos\Fusion\FusionObjects\MatcherImplementation, "root<Neos.Fusion:Case>/documentType<Neos.Fusion:Matcher>", array|6|, array|5|)
43 Neos\Fusion\Core\Runtime_Original::evaluate("root<Neos.Fusion:Case>/documentType<Neos.Fusion:Matcher>", NULL, "Exception")
42 Neos\Fusion\Core\Runtime_Original::render("root<Neos.Fusion:Case>/documentType<Neos.Fusion:Matcher>")
41 Neos\Fusion\FusionObjects\CaseImplementation_Original::renderMatcher("documentType")
40 Neos\Fusion\FusionObjects\CaseImplementation_Original::evaluate()
39 Neos\Fusion\Core\Runtime_Original::evaluateObjectOrRetrieveFromCache(Neos\Fusion\FusionObjects\CaseImplementation, "root", array|13|, array|6|)
38 Neos\Fusion\Core\Runtime_Original::evaluate("root", NULL, "Exception")
37 Neos\Fusion\Core\Runtime_Original::render("root")
36 Neos\Neos\View\FusionView_Original::render()
35 Neos\Flow\Mvc\Controller\ActionController::renderView()
34 Neos\Flow\Mvc\Controller\ActionController::callActionMethod()
33 Neos\Flow\Mvc\Controller\ActionController::processRequest(Neos\Flow\Mvc\ActionRequest, Neos\Flow\Mvc\ActionResponse)
32 Neos\Flow\Mvc\Dispatcher_Original::initiateDispatchLoop(Neos\Flow\Mvc\ActionRequest, Neos\Flow\Mvc\ActionResponse)
31 Neos\Flow\Mvc\Dispatcher_Original::dispatch(Neos\Flow\Mvc\ActionRequest, Neos\Flow\Mvc\ActionResponse)
30 Neos\Flow\Mvc\DispatchMiddleware_Original::process(GuzzleHttp\Psr7\ServerRequest, Neos\Flow\Http\Middleware\MiddlewaresChain)
29 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle(GuzzleHttp\Psr7\ServerRequest)
28 DAV\MagazineBase\Middleware\ArchiveYearNotFoundMiddleware_Original::process(GuzzleHttp\Psr7\ServerRequest, Neos\Flow\Http\Middleware\MiddlewaresChain)
27 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle(GuzzleHttp\Psr7\ServerRequest)
26 Neos\Flow\Http\Middleware\SecurityEntryPointMiddleware_Original::process(GuzzleHttp\Psr7\ServerRequest, Neos\Flow\Http\Middleware\MiddlewaresChain)
25 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle(GuzzleHttp\Psr7\ServerRequest)
24 Neos\Flow\Http\Middleware\RequestBodyParsingMiddleware_Original::process(GuzzleHttp\Psr7\ServerRequest, Neos\Flow\Http\Middleware\MiddlewaresChain)
23 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle(GuzzleHttp\Psr7\ServerRequest)
22 Neos\Flow\Mvc\FlashMessage\FlashMessageMiddleware_Original::process(GuzzleHttp\Psr7\ServerRequest, Neos\Flow\Http\Middleware\MiddlewaresChain)
21 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle(GuzzleHttp\Psr7\ServerRequest)
20 Neos\Flow\Http\Middleware\PoweredByMiddleware_Original::process(GuzzleHttp\Psr7\ServerRequest, Neos\Flow\Http\Middleware\MiddlewaresChain)
19 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle(GuzzleHttp\Psr7\ServerRequest)
18 Neos\RedirectHandler\RedirectMiddleware_Original::process(GuzzleHttp\Psr7\ServerRequest, Neos\Flow\Http\Middleware\MiddlewaresChain)
17 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle(GuzzleHttp\Psr7\ServerRequest)
16 Neos\Flow\Mvc\Routing\RoutingMiddleware_Original::process(GuzzleHttp\Psr7\ServerRequest, Neos\Flow\Http\Middleware\MiddlewaresChain)
15 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle(GuzzleHttp\Psr7\ServerRequest)
14 Neos\Neos\Routing\RequestUriHostMiddleware_Original::process(GuzzleHttp\Psr7\ServerRequest, Neos\Flow\Http\Middleware\MiddlewaresChain)
13 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle(GuzzleHttp\Psr7\ServerRequest)
12 Neos\FluidAdaptor\Core\Widget\AjaxWidgetMiddleware_Original::process(GuzzleHttp\Psr7\ServerRequest, Neos\Flow\Http\Middleware\MiddlewaresChain)
11 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle(GuzzleHttp\Psr7\ServerRequest)
10 Neos\Flow\Http\Middleware\SessionMiddleware_Original::process(GuzzleHttp\Psr7\ServerRequest, Neos\Flow\Http\Middleware\MiddlewaresChain)
9 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle(GuzzleHttp\Psr7\ServerRequest)
8 Neos\Flow\Http\Middleware\MethodOverrideMiddleware_Original::process(GuzzleHttp\Psr7\ServerRequest, Neos\Flow\Http\Middleware\MiddlewaresChain)
7 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle(GuzzleHttp\Psr7\ServerRequest)
6 Neos\Flow\Http\Middleware\TrustedProxiesMiddleware_Original::process(GuzzleHttp\Psr7\ServerRequest, Neos\Flow\Http\Middleware\MiddlewaresChain)
5 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle(GuzzleHttp\Psr7\ServerRequest)
4 Neos\Flow\Http\Middleware\StandardsComplianceMiddleware_Original::process(GuzzleHttp\Psr7\ServerRequest, Neos\Flow\Http\Middleware\MiddlewaresChain)
3 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle(GuzzleHttp\Psr7\ServerRequest)
2 Neos\Flow\Http\RequestHandler::handleRequest()
1 Neos\Flow\Core\Bootstrap::run()

Found it! :partying_face:

The Beginning

We are using a signal slot in one of our packages, which listens to a signal in another package, which is optional and may or may not be installed.

        $dispatcher->connect(
            AuthentificationController::class,
            'authenticationSucceed',
            BookmarkService::class,
            'writeLocalStorageBookmarksToDatabaseOnAuthenticationSucceed'
        );

The Problem

We made the other package with AuthentificationController an optional package and had PHPstan issues with the snippet, if the optional package was not installed. So we changed to this:

    if (class_exists(AuthentificationController::class)) {
        $dispatcher->connect(
            AuthentificationController::class,
            'authenticationSucceed',
            BookmarkService::class,
            'writeLocalStorageBookmarksToDatabaseOnAuthenticationSucceed'
        );
    }

PHPstan was happy and so we have been until we realized the error in the topic.

The Solution

I removed the constant AuthentificationController::class which caused PHPstan issues and replaced it with the full class name as good old string.

        $dispatcher->connect(
            'Vendor\\OurOptionalPackage\\Controller\\AuthentificationController',
            'authenticationSucceed',
            BookmarkService::class,
            'writeLocalStorageBookmarksToDatabaseOnAuthenticationSucceed'
        );

I’m fine with my solution. It seems to work as it should and also is valid PHP code. But on the other hand I do not know, if this behavior is a bug in Neos and should be reported?

1 Like

class_exists on your AuthentificationController triggers composers autoloading already super early in the bootstrap via Package.php. That must not happen :smiley: During the bootstrap we still use the composers autoloading and thus load unproxied classes from your composer package. Only at a later stage Flows autoloader is registered to load classes from the Flow proxies. Running code in the Package.php does require a little knowledge to the inner workings for Flows booting phases … and autoloading classes must be done with great care:)

But thanks for reporting this, we can add a warning to the docs that autoloading classes is not a good idea and might only be done for Proxy(false) classes where it doesnt matter.

1 Like