{"record":{"id":"211b8a1cdef1f18a","repo":"PHPOffice/PhpSpreadsheet","slug":"can-only-get-pseudo-border-for-supervisor","errorCode":null,"errorMessage":"Can only get pseudo-border for supervisor.","messagePattern":"Can only get pseudo-border for supervisor\\.","errorType":"exception","errorClass":"PhpOffice\\PhpSpreadsheet\\Exception","httpStatus":null,"severity":"error","filePath":"src/PhpSpreadsheet/Style/Borders.php","lineNumber":257,"sourceCode":"    {\n        return $this->bottom;\n    }\n\n    /**\n     * Get Diagonal.\n     */\n    public function getDiagonal(): Border\n    {\n        return $this->diagonal;\n    }\n\n    /**\n     * Get AllBorders (pseudo-border). Only applies to supervisor.\n     */\n    public function getAllBorders(): Border\n    {\n        if (!$this->isSupervisor) {\n            throw new PhpSpreadsheetException('Can only get pseudo-border for supervisor.');\n        }\n\n        return $this->allBorders;\n    }\n\n    /**\n     * Get Outline (pseudo-border). Only applies to supervisor.\n     */\n    public function getOutline(): Border\n    {\n        if (!$this->isSupervisor) {\n            throw new PhpSpreadsheetException('Can only get pseudo-border for supervisor.');\n        }\n\n        return $this->outline;\n    }\n\n    /**","sourceCodeStart":239,"sourceCodeEnd":275,"githubUrl":"https://github.com/PHPOffice/PhpSpreadsheet/blob/65b080eef4d9fd11a5796135ab145883e5c3d6a6/src/PhpSpreadsheet/Style/Borders.php#L239-L275","documentation":"Borders::getAllBorders() returns the 'allBorders' pseudo-border, which exists only on a supervisor Borders instance — the one attached to a Style used through $sheet->getStyle(...). A standalone (non-supervisor) Borders object, e.g. from new Style() or new Borders(), has no worksheet/range context to fan operations out to, so the getter throws 'Can only get pseudo-border for supervisor.'","triggerScenarios":"(new \\PhpOffice\\PhpSpreadsheet\\Style\\Borders())->getAllBorders(); (new Style())->getBorders()->getAllBorders(); reaching into a cloned/detached style component (e.g. via getStyle()->getBorders() on an unattached Style) and then calling getAllBorders(); same for getOutline()/getInside().","commonSituations":"Building Style objects by hand to pass into applyFromArray and accidentally chaining pseudo-border getters; inspection/reflection code that iterates every style sub-object; porting snippets that assumed the object came from getStyle().","solutions":["Work through the supervisor route: $spreadsheet->getActiveSheet()->getStyle('A1')->getBorders()->getAllBorders().","On standalone Borders, set the four concrete sides individually (top/bottom/left/right) or applyFromArray per side.","To apply all/outline/inside borders to a range, call $sheet->getStyle($range)->applyFromArray(['borders' => ['allBorders' => [...]]]) which operates in supervisor mode."],"exampleFix":"// before\n$borders = new \\PhpOffice\\PhpSpreadsheet\\Style\\Borders();\n$borders->getAllBorders()->setBorderStyle(...); // throws\n\n// after\n$sheet->getStyle('A1:D10')->applyFromArray([\n    'borders' => [\n        'allBorders' => ['borderStyle' => \\PhpOffice\\PhpSpreadsheet\\Style\\Border::BORDER_THIN],\n    ],\n]);","handlingStrategy":"validation","validationCode":"// Only call pseudo-border getters on a supervisor obtained via getStyle()\n$style = $sheet->getStyle('A1:D10');\n$allBorders = $style->getBorders()->getAllBorders(); // OK: supervisor\n$allBorders->applyFromArray(['borderStyle' => \\PhpOffice\\PhpSpreadsheet\\Style\\Border::BORDER_THIN]);","typeGuard":"/** No public isSupervisor flag exists — narrow by origin instead. */\nfunction bordersAreSupervisor(\\PhpOffice\\PhpSpreadsheet\\Worksheet\\Worksheet $sheet, string $range, \\PhpOffice\\PhpSpreadsheet\\Style\\Borders $b): bool\n{\n    // supervisor Borders are exactly those reached via $sheet->getStyle($range)->getBorders()\n    return $b === $sheet->getStyle($range)->getBorders();\n}","tryCatchPattern":"try {\n    $borders->getAllBorders()->applyFromArray($arr);\n} catch (\\PhpOffice\\PhpSpreadsheet\\Exception $e) {\n    // non-supervisor: set each concrete side instead\n    foreach (['Top', 'Bottom', 'Left', 'Right'] as $side) {\n        $borders->{\"get$side\"()}->applyFromArray($arr);\n    }\n}","preventionTips":["Always obtain styles via $sheet->getStyle($range) before touching pseudo-borders.","Never construct Style/Borders with new for range-level operations.","Prefer applyFromArray() with 'allBorders'/'outline'/'inside' keys at the range level."],"tags":["styles","borders","pseudo-border","supervisor","phpspreadsheet"],"backgroundTag":"style-supervisor-required","analyzedSha":"65b080eef4d9fd11a5796135ab145883e5c3d6a6","analyzedAt":"2026-08-17T05:40:41.646Z","schemaVersion":2},"datasetVersion":"2026-08-17T09:17:11.063Z"}