{"record":{"id":"04bd6443a261d62b","repo":"phalcon/cphalcon","slug":"sanitizer-sanitizer-does-not-exist-in-the-filt","errorCode":null,"errorMessage":"Sanitizer '{sanitizer}' does not exist in the filter locator","messagePattern":"Sanitizer '(.+?)' does not exist in the filter locator","errorType":"exception","errorClass":"Phalcon\\Http\\Request\\Exceptions\\SanitizerNotFound","httpStatus":null,"severity":"error","filePath":"phalcon/Http/Request.zep","lineNumber":1450,"sourceCode":"     * @phpstan-param list<string> $filters\n     * @phpstan-param list<string> $scope\n     */\n    public function setParameterFilters(\n         string name,\n        array filters = [],\n        array scope = []\n    ) -> <static> {\n        var filterService, sanitizer, localScope, scopeMethod;\n\n        if unlikely empty filters {\n            throw new MissingFilters(name);\n        }\n\n        let filterService = this->getFilterService();\n\n        for sanitizer in filters {\n            if unlikely true !== filterService->has(sanitizer) {\n                throw new SanitizerNotFound(sanitizer);\n            }\n        }\n\n        if empty scope {\n            let localScope = [\n                self::METHOD_GET,\n                self::METHOD_PATCH,\n                self::METHOD_POST,\n                self::METHOD_PUT\n            ];\n        } else {\n            let localScope = scope;\n        }\n\n        for scopeMethod in localScope {\n            let this->queryFilters[strtoupper(scopeMethod)][name] = filters;\n        }\n","sourceCodeStart":1432,"sourceCodeEnd":1468,"githubUrl":"https://github.com/phalcon/cphalcon/blob/b7419de9cd0a8a3f48441ead84c9f8415d463e25/phalcon/Http/Request.zep#L1432-L1468","documentation":"Every name passed to Request::setParameterFilters() is checked against the Filter service locator with has($sanitizer); an unknown name throws SanitizerNotFound. Out of the box the locator knows Phalcon's built-in sanitizers ('string', 'int', 'float', 'email', 'trim', 'lower', 'upper', 'striptags', ...); custom names must be registered on the Filter service via set() before use.","triggerScenarios":"setParameterFilters('name', ['intiger']) (typo), ['escape_string'] (never built-in), or a custom sanitizer defined in DI but never added to the filter locator.","commonSituations":"Typos in sanitizer names; assuming framework-ish names like 'escape' or 'xss' exist; defining custom sanitizers in the container but forgetting to attach them to the Filter service.","solutions":["Use built-in names exactly: 'string', 'int', 'float', 'email', 'trim', 'lower', 'upper', 'striptags', 'special'","Register custom sanitizers on the filter service first: $filter = $di->getShared('filter'); $filter->set('slug', MySlugFilter::class);","Validate names before calling: assert($filter->has($sanitizer)) for each entry"],"exampleFix":"// before\n$request->setParameterFilters('slug', ['slug']); // SanitizerNotFound if unregistered\n\n// after\n$filter = $di->getShared('filter');\nif (!$filter->has('slug')) {\n    $filter->set('slug', \\App\\Filter\\SlugFilter::class);\n}\n$request->setParameterFilters('slug', ['slug']);","handlingStrategy":"validation","validationCode":"$filter = $di->getShared('filter');\nforeach ($filters as $sanitizer) {\n    if (!$filter->has($sanitizer)) {\n        throw new \\InvalidArgumentException(sprintf('Unknown sanitizer \"%s\"', $sanitizer));\n    }\n}\n$request->setParameterFilters($name, $filters);","typeGuard":null,"tryCatchPattern":"try { $request->setParameterFilters($name, $filters); } catch (\\Phalcon\\Http\\Request\\Exceptions\\SanitizerNotFound $e) { // surface the bad name, fix config before deploy\n    error_log($e->getMessage());\n    throw $e;\n}","preventionTips":["Reference the built-in sanitizer list when writing filter config","Register custom sanitizers with Filter::set() during container bootstrap","Smoke-test parameter filters in a boot check so typos fail at deploy, not at runtime"],"tags":["php","phalcon","filters","sanitization","request"],"backgroundTag":"unknown-filter-name","analyzedSha":"b7419de9cd0a8a3f48441ead84c9f8415d463e25","analyzedAt":"2026-08-21T06:21:18.811Z","schemaVersion":2},"datasetVersion":"2026-08-21T11:28:35.574Z"}