{"id":"c3ee33b97acafa11","repo":"laravel/framework","slug":"unknown-visibility-visibility","errorCode":null,"errorMessage":"Unknown visibility: {$visibility}.","messagePattern":"Unknown visibility: (.+?)\\.","errorType":"exception","errorClass":"InvalidArgumentException","httpStatus":null,"severity":"error","filePath":"src/Illuminate/Filesystem/FilesystemAdapter.php","lineNumber":1094,"sourceCode":"\n    /**\n     * Parse the given visibility value.\n     *\n     * @param  string|null  $visibility\n     * @return string|null\n     *\n     * @throws \\InvalidArgumentException\n     */\n    protected function parseVisibility($visibility)\n    {\n        if (is_null($visibility)) {\n            return;\n        }\n\n        return match ($visibility) {\n            FilesystemContract::VISIBILITY_PUBLIC => Visibility::PUBLIC,\n            FilesystemContract::VISIBILITY_PRIVATE => Visibility::PRIVATE,\n            default => throw new InvalidArgumentException(\"Unknown visibility: {$visibility}.\"),\n        };\n    }\n\n    /**\n     * Define a custom callback that generates file download responses.\n     *\n     * @param  \\Closure  $callback\n     * @return void\n     */\n    public function serveUsing(Closure $callback)\n    {\n        $this->serveCallback = $callback;\n    }\n\n    /**\n     * Define a custom temporary URL builder callback.\n     *\n     * @param  \\Closure  $callback","sourceCodeStart":1076,"sourceCodeEnd":1112,"githubUrl":"https://github.com/laravel/framework/blob/bd6b5437e6ad87bb49f9b426724f07a9f64e9683/src/Illuminate/Filesystem/FilesystemAdapter.php#L1076-L1112","documentation":"Thrown by FilesystemAdapter::parseVisibility() when the visibility argument is not one of the FilesystemContract constants 'public' or 'private'. parseVisibility translates Laravel visibility strings to Flysystem Visibility enum values; any other value (typo, casing, numeric) is rejected because Flysystem has no concept for it.","triggerScenarios":"Calling Storage::disk($name)->setVisibility($path, $visibility) (or put() with a visibility option) where $visibility is not exactly 'public' or 'private' - e.g. 'PUBLIC', 'read-only', 'public-read', or an enum.","commonSituations":"Passing AWS ACL strings ('public-read', 'bucket-owner-full-control') instead of Laravel's visibility strings; user input fed straight into setVisibility; case mismatch from an uppercased env var.","solutions":["Pass only 'public' or 'private'.","Normalize input: strtolower(trim($input)) and map to the two constants.","Validate user-provided visibility against ['public','private'] before storage calls.","For ACL-specific tuning, configure the disk's 'permissions' or 'options' arrays instead."],"exampleFix":"// before - AWS-style ACL string is not a Laravel visibility\nStorage::setVisibility('file.txt', 'public-read');\n\n// after\nStorage::setVisibility('file.txt', 'public');","handlingStrategy":"validation","validationCode":"if (! in_array($visibility, ['public', 'private'], true)) {\n    throw new \\InvalidArgumentException('Visibility must be \"public\" or \"private\"');\n}\nStorage::setVisibility($path, $visibility);","typeGuard":"function isValidVisibility(?string $visibility): bool\n{\n    return in_array($visibility, ['public', 'private'], true);\n}","tryCatchPattern":"try {\n    Storage::setVisibility($path, $visibility);\n} catch (\\InvalidArgumentException $e) {\n    if (str_contains($e->getMessage(), 'Unknown visibility')) {\n        abort(422, 'Invalid visibility value');\n    }\n    throw $e;\n}","preventionTips":["Only pass 'public' or 'private'.","Normalize user input with strtolower() and validate against an allow-list.","Map cloud ACLs to Laravel visibilities at the config level, not in calls."],"tags":["filesystem","validation","visibility","configuration"],"analyzedSha":"bd6b5437e6ad87bb49f9b426724f07a9f64e9683","analyzedAt":"2026-08-06T00:28:32.783Z","schemaVersion":2}