[{"data":1,"prerenderedAt":246},["ShallowReactive",2],{"page-\u002Fv1\u002Fadapters\u002Flaravel\u002Ffilament-ui":3},{"id":4,"title":5,"body":6,"description":238,"extension":239,"meta":240,"navigation":241,"path":242,"seo":243,"stem":244,"__hash__":245},"content\u002Fv1\u002Fadapters\u002Flaravel\u002Ffilament-ui.md","Filament UI",{"type":7,"value":8,"toc":230},"minimark",[9,13,27,32,42,46,109,113,170,173,177,198,202,205,209,212,226],[10,11,5],"h1",{"id":12},"filament-ui",[14,15,16,17,21,22,26],"p",{},"Filament is an ",[18,19,20],"strong",{},"optional"," Laravel admin delivery mechanism under ",[23,24,25],"code",{},"{Module}\u002FUI\u002FFilament\u002F",". It is not Domain and not a shortcut around Use Cases.",[28,29,31],"h2",{"id":30},"placement","Placement",[33,34,40],"pre",{"className":35,"code":37,"language":38,"meta":39},[36],"language-text","Ordering\u002FUI\u002FFilament\u002F\n├── Resources\u002F\n│   └── Orders\u002F\n│       ├── OrderResource.php\n│       └── Pages\u002F\n├── Actions\u002F          # optional custom actions\n└── …\n","text","",[23,41,37],{"__ignoreMap":39},[28,43,45],{"id":44},"rules","Rules",[47,48,49,62],"table",{},[50,51,52],"thead",{},[53,54,55,59],"tr",{},[56,57,58],"th",{},"Allowed",[56,60,61],{},"Forbidden",[63,64,65,81,93,101],"tbody",{},[53,66,67,74],{},[68,69,70,71],"td",{},"Filament Actions \u002F pages call first-level ",[23,72,73],{},"*UseCase",[68,75,76,77,80],{},"Business policy only inside ",[23,78,79],{},"mutateFormDataBeforeCreate"," without a Use Case",[53,82,83,86],{},[68,84,85],{},"Map form state → Application DTO",[68,87,88,89,92],{},"Injecting peer ",[23,90,91],{},"*ModuleInterface"," into Resources",[53,94,95,98],{},[68,96,97],{},"Present Domain results \u002F exceptions as notifications",[68,99,100],{},"Using Eloquent models from another module to decide eligibility",[53,102,103,106],{},[68,104,105],{},"Standard CRUD that still goes through Use Cases when policy exists",[68,107,108],{},"Cross-module Eloquent joins for “convenient” admin tables",[28,110,112],{"id":111},"action-pattern-illustrative","Action pattern (illustrative)",[33,114,118],{"className":115,"code":116,"language":117,"meta":39,"style":39},"language-php shiki shiki-themes github-light github-dark","\u002F\u002F UI\u002FFilament — delivery only\nAction::make('fulfill')\n    ->requiresConfirmation()\n    ->action(function (OrderModel $record) {\n        ($this->markOrderFulfilled)(new MarkOrderFulfilledDTO(\n            orderReference: $record->getReference(),\n        ));\n    });\n","php",[23,119,120,128,134,140,146,152,158,164],{"__ignoreMap":39},[121,122,125],"span",{"class":123,"line":124},"line",1,[121,126,127],{},"\u002F\u002F UI\u002FFilament — delivery only\n",[121,129,131],{"class":123,"line":130},2,[121,132,133],{},"Action::make('fulfill')\n",[121,135,137],{"class":123,"line":136},3,[121,138,139],{},"    ->requiresConfirmation()\n",[121,141,143],{"class":123,"line":142},4,[121,144,145],{},"    ->action(function (OrderModel $record) {\n",[121,147,149],{"class":123,"line":148},5,[121,150,151],{},"        ($this->markOrderFulfilled)(new MarkOrderFulfilledDTO(\n",[121,153,155],{"class":123,"line":154},6,[121,156,157],{},"            orderReference: $record->getReference(),\n",[121,159,161],{"class":123,"line":160},7,[121,162,163],{},"        ));\n",[121,165,167],{"class":123,"line":166},8,[121,168,169],{},"    });\n",[14,171,172],{},"Prefer resolving the Use Case via the container \u002F constructor injection on the Page or Action class — same entry-point rules as Controllers.",[28,174,176],{"id":175},"forms-and-tables","Forms and tables",[178,179,180,188,195],"ul",{},[181,182,183,184,187],"li",{},"Validate ",[18,185,186],{},"shape"," in Filament (required, max length, types).",[181,189,190,191,194],{},"Encode ",[18,192,193],{},"policy"," in Domain \u002F Use Cases.",[181,196,197],{},"List subheadings and empty states should use professional, usage-oriented English (operator-facing), not internal architecture jargon.",[28,199,201],{"id":200},"error-handling","Error handling",[14,203,204],{},"Catch Domain exceptions in the UI layer and map them to Filament notifications. Do not swallow replaceability-breaking imports to “get a friendlier message” from a peer module’s Domain.",[28,206,208],{"id":207},"wave-note","Wave note",[14,210,211],{},"Deeper Filament Builder \u002F navigation recipes may grow here later; Core entry-point and ACL rules already apply today.",[14,213,214,215,220,221,225],{},"Core reference: ",[216,217,219],"a",{"href":218},"\u002Fv1\u002Fcore\u002Fgolden-flow","Golden flow"," · ",[216,222,224],{"href":223},"\u002Fv1\u002Fcore\u002Fuse-cases-and-dtos","Use cases & DTOs",".",[227,228,229],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":39,"searchDepth":130,"depth":130,"links":231},[232,233,234,235,236,237],{"id":30,"depth":130,"text":31},{"id":44,"depth":130,"text":45},{"id":111,"depth":130,"text":112},{"id":175,"depth":130,"text":176},{"id":200,"depth":130,"text":201},{"id":207,"depth":130,"text":208},"Optional Filament admin resources live in UI — invoke Use Cases; never embed Domain policy in form hooks alone.","md",{},true,"\u002Fv1\u002Fadapters\u002Flaravel\u002Ffilament-ui",{"title":5,"description":238},"v1\u002Fadapters\u002Flaravel\u002Ffilament-ui","vSswDYnaFZ_V6TyVpzeCqbKYfrPlsDHQLltw-aBCwTU",1786241413976]