{"record":{"id":"deb2c4044f5c6d5b","repo":"phalcon/cphalcon","slug":"a-dependency-injection-container-is-required-to-ac-deb2c4","errorCode":null,"errorMessage":"A dependency injection container is required to access the 'filter' service","messagePattern":"A dependency injection container is required to access the 'filter' service","errorType":"exception","errorClass":"Phalcon\\Http\\Request\\Exceptions\\FilterServiceUnavailable","httpStatus":null,"severity":"error","filePath":"phalcon/Http/Request.zep","lineNumber":1888,"sourceCode":"        }\n\n        return files;\n    }\n\n    /**\n     * Checks the filter service and assigns it to the class parameter\n     */\n    private function getFilterService() -> <FilterInterface>\n    {\n        var container, filterService;\n\n        let filterService = this->filterService;\n\n        if typeof filterService != \"object\" {\n            let container = <DiInterface> this->container;\n\n            if container === null {\n                throw new FilterServiceUnavailable();\n            }\n\n            let filterService       = <FilterInterface> container->getShared(\"filter\"),\n                this->filterService = filterService;\n        }\n\n        return this->filterService;\n    }\n\n    /**\n     * Parses multipart/form-data from the raw body.\n     *\n     * @phpstan-return http_form_data\n     */\n    private function getFormData() -> array\n    {\n        var boundary, matches;\n","sourceCodeStart":1870,"sourceCodeEnd":1906,"githubUrl":"https://github.com/phalcon/cphalcon/blob/b7419de9cd0a8a3f48441ead84c9f8415d463e25/phalcon/Http/Request.zep#L1870-L1906","documentation":"Request::getFilterService() lazily resolves the 'filter' service: if no FilterInterface was injected (setFilterService()) it falls back to container->getShared('filter'). It throws FilterServiceUnavailable when the Request has no container at all - typical for Request objects created standalone outside a bootstrapped application.","triggerScenarios":"$request = new Request(); $request->getFilteredPost('email'); (or any setParameterFilters/getFiltered* path) where setDI() was never called and Di::getDefault() is null - CLI workers, unit tests, micro-apps.","commonSituations":"Unit tests constructing Request directly; long-running CLI workers parsing request payloads; code that clones or rebuilds Request before a container is attached.","solutions":["Attach a container: $request->setDI($di) - FactoryDefault already defines 'filter'","Or inject the filter directly: $request->setFilterService($filter);","Use Phalcon\\Http\\RequestFactory::newInstance() which wires dependencies correctly","In CLI/tests, set a default container once: Di::setDefault(new FactoryDefault());"],"exampleFix":"// before\n$request = new \\Phalcon\\Http\\Request();\n$email = $request->getFilteredPost('email'); // throws: no container\n\n// after\n$di = new \\Phalcon\\Di\\FactoryDefault();\n$request = new \\Phalcon\\Http\\Request();\n$request->setDI($di);\n$email = $request->getFilteredPost('email');","handlingStrategy":"validation","validationCode":"// standalone Request usage: attach a container before any getFiltered* call\nuse Phalcon\\Di\\Di;\n\nif (null === Di::getDefault()) {\n    Di::setDefault(new \\Phalcon\\Di\\FactoryDefault());\n}\n$request->setDI(Di::getDefault());\n$email = $request->getFilteredPost('email');","typeGuard":null,"tryCatchPattern":"try { $value = $request->getFilteredPost('email'); } catch (\\Phalcon\\Http\\Request\\Exceptions\\FilterServiceUnavailable $e) { // wiring bug: fix DI, do not swallow\n    $request->setDI(new \\Phalcon\\Di\\FactoryDefault());\n    $value = $request->getFilteredPost('email');\n}","preventionTips":["Create Request objects via Phalcon\\Http\\RequestFactory in standalone code","Call setDI() immediately after new Request()","Set Di::setDefault() at the entrypoint of CLI scripts and tests"],"tags":["php","phalcon","filters","dependency-injection","request"],"backgroundTag":"missing-di-container","analyzedSha":"b7419de9cd0a8a3f48441ead84c9f8415d463e25","analyzedAt":"2026-08-21T06:21:18.811Z","schemaVersion":2},"datasetVersion":"2026-08-21T11:28:35.574Z"}