[{"data":1,"prerenderedAt":3374},["ShallowReactive",2],{"navigation":3,"/advanced/openapi":283,"/advanced/openapi-surround":3369},[4,16,20,68,128,168,179,259,263,267,271,275,279],{"title":5,"path":6,"stem":7,"children":8},"Getting Started","/getting-started","1.getting-started",[9,12],{"title":10,"path":6,"stem":11},"Introduction","1.getting-started/index",{"title":13,"path":14,"stem":15},"Installation","/getting-started/installation","1.getting-started/1.installation",{"title":17,"path":18,"stem":19},"Upgrading","/upgrading","10.upgrading",{"title":21,"path":22,"stem":23,"children":24},"Essentials","/essentials","2.essentials",[25,28,32,36,40,44,48,52,56,60,64],{"title":26,"path":22,"stem":27},"Core concepts","2.essentials/index",{"title":29,"path":30,"stem":31},"Routing","/essentials/routing","2.essentials/1.routing",{"title":33,"path":34,"stem":35},"Typed Requests & Responses","/essentials/typed-io","2.essentials/10.typed-io",{"title":37,"path":38,"stem":39},"Authentication","/essentials/authentication","2.essentials/2.authentication",{"title":41,"path":42,"stem":43},"Identity & User Store","/essentials/identity","2.essentials/3.identity",{"title":45,"path":46,"stem":47},"Requests & Responses","/essentials/requests-responses","2.essentials/4.requests-responses",{"title":49,"path":50,"stem":51},"Controllers","/essentials/controllers","2.essentials/5.controllers",{"title":53,"path":54,"stem":55},"Database","/essentials/database","2.essentials/6.database",{"title":57,"path":58,"stem":59},"Validation","/essentials/validation","2.essentials/7.validation",{"title":61,"path":62,"stem":63},"Migrations","/essentials/migrations","2.essentials/8.migrations",{"title":65,"path":66,"stem":67},"ORM Models","/essentials/orm","2.essentials/9.orm",{"title":69,"path":70,"stem":71,"children":72},"Features","/features","3.features",[73,76,80,84,88,92,96,100,104,108,112,116,120,124],{"title":74,"path":70,"stem":75},"Built‑in Capabilities","3.features/index",{"title":77,"path":78,"stem":79},"API Keys & Scopes","/features/api-keys","3.features/api-keys",{"title":81,"path":82,"stem":83},"Browser Sessions (Cookie Auth)","/features/browser-sessions","3.features/browser-sessions",{"title":85,"path":86,"stem":87},"Caching","/features/caching","3.features/caching",{"title":89,"path":90,"stem":91},"CORS & CSRF","/features/cors-csrf","3.features/cors-csrf",{"title":93,"path":94,"stem":95},"Distributed Locks","/features/distributed-locks","3.features/distributed-locks",{"title":97,"path":98,"stem":99},"Events & Listeners","/features/events","3.features/events",{"title":101,"path":102,"stem":103},"Field Selection","/features/field-selection","3.features/field-selection",{"title":105,"path":106,"stem":107},"File Uploads","/features/file-uploads","3.features/file-uploads",{"title":109,"path":110,"stem":111},"Notifications","/features/notifications","3.features/notifications",{"title":113,"path":114,"stem":115},"Queues & Jobs","/features/queues-jobs","3.features/queues-jobs",{"title":117,"path":118,"stem":119},"Rate Limiting","/features/rate-limiting","3.features/rate-limiting",{"title":121,"path":122,"stem":123},"Task Scheduling","/features/scheduling","3.features/scheduling",{"title":125,"path":126,"stem":127},"Webhooks","/features/webhooks","3.features/webhooks",{"title":129,"path":130,"stem":131,"children":132},"Advanced","/advanced","4.advanced",[133,136,140,144,148,152,156,160,164],{"title":134,"path":130,"stem":135},"Techniques and Patterns","4.advanced/index",{"title":137,"path":138,"stem":139},"Configuration","/advanced/configuration","4.advanced/configuration",{"title":141,"path":142,"stem":143},"Dependency Injection","/advanced/dependency-injection","4.advanced/dependency-injection",{"title":145,"path":146,"stem":147},"Middleware","/advanced/middleware","4.advanced/middleware",{"title":149,"path":150,"stem":151},"OpenAPI Generation","/advanced/openapi","4.advanced/openapi",{"title":153,"path":154,"stem":155},"Performance","/advanced/performance","4.advanced/performance",{"title":157,"path":158,"stem":159},"Repositories","/advanced/repositories","4.advanced/repositories",{"title":161,"path":162,"stem":163},"Service Providers","/advanced/service-providers","4.advanced/service-providers",{"title":165,"path":166,"stem":167},"Testing","/advanced/testing","4.advanced/testing",{"title":169,"path":170,"stem":171,"children":172},"Overview","/tooling","5.tooling",[173,175],{"title":169,"path":170,"stem":174},"5.tooling/index",{"title":176,"path":177,"stem":178},"AI Skills","/tooling/ai-skills","5.tooling/1.ai-skills",{"title":180,"path":181,"stem":182,"children":183},"Cookbook","/cookbook","6.cookbook",[184,187,191,195,199,203,207,211,215,219,223,227,231,235,239,243,247,251,255],{"title":185,"path":181,"stem":186},"Recipes & How‑Tos","6.cookbook/index",{"title":188,"path":189,"stem":190},"Routing Recipes","/cookbook/routing","6.cookbook/1.routing",{"title":192,"path":193,"stem":194},"Caching Recipes","/cookbook/caching","6.cookbook/10.caching",{"title":196,"path":197,"stem":198},"Queue Infrastructure","/cookbook/queues-and-jobs","6.cookbook/11.queues-and-jobs",{"title":200,"path":201,"stem":202},"Notification Channels & Templates","/cookbook/notifications","6.cookbook/13.notifications",{"title":204,"path":205,"stem":206},"Storage","/cookbook/storage","6.cookbook/15.storage",{"title":208,"path":209,"stem":210},"Image Processing Examples","/cookbook/image-processing","6.cookbook/16.image-processing",{"title":212,"path":213,"stem":214},"Permissions and Authorization","/cookbook/permissions-and-authorization","6.cookbook/18.permissions-and-authorization",{"title":216,"path":217,"stem":218},"Session Analytics","/cookbook/sessions-analytics","6.cookbook/19.sessions-analytics",{"title":220,"path":221,"stem":222},"Writing Middleware","/cookbook/middleware","6.cookbook/2.middleware",{"title":224,"path":225,"stem":226},"API Metrics","/cookbook/api-metrics","6.cookbook/20.api-metrics",{"title":228,"path":229,"stem":230},"Performance Recipes","/cookbook/performance","6.cookbook/21.performance",{"title":232,"path":233,"stem":234},"Memory Management","/cookbook/memory-management","6.cookbook/22.memory-management",{"title":236,"path":237,"stem":238},"Writing Console Commands","/cookbook/console-commands","6.cookbook/23.console-commands",{"title":240,"path":241,"stem":242},"Glueful Extensions","/cookbook/extensions","6.cookbook/25.extensions",{"title":244,"path":245,"stem":246},"Error Handling","/cookbook/error-handling","6.cookbook/4.error-handling",{"title":248,"path":249,"stem":250},"Security Guide","/cookbook/security","6.cookbook/5.security",{"title":252,"path":253,"stem":254},"Service Options Resolver","/cookbook/configuration","6.cookbook/6.configuration",{"title":256,"path":257,"stem":258},"Logging","/cookbook/logging","6.cookbook/7.logging",{"title":260,"path":261,"stem":262},"API Reference","/api-reference","7.api-reference",{"title":264,"path":265,"stem":266},"CLI Reference","/cli-reference","8.cli-reference",{"title":268,"path":269,"stem":270},"Extensions","/extensions","9.extensions",{"title":272,"path":273,"stem":274},"Contributing","/contributing","contributing",{"title":276,"path":277,"stem":278},"Release Notes","/releases","releases",{"title":280,"path":281,"stem":282},"Release Archive","/releases-archive","releases-archive",{"id":284,"title":149,"body":285,"description":3363,"extension":3364,"links":3365,"meta":3366,"navigation":753,"path":150,"seo":3367,"stem":151,"__hash__":3368},"docs/4.advanced/openapi.md",{"type":286,"value":287,"toc":3346},"minimark",[288,306,338,353,383,388,623,626,647,651,658,924,942,1031,1036,1097,1107,1111,1118,1125,1128,1291,1294,1300,1306,1501,1509,1515,1525,1814,1836,1841,1844,2092,2111,2115,2188,2192,2250,2327,2354,2368,2378,2382,2385,2448,2451,2462,2465,2480,2486,2490,2509,2838,2861,2873,2876,2882,3129,3153,3157,3171,3221,3307,3310,3314,3342],[289,290,291,292,296,297,301,302,305],"p",{},"Glueful builds its OpenAPI document ",[293,294,295],"strong",{},"code-first",". The generator (",[298,299,300],"code",{},"Glueful\\Support\\Documentation\\RouteReflectionDocGenerator",", driven by ",[298,303,304],{},"OpenApiGenerator",") reads the live route table and the PHP types on each handler. Paths, parameters, security, request bodies and success responses are all inferred. You annotate only what types can't express.",[307,308,313],"pre",{"className":309,"code":310,"language":311,"meta":312,"style":312},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark monokai","php glueful generate:openapi -f --ui\n","bash","",[298,314,315],{"__ignoreMap":312},[316,317,320,324,328,331,335],"span",{"class":318,"line":319},"line",1,[316,321,323],{"class":322},"sR7ES","php",[316,325,327],{"class":326},"sLACW"," glueful",[316,329,330],{"class":326}," generate:openapi",[316,332,334],{"class":333},"sFhLe"," -f",[316,336,337],{"class":333}," --ui\n",[289,339,340,341,344,345,348,349,352],{},"This writes ",[298,342,343],{},"docs/openapi.json"," and a reference UI at ",[298,346,347],{},"docs/index.html",", both served by the app at ",[298,350,351],{},"/api-docs",".",[354,355,359],"u-alert",{"color":356,"icon":357,"variant":358},"warning","i-tabler-alert-triangle","subtle",[360,361,362],"template",{"v-slot:description":312},[289,363,364,365,368,369,372,373,372,376,372,379,382],{},"Route docblocks are ",[293,366,367],{},"not"," read. ",[298,370,371],{},"@route",", ",[298,374,375],{},"@summary",[298,377,378],{},"@requestBody",[298,380,381],{},"@response"," and similar tags have had no effect since 1.57, when the comment-parsing generator was removed. Use types and the attributes below instead.",[384,385,387],"h2",{"id":386},"what-is-inferred","What Is Inferred",[389,390,391,404],"table",{},[392,393,394],"thead",{},[395,396,397,401],"tr",{},[398,399,400],"th",{},"Source",[398,402,403],{},"Becomes",[405,406,407,427,446,473,502,525,535,551,585,602],"tbody",{},[395,408,409,413],{},[410,411,412],"td",{},"Route path and method",[410,414,415,416,419,420,423,424],{},"Path item and operation; ",[298,417,418],{},"{param}"," segments become required path parameters, with any ",[298,421,422],{},"->where()"," constraint as ",[298,425,426],{},"pattern",[395,428,429,432],{},[410,430,431],{},"Route name",[410,433,434,437,438,441,442,445],{},[298,435,436],{},"operationId"," and ",[298,439,440],{},"summary"," (",[298,443,444],{},"posts.show"," → \"Posts Show\"); unnamed routes use the method and path",[395,447,448,466],{},[410,449,450,451,454,455,458,459,437,462,465],{},"First literal path segment after the API prefix (",[298,452,453],{},"api.versioning.prefix",", default ",[298,456,457],{},"/api","), skipping ",[298,460,461],{},"{params}",[298,463,464],{},"v1","-style version segments",[410,467,468,469,472],{},"Tag (override with ",[298,470,471],{},"#[ApiOperation(tags: [...])]",")",[395,474,475,485],{},[410,476,477,480,481,484],{},[298,478,479],{},"auth"," / ",[298,482,483],{},"api_key"," middleware",[410,486,487,490,491,494,495,437,498,501],{},[298,488,489],{},"security"," via ",[298,492,493],{},"documentation.middleware_map",", plus ",[298,496,497],{},"401",[298,499,500],{},"403"," responses",[395,503,504,512],{},[410,505,506,480,509],{},[298,507,508],{},"->rateLimit()",[298,510,511],{},"#[RateLimit]",[410,513,514,517,518,437,521,524],{},[298,515,516],{},"429"," response with ",[298,519,520],{},"Retry-After",[298,522,523],{},"X-RateLimit-*"," headers",[395,526,527,532],{},[410,528,529],{},[298,530,531],{},"#[RequireScope]",[410,533,534],{},"\"Requires scope: …\" in the description",[395,536,537,542],{},[410,538,539],{},[298,540,541],{},"#[Fields]",[410,543,544,437,547,550],{},[298,545,546],{},"fields",[298,548,549],{},"expand"," query parameters, listing the allowed fields",[395,552,553,559],{},[410,554,555,558],{},[298,556,557],{},"RequestData"," parameter",[410,560,561,562,565,566,569,570,573,574,569,577,580,581,584],{},"JSON ",[298,563,564],{},"requestBody"," from the DTO, ",[298,567,568],{},"path","/",[298,571,572],{},"query"," parameters from ",[298,575,576],{},"#[FromRoute]",[298,578,579],{},"#[FromQuery]",", and a ",[298,582,583],{},"422"," response",[395,586,587,596],{},[410,588,589,592,593,595],{},[298,590,591],{},"#[Validate]"," (no ",[298,594,557],{}," parameter)",[410,597,598,599,601],{},"Fallback JSON ",[298,600,564],{}," from the rule strings",[395,603,604,616],{},[410,605,606,372,609,372,612,615],{},[298,607,608],{},"ResponseData",[298,610,611],{},"CollectionResponse",[298,613,614],{},"PaginatedResponse"," return type",[410,617,618,619,622],{},"Success response schema, wrapped in the envelope, at the ",[298,620,621],{},"#[ResponseStatus]"," status",[289,624,625],{},"Most routes need no annotation at all.",[289,627,628,631,632,635,636,639,640,480,643,646],{},[293,629,630],{},"Since 1.91:"," under ",[298,633,634],{},"/api/v1"," the tag comes from the segment after the prefix (",[298,637,638],{},"/api/v1/users"," → \"Users\"); earlier versions tagged every such route \"Api\". Regenerate SDKs and check ",[298,641,642],{},"API_DOCS_INCLUDE_TAGS",[298,644,645],{},"API_DOCS_EXCLUDE_TAGS"," lists that named \"Api\".",[384,648,650],{"id":649},"types-shape-the-schema","Types Shape the Schema",[289,652,653,654,657],{},"The generator reflects the same classes the router uses at runtime (see ",[655,656,33],"a",{"href":34},"), so the documented contract and the enforced contract can't drift apart.",[307,659,662],{"className":660,"code":661,"language":323,"meta":312,"style":312},"language-php shiki shiki-themes material-theme-lighter github-light github-dark monokai","use App\\DTOs\\{CreatePostData, PostData};\nuse Glueful\\Http\\Responses\\PaginatedResponse;\nuse Glueful\\Routing\\Attributes\\ResponseStatus;\n\nfinal class PostController extends BaseController\n{\n    /** @return PaginatedResponse\u003C\\App\\DTOs\\PostData> */\n    public function index(ListPostsData $query): PaginatedResponse { /* ... */ }\n\n    #[ResponseStatus(201)]\n    public function store(CreatePostData $data): PostData { /* ... */ }\n}\n",[298,663,664,700,725,748,755,777,783,820,863,868,887,918],{"__ignoreMap":312},[316,665,666,670,674,678,681,683,687,691,694,697],{"class":318,"line":319},[316,667,669],{"class":668},"shWJe","use",[316,671,673],{"class":672},"s91G_"," App",[316,675,677],{"class":676},"sv8o3","\\",[316,679,680],{"class":672},"DTOs",[316,682,677],{"class":676},[316,684,686],{"class":685},"swvn1","{",[316,688,690],{"class":689},"seZir","CreatePostData",[316,692,693],{"class":685},",",[316,695,696],{"class":689}," PostData",[316,698,699],{"class":685},"};\n",[316,701,703,705,708,710,713,715,718,720,722],{"class":318,"line":702},2,[316,704,669],{"class":668},[316,706,707],{"class":672}," Glueful",[316,709,677],{"class":676},[316,711,712],{"class":672},"Http",[316,714,677],{"class":676},[316,716,717],{"class":672},"Responses",[316,719,677],{"class":676},[316,721,614],{"class":689},[316,723,724],{"class":685},";\n",[316,726,728,730,732,734,736,738,741,743,746],{"class":318,"line":727},3,[316,729,669],{"class":668},[316,731,707],{"class":672},[316,733,677],{"class":676},[316,735,29],{"class":672},[316,737,677],{"class":676},[316,739,740],{"class":672},"Attributes",[316,742,677],{"class":676},[316,744,745],{"class":689},"ResponseStatus",[316,747,724],{"class":685},[316,749,751],{"class":318,"line":750},4,[316,752,754],{"emptyLinePlaceholder":753},true,"\n",[316,756,758,762,766,770,773],{"class":318,"line":757},5,[316,759,761],{"class":760},"sTNss","final",[316,763,765],{"class":764},"srJo8"," class",[316,767,769],{"class":768},"sKvfc"," PostController",[316,771,772],{"class":760}," extends",[316,774,776],{"class":775},"sW3Pz"," BaseController\n",[316,778,780],{"class":318,"line":779},6,[316,781,782],{"class":685},"{\n",[316,784,786,790,794,798,801,804,808,810,812,814,817],{"class":318,"line":785},7,[316,787,789],{"class":788},"ss7Ak","    /** ",[316,791,793],{"class":792},"s41CE","@return",[316,795,797],{"class":796},"s6MXs"," PaginatedResponse",[316,799,800],{"class":788},"\u003C",[316,802,677],{"class":803},"smtk4",[316,805,807],{"class":806},"sWXFY","App",[316,809,677],{"class":803},[316,811,680],{"class":806},[316,813,677],{"class":803},[316,815,816],{"class":796},"PostData",[316,818,819],{"class":788},"> */\n",[316,821,823,826,829,833,836,840,843,846,848,852,854,857,860],{"class":318,"line":822},8,[316,824,825],{"class":760},"    public",[316,827,828],{"class":764}," function",[316,830,832],{"class":831},"sD0ED"," index",[316,834,835],{"class":685},"(",[316,837,839],{"class":838},"s_MOj","ListPostsData",[316,841,842],{"class":685}," $",[316,844,572],{"class":845},"ss--_",[316,847,472],{"class":685},[316,849,851],{"class":850},"sGXK2",":",[316,853,797],{"class":838},[316,855,856],{"class":685}," {",[316,858,859],{"class":788}," /* ... */",[316,861,862],{"class":685}," }\n",[316,864,866],{"class":318,"line":865},9,[316,867,754],{"emptyLinePlaceholder":753},[316,869,871,874,876,878,882,884],{"class":318,"line":870},10,[316,872,873],{"class":845},"    #[",[316,875,745],{"class":672},[316,877,835],{"class":685},[316,879,881],{"class":880},"sYThS","201",[316,883,472],{"class":685},[316,885,886],{"class":845},"]\n",[316,888,890,892,894,897,899,901,903,906,908,910,912,914,916],{"class":318,"line":889},11,[316,891,825],{"class":760},[316,893,828],{"class":764},[316,895,896],{"class":831}," store",[316,898,835],{"class":685},[316,900,690],{"class":838},[316,902,842],{"class":685},[316,904,905],{"class":845},"data",[316,907,472],{"class":685},[316,909,851],{"class":850},[316,911,696],{"class":838},[316,913,856],{"class":685},[316,915,859],{"class":788},[316,917,862],{"class":685},[316,919,921],{"class":318,"line":920},12,[316,922,923],{"class":685},"}\n",[289,925,926,441,929,372,932,372,935,938,939,941],{},[293,927,928],{},"Request bodies",[298,930,931],{},"POST",[298,933,934],{},"PUT",[298,936,937],{},"PATCH"," only) come from the ",[298,940,557],{}," constructor:",[943,944,945,960,1001,1015,1028],"ul",{},[946,947,948,949,952,953,441,956,959],"li",{},"Property types give the structure: scalars, nullables, backed enums (as ",[298,950,951],{},"enum","), nested DTOs and ",[298,954,955],{},"DateTimeInterface",[298,957,958],{},"date-time",").",[946,961,962,965,966,969,970,972,973,569,976,569,979,569,982,985,986,372,989,985,992,372,994,569,997,1000],{},[298,963,964],{},"#[Rule]"," strings add constraints: ",[298,967,968],{},"required"," → the ",[298,971,968],{}," list, ",[298,974,975],{},"email",[298,977,978],{},"uuid",[298,980,981],{},"url",[298,983,984],{},"date"," → ",[298,987,988],{},"format",[298,990,991],{},"in:",[298,993,951],{},[298,995,996],{},"min:",[298,998,999],{},"max:"," → length or numeric bounds.",[946,1002,1003,1006,1007,1010,1011,1014],{},[298,1004,1005],{},"#[ArrayOf]"," is the only source of an array's ",[298,1008,1009],{},"items",". Docblock ",[298,1012,1013],{},"@var"," types are not read for request DTOs.",[946,1016,1017,437,1019,1021,1022,1024,1025,1027],{},[298,1018,576],{},[298,1020,579],{}," fields become parameters and are removed from the body schema. A ",[298,1023,579],{}," field is required when its rule says ",[298,1026,968],{}," or it has no default.",[946,1029,1030],{},"An example payload is derived from the rules.",[289,1032,1033,1035],{},[293,1034,717],{}," come from the return type:",[943,1037,1038,1047,1061,1074,1090],{},[946,1039,1040,1041,1043,1044,352],{},"A ",[298,1042,608],{}," return type is reflected from its public properties and wrapped in ",[298,1045,1046],{},"{success, message, data}",[946,1048,1049,1051,1052,1054,1055,1057,1058,959],{},[298,1050,611],{}," documents ",[298,1053,905],{}," as an array, and ",[298,1056,614],{}," documents the flat pagination envelope (always ",[298,1059,1060],{},"200",[946,1062,1063,1064,480,1067,1070,1071,352],{},"The item type comes from the ",[298,1065,1066],{},"@return CollectionResponse\u003CItem>",[298,1068,1069],{},"@return PaginatedResponse\u003CItem>"," docblock. Write the class fully qualified, or keep it in the controller's namespace: imported or aliased short names aren't resolved and fall back to ",[298,1072,1073],{},"{type: object}",[946,1075,1076,1077,1079,1080,1082,1083,1085,1086,1089],{},"For ",[298,1078,608],{}," arrays, ",[298,1081,1005],{}," on the property sets ",[298,1084,1009],{},". Otherwise a ",[298,1087,1088],{},"@var Foo[]"," docblock is used.",[946,1091,1092,1093,1096],{},"A DTO with a custom ",[298,1094,1095],{},"toArray()"," is still documented from its public properties.",[289,1098,1099,1100,1103,1104,352],{},"Returning a ",[298,1101,1102],{},"JsonResource"," or a plain array isn't reflectable. Document those handlers with ",[298,1105,1106],{},"#[ApiResponse]",[384,1108,1110],{"id":1109},"override-attributes","Override Attributes",[289,1112,1113,1114,1117],{},"Four method attributes in ",[298,1115,1116],{},"Glueful\\Routing\\Attributes"," fill the gaps. Each is optional and only replaces what it sets.",[1119,1120,1122],"h3",{"id":1121},"apioperation",[298,1123,1124],{},"#[ApiOperation]",[289,1126,1127],{},"Prose, tags and identity:",[307,1129,1131],{"className":660,"code":1130,"language":323,"meta":312,"style":312},"use Glueful\\Routing\\Attributes\\ApiOperation;\n\n#[ApiOperation(\n    summary: 'Publish a post',\n    description: 'Moves a draft to published and notifies subscribers.',\n    tags: ['Posts'],\n    operationId: 'publishPost',\n    deprecated: false,\n)]\npublic function publish(string $uuid): PostData { /* ... */ }\n",[298,1132,1133,1154,1158,1168,1189,1205,1225,1241,1254,1260],{"__ignoreMap":312},[316,1134,1135,1137,1139,1141,1143,1145,1147,1149,1152],{"class":318,"line":319},[316,1136,669],{"class":668},[316,1138,707],{"class":672},[316,1140,677],{"class":676},[316,1142,29],{"class":672},[316,1144,677],{"class":676},[316,1146,740],{"class":672},[316,1148,677],{"class":676},[316,1150,1151],{"class":689},"ApiOperation",[316,1153,724],{"class":685},[316,1155,1156],{"class":318,"line":702},[316,1157,754],{"emptyLinePlaceholder":753},[316,1159,1160,1163,1165],{"class":318,"line":727},[316,1161,1162],{"class":845},"#[",[316,1164,1151],{"class":672},[316,1166,1167],{"class":685},"(\n",[316,1169,1170,1174,1176,1180,1183,1186],{"class":318,"line":750},[316,1171,1173],{"class":1172},"sQqfL","    summary",[316,1175,851],{"class":685},[316,1177,1179],{"class":1178},"siCPE"," '",[316,1181,1182],{"class":326},"Publish a post",[316,1184,1185],{"class":1178},"'",[316,1187,1188],{"class":685},",\n",[316,1190,1191,1194,1196,1198,1201,1203],{"class":318,"line":757},[316,1192,1193],{"class":1172},"    description",[316,1195,851],{"class":685},[316,1197,1179],{"class":1178},[316,1199,1200],{"class":326},"Moves a draft to published and notifies subscribers.",[316,1202,1185],{"class":1178},[316,1204,1188],{"class":685},[316,1206,1207,1210,1212,1215,1217,1220,1222],{"class":318,"line":779},[316,1208,1209],{"class":1172},"    tags",[316,1211,851],{"class":685},[316,1213,1214],{"class":685}," [",[316,1216,1185],{"class":1178},[316,1218,1219],{"class":326},"Posts",[316,1221,1185],{"class":1178},[316,1223,1224],{"class":685},"],\n",[316,1226,1227,1230,1232,1234,1237,1239],{"class":318,"line":785},[316,1228,1229],{"class":1172},"    operationId",[316,1231,851],{"class":685},[316,1233,1179],{"class":1178},[316,1235,1236],{"class":326},"publishPost",[316,1238,1185],{"class":1178},[316,1240,1188],{"class":685},[316,1242,1243,1246,1248,1252],{"class":318,"line":822},[316,1244,1245],{"class":1172},"    deprecated",[316,1247,851],{"class":685},[316,1249,1251],{"class":1250},"sMTiH"," false",[316,1253,1188],{"class":685},[316,1255,1256,1258],{"class":318,"line":865},[316,1257,472],{"class":685},[316,1259,886],{"class":845},[316,1261,1262,1265,1267,1270,1272,1275,1277,1279,1281,1283,1285,1287,1289],{"class":318,"line":870},[316,1263,1264],{"class":760},"public",[316,1266,828],{"class":764},[316,1268,1269],{"class":831}," publish",[316,1271,835],{"class":685},[316,1273,1274],{"class":668},"string",[316,1276,842],{"class":685},[316,1278,978],{"class":845},[316,1280,472],{"class":685},[316,1282,851],{"class":850},[316,1284,696],{"class":838},[316,1286,856],{"class":685},[316,1288,859],{"class":788},[316,1290,862],{"class":685},[289,1292,1293],{},"Empty fields keep the derived value. A hand-written description comes before the auto-generated scope text.",[1119,1295,1297],{"id":1296},"queryparam",[298,1298,1299],{},"#[QueryParam]",[289,1301,1302,1303,1305],{},"Documents a query parameter that isn't a ",[298,1304,579],{}," DTO field. It is repeatable:",[307,1307,1309],{"className":660,"code":1308,"language":323,"meta":312,"style":312},"use Glueful\\Routing\\Attributes\\QueryParam;\n\n#[QueryParam('days', type: 'integer', description: 'Lookback window', required: false)]\n#[QueryParam('status', enum: ['active', 'archived'])]\n#[QueryParam('since', format: 'date')]\npublic function stats(Request $request): Response { /* ... */ }\n",[298,1310,1311,1332,1336,1392,1437,1469],{"__ignoreMap":312},[316,1312,1313,1315,1317,1319,1321,1323,1325,1327,1330],{"class":318,"line":319},[316,1314,669],{"class":668},[316,1316,707],{"class":672},[316,1318,677],{"class":676},[316,1320,29],{"class":672},[316,1322,677],{"class":676},[316,1324,740],{"class":672},[316,1326,677],{"class":676},[316,1328,1329],{"class":689},"QueryParam",[316,1331,724],{"class":685},[316,1333,1334],{"class":318,"line":702},[316,1335,754],{"emptyLinePlaceholder":753},[316,1337,1338,1340,1342,1344,1346,1349,1351,1353,1356,1358,1360,1363,1365,1367,1370,1372,1374,1377,1379,1381,1384,1386,1388,1390],{"class":318,"line":727},[316,1339,1162],{"class":845},[316,1341,1329],{"class":672},[316,1343,835],{"class":685},[316,1345,1185],{"class":1178},[316,1347,1348],{"class":326},"days",[316,1350,1185],{"class":1178},[316,1352,693],{"class":685},[316,1354,1355],{"class":1172}," type",[316,1357,851],{"class":685},[316,1359,1179],{"class":1178},[316,1361,1362],{"class":326},"integer",[316,1364,1185],{"class":1178},[316,1366,693],{"class":685},[316,1368,1369],{"class":1172}," description",[316,1371,851],{"class":685},[316,1373,1179],{"class":1178},[316,1375,1376],{"class":326},"Lookback window",[316,1378,1185],{"class":1178},[316,1380,693],{"class":685},[316,1382,1383],{"class":1172}," required",[316,1385,851],{"class":685},[316,1387,1251],{"class":1250},[316,1389,472],{"class":685},[316,1391,886],{"class":845},[316,1393,1394,1396,1398,1400,1402,1405,1407,1409,1412,1414,1416,1418,1421,1423,1425,1427,1430,1432,1435],{"class":318,"line":750},[316,1395,1162],{"class":845},[316,1397,1329],{"class":672},[316,1399,835],{"class":685},[316,1401,1185],{"class":1178},[316,1403,1404],{"class":326},"status",[316,1406,1185],{"class":1178},[316,1408,693],{"class":685},[316,1410,1411],{"class":1172}," enum",[316,1413,851],{"class":685},[316,1415,1214],{"class":685},[316,1417,1185],{"class":1178},[316,1419,1420],{"class":326},"active",[316,1422,1185],{"class":1178},[316,1424,693],{"class":685},[316,1426,1179],{"class":1178},[316,1428,1429],{"class":326},"archived",[316,1431,1185],{"class":1178},[316,1433,1434],{"class":685},"])",[316,1436,886],{"class":845},[316,1438,1439,1441,1443,1445,1447,1450,1452,1454,1457,1459,1461,1463,1465,1467],{"class":318,"line":757},[316,1440,1162],{"class":845},[316,1442,1329],{"class":672},[316,1444,835],{"class":685},[316,1446,1185],{"class":1178},[316,1448,1449],{"class":326},"since",[316,1451,1185],{"class":1178},[316,1453,693],{"class":685},[316,1455,1456],{"class":1172}," format",[316,1458,851],{"class":685},[316,1460,1179],{"class":1178},[316,1462,984],{"class":326},[316,1464,1185],{"class":1178},[316,1466,472],{"class":685},[316,1468,886],{"class":845},[316,1470,1471,1473,1475,1478,1480,1483,1485,1488,1490,1492,1495,1497,1499],{"class":318,"line":779},[316,1472,1264],{"class":760},[316,1474,828],{"class":764},[316,1476,1477],{"class":831}," stats",[316,1479,835],{"class":685},[316,1481,1482],{"class":838},"Request",[316,1484,842],{"class":685},[316,1486,1487],{"class":845},"request",[316,1489,472],{"class":685},[316,1491,851],{"class":850},[316,1493,1494],{"class":838}," Response",[316,1496,856],{"class":685},[316,1498,859],{"class":788},[316,1500,862],{"class":685},[289,1502,1040,1503,1505,1506,1508],{},[298,1504,1299],{}," with the same name as a generated parameter (for example ",[298,1507,546],{},") replaces it.",[1119,1510,1512],{"id":1511},"apirequestbody",[298,1513,1514],{},"#[ApiRequestBody]",[289,1516,1517,1518,1521,1522,851],{},"For handlers that read the body manually, or accept a non-JSON body. Set exactly one of ",[298,1519,1520],{},"schema"," or ",[298,1523,1524],{},"inlineSchema",[307,1526,1528],{"className":660,"code":1527,"language":323,"meta":312,"style":312},"use Glueful\\Routing\\Attributes\\ApiRequestBody;\n\n// JSON body described by a DTO class (documentation only, no runtime hydration)\n#[ApiRequestBody(schema: LoginData::class, description: 'Credentials')]\npublic function login(Request $request): Response { /* ... */ }\n\n// Multipart upload: a raw schema, only for non-JSON content types\n#[ApiRequestBody(\n    contentType: 'multipart/form-data',\n    inlineSchema: [\n        'type' => 'object',\n        'properties' => ['file' => ['type' => 'string', 'format' => 'binary']],\n        'required' => ['file'],\n    ],\n)]\npublic function upload(Request $request): Response { /* ... */ }\n",[298,1529,1530,1551,1555,1560,1598,1627,1631,1636,1644,1660,1670,1692,1750,1771,1777,1784],{"__ignoreMap":312},[316,1531,1532,1534,1536,1538,1540,1542,1544,1546,1549],{"class":318,"line":319},[316,1533,669],{"class":668},[316,1535,707],{"class":672},[316,1537,677],{"class":676},[316,1539,29],{"class":672},[316,1541,677],{"class":676},[316,1543,740],{"class":672},[316,1545,677],{"class":676},[316,1547,1548],{"class":689},"ApiRequestBody",[316,1550,724],{"class":685},[316,1552,1553],{"class":318,"line":702},[316,1554,754],{"emptyLinePlaceholder":753},[316,1556,1557],{"class":318,"line":727},[316,1558,1559],{"class":788},"// JSON body described by a DTO class (documentation only, no runtime hydration)\n",[316,1561,1562,1564,1566,1568,1570,1572,1575,1578,1581,1583,1585,1587,1589,1592,1594,1596],{"class":318,"line":750},[316,1563,1162],{"class":845},[316,1565,1548],{"class":672},[316,1567,835],{"class":685},[316,1569,1520],{"class":1172},[316,1571,851],{"class":685},[316,1573,1574],{"class":838}," LoginData",[316,1576,1577],{"class":850},"::",[316,1579,1580],{"class":668},"class",[316,1582,693],{"class":685},[316,1584,1369],{"class":1172},[316,1586,851],{"class":685},[316,1588,1179],{"class":1178},[316,1590,1591],{"class":326},"Credentials",[316,1593,1185],{"class":1178},[316,1595,472],{"class":685},[316,1597,886],{"class":845},[316,1599,1600,1602,1604,1607,1609,1611,1613,1615,1617,1619,1621,1623,1625],{"class":318,"line":757},[316,1601,1264],{"class":760},[316,1603,828],{"class":764},[316,1605,1606],{"class":831}," login",[316,1608,835],{"class":685},[316,1610,1482],{"class":838},[316,1612,842],{"class":685},[316,1614,1487],{"class":845},[316,1616,472],{"class":685},[316,1618,851],{"class":850},[316,1620,1494],{"class":838},[316,1622,856],{"class":685},[316,1624,859],{"class":788},[316,1626,862],{"class":685},[316,1628,1629],{"class":318,"line":779},[316,1630,754],{"emptyLinePlaceholder":753},[316,1632,1633],{"class":318,"line":785},[316,1634,1635],{"class":788},"// Multipart upload: a raw schema, only for non-JSON content types\n",[316,1637,1638,1640,1642],{"class":318,"line":822},[316,1639,1162],{"class":845},[316,1641,1548],{"class":672},[316,1643,1167],{"class":685},[316,1645,1646,1649,1651,1653,1656,1658],{"class":318,"line":865},[316,1647,1648],{"class":1172},"    contentType",[316,1650,851],{"class":685},[316,1652,1179],{"class":1178},[316,1654,1655],{"class":326},"multipart/form-data",[316,1657,1185],{"class":1178},[316,1659,1188],{"class":685},[316,1661,1662,1665,1667],{"class":318,"line":870},[316,1663,1664],{"class":1172},"    inlineSchema",[316,1666,851],{"class":685},[316,1668,1669],{"class":685}," [\n",[316,1671,1672,1675,1678,1680,1683,1685,1688,1690],{"class":318,"line":889},[316,1673,1674],{"class":1178},"        '",[316,1676,1677],{"class":326},"type",[316,1679,1185],{"class":1178},[316,1681,1682],{"class":850}," =>",[316,1684,1179],{"class":1178},[316,1686,1687],{"class":326},"object",[316,1689,1185],{"class":1178},[316,1691,1188],{"class":685},[316,1693,1694,1696,1699,1701,1703,1705,1707,1710,1712,1714,1716,1718,1720,1722,1724,1726,1728,1730,1732,1734,1736,1738,1740,1742,1745,1747],{"class":318,"line":920},[316,1695,1674],{"class":1178},[316,1697,1698],{"class":326},"properties",[316,1700,1185],{"class":1178},[316,1702,1682],{"class":850},[316,1704,1214],{"class":685},[316,1706,1185],{"class":1178},[316,1708,1709],{"class":326},"file",[316,1711,1185],{"class":1178},[316,1713,1682],{"class":850},[316,1715,1214],{"class":685},[316,1717,1185],{"class":1178},[316,1719,1677],{"class":326},[316,1721,1185],{"class":1178},[316,1723,1682],{"class":850},[316,1725,1179],{"class":1178},[316,1727,1274],{"class":326},[316,1729,1185],{"class":1178},[316,1731,693],{"class":685},[316,1733,1179],{"class":1178},[316,1735,988],{"class":326},[316,1737,1185],{"class":1178},[316,1739,1682],{"class":850},[316,1741,1179],{"class":1178},[316,1743,1744],{"class":326},"binary",[316,1746,1185],{"class":1178},[316,1748,1749],{"class":685},"]],\n",[316,1751,1753,1755,1757,1759,1761,1763,1765,1767,1769],{"class":318,"line":1752},13,[316,1754,1674],{"class":1178},[316,1756,968],{"class":326},[316,1758,1185],{"class":1178},[316,1760,1682],{"class":850},[316,1762,1214],{"class":685},[316,1764,1185],{"class":1178},[316,1766,1709],{"class":326},[316,1768,1185],{"class":1178},[316,1770,1224],{"class":685},[316,1772,1774],{"class":318,"line":1773},14,[316,1775,1776],{"class":685},"    ],\n",[316,1778,1780,1782],{"class":318,"line":1779},15,[316,1781,472],{"class":685},[316,1783,886],{"class":845},[316,1785,1787,1789,1791,1794,1796,1798,1800,1802,1804,1806,1808,1810,1812],{"class":318,"line":1786},16,[316,1788,1264],{"class":760},[316,1790,828],{"class":764},[316,1792,1793],{"class":831}," upload",[316,1795,835],{"class":685},[316,1797,1482],{"class":838},[316,1799,842],{"class":685},[316,1801,1487],{"class":845},[316,1803,472],{"class":685},[316,1805,851],{"class":850},[316,1807,1494],{"class":838},[316,1809,856],{"class":685},[316,1811,859],{"class":788},[316,1813,862],{"class":685},[289,1815,1816,1817,1819,1820,1823,1824,1827,1828,1830,1831,437,1833,1835],{},"Setting both, setting neither, or using ",[298,1818,1524],{}," with ",[298,1821,1822],{},"application/json"," throws ",[298,1825,1826],{},"InvalidArgumentException",". When present, ",[298,1829,1514],{}," overrides ",[298,1832,557],{},[298,1834,591],{}," inference.",[1119,1837,1839],{"id":1838},"apiresponse",[298,1840,1106],{},[289,1842,1843],{},"Documents a response by status. It is repeatable, and each attribute replaces the inferred or default entry for its status:",[307,1845,1847],{"className":660,"code":1846,"language":323,"meta":312,"style":312},"use Glueful\\Routing\\Attributes\\ApiResponse;\n\n#[ApiResponse(200, PostData::class)]                                   // {success, message, data: PostData}\n#[ApiResponse(200, PostData::class, collection: true)]                 // data: PostData[]\n#[ApiResponse(201, PostData::class, envelope: false)]                  // raw object, no envelope\n#[ApiResponse(404, description: 'Post not found')]                     // description only\n#[ApiResponse(200, contentType: 'application/pdf', body: 'binary')]   // file download\n#[ApiResponse(200, contentType: 'text/html', body: 'text')]           // HTML page\n",[298,1848,1849,1870,1874,1900,1936,1971,2003,2048],{"__ignoreMap":312},[316,1850,1851,1853,1855,1857,1859,1861,1863,1865,1868],{"class":318,"line":319},[316,1852,669],{"class":668},[316,1854,707],{"class":672},[316,1856,677],{"class":676},[316,1858,29],{"class":672},[316,1860,677],{"class":676},[316,1862,740],{"class":672},[316,1864,677],{"class":676},[316,1866,1867],{"class":689},"ApiResponse",[316,1869,724],{"class":685},[316,1871,1872],{"class":318,"line":702},[316,1873,754],{"emptyLinePlaceholder":753},[316,1875,1876,1878,1880,1882,1884,1886,1888,1890,1892,1894,1897],{"class":318,"line":727},[316,1877,1162],{"class":845},[316,1879,1867],{"class":672},[316,1881,835],{"class":685},[316,1883,1060],{"class":880},[316,1885,693],{"class":685},[316,1887,696],{"class":838},[316,1889,1577],{"class":850},[316,1891,1580],{"class":668},[316,1893,472],{"class":685},[316,1895,1896],{"class":845},"]                                   ",[316,1898,1899],{"class":788},"// {success, message, data: PostData}\n",[316,1901,1902,1904,1906,1908,1910,1912,1914,1916,1918,1920,1923,1925,1928,1930,1933],{"class":318,"line":750},[316,1903,1162],{"class":845},[316,1905,1867],{"class":672},[316,1907,835],{"class":685},[316,1909,1060],{"class":880},[316,1911,693],{"class":685},[316,1913,696],{"class":838},[316,1915,1577],{"class":850},[316,1917,1580],{"class":668},[316,1919,693],{"class":685},[316,1921,1922],{"class":1172}," collection",[316,1924,851],{"class":685},[316,1926,1927],{"class":1250}," true",[316,1929,472],{"class":685},[316,1931,1932],{"class":845},"]                 ",[316,1934,1935],{"class":788},"// data: PostData[]\n",[316,1937,1938,1940,1942,1944,1946,1948,1950,1952,1954,1956,1959,1961,1963,1965,1968],{"class":318,"line":757},[316,1939,1162],{"class":845},[316,1941,1867],{"class":672},[316,1943,835],{"class":685},[316,1945,881],{"class":880},[316,1947,693],{"class":685},[316,1949,696],{"class":838},[316,1951,1577],{"class":850},[316,1953,1580],{"class":668},[316,1955,693],{"class":685},[316,1957,1958],{"class":1172}," envelope",[316,1960,851],{"class":685},[316,1962,1251],{"class":1250},[316,1964,472],{"class":685},[316,1966,1967],{"class":845},"]                  ",[316,1969,1970],{"class":788},"// raw object, no envelope\n",[316,1972,1973,1975,1977,1979,1982,1984,1986,1988,1990,1993,1995,1997,2000],{"class":318,"line":779},[316,1974,1162],{"class":845},[316,1976,1867],{"class":672},[316,1978,835],{"class":685},[316,1980,1981],{"class":880},"404",[316,1983,693],{"class":685},[316,1985,1369],{"class":1172},[316,1987,851],{"class":685},[316,1989,1179],{"class":1178},[316,1991,1992],{"class":326},"Post not found",[316,1994,1185],{"class":1178},[316,1996,472],{"class":685},[316,1998,1999],{"class":845},"]                     ",[316,2001,2002],{"class":788},"// description only\n",[316,2004,2005,2007,2009,2011,2013,2015,2018,2020,2022,2025,2027,2029,2032,2034,2036,2038,2040,2042,2045],{"class":318,"line":785},[316,2006,1162],{"class":845},[316,2008,1867],{"class":672},[316,2010,835],{"class":685},[316,2012,1060],{"class":880},[316,2014,693],{"class":685},[316,2016,2017],{"class":1172}," contentType",[316,2019,851],{"class":685},[316,2021,1179],{"class":1178},[316,2023,2024],{"class":326},"application/pdf",[316,2026,1185],{"class":1178},[316,2028,693],{"class":685},[316,2030,2031],{"class":1172}," body",[316,2033,851],{"class":685},[316,2035,1179],{"class":1178},[316,2037,1744],{"class":326},[316,2039,1185],{"class":1178},[316,2041,472],{"class":685},[316,2043,2044],{"class":845},"]   ",[316,2046,2047],{"class":788},"// file download\n",[316,2049,2050,2052,2054,2056,2058,2060,2062,2064,2066,2069,2071,2073,2075,2077,2079,2082,2084,2086,2089],{"class":318,"line":822},[316,2051,1162],{"class":845},[316,2053,1867],{"class":672},[316,2055,835],{"class":685},[316,2057,1060],{"class":880},[316,2059,693],{"class":685},[316,2061,2017],{"class":1172},[316,2063,851],{"class":685},[316,2065,1179],{"class":1178},[316,2067,2068],{"class":326},"text/html",[316,2070,1185],{"class":1178},[316,2072,693],{"class":685},[316,2074,2031],{"class":1172},[316,2076,851],{"class":685},[316,2078,1179],{"class":1178},[316,2080,2081],{"class":326},"text",[316,2083,1185],{"class":1178},[316,2085,472],{"class":685},[316,2087,2088],{"class":845},"]           ",[316,2090,2091],{"class":788},"// HTML page\n",[289,2093,2094,2097,2098,372,2101,1521,2104,2107,2108,2110],{},[298,2095,2096],{},"body:"," accepts ",[298,2099,2100],{},"'binary'",[298,2102,2103],{},"'text'",[298,2105,2106],{},"'object'",", and is used only when ",[298,2109,1520],{}," is null.",[1119,2112,2114],{"id":2113},"precedence","Precedence",[389,2116,2117,2127],{},[392,2118,2119],{},[395,2120,2121,2124],{},[398,2122,2123],{},"For",[398,2125,2126],{},"Winner (highest first)",[405,2128,2129,2143,2163,2177],{},[395,2130,2131,2134],{},[410,2132,2133],{},"Request body",[410,2135,2136,985,2138,2140,2141],{},[298,2137,1514],{},[298,2139,557],{}," parameter → ",[298,2142,591],{},[395,2144,2145,2148],{},[410,2146,2147],{},"A response status",[410,2149,2150,2152,2153,372,2155,569,2157,372,2159,372,2161,472],{},[298,2151,1106],{}," → return-type inference → defaults (",[298,2154,1060],{},[298,2156,497],{},[298,2158,500],{},[298,2160,516],{},[298,2162,583],{},[395,2164,2165,2168],{},[410,2166,2167],{},"Query parameters",[410,2169,2170,985,2172,480,2174,2176],{},[298,2171,1299],{},[298,2173,579],{},[298,2175,541],{}," parameters",[395,2178,2179,2182],{},[410,2180,2181],{},"Summary, tags, operationId",[410,2183,2184,2185,2187],{},"Non-empty ",[298,2186,1124],{}," field → derived value",[384,2189,2191],{"id":2190},"generating-the-spec","Generating the Spec",[307,2193,2195],{"className":309,"code":2194,"language":311,"meta":312,"style":312},"php glueful generate:openapi              # asks for confirmation\nphp glueful generate:openapi -f           # no prompt (use in CI and scripts)\nphp glueful generate:openapi -f --ui      # also write the reference UI (default: scalar)\nphp glueful generate:openapi -f --ui=redoc\n",[298,2196,2197,2208,2221,2237],{"__ignoreMap":312},[316,2198,2199,2201,2203,2205],{"class":318,"line":319},[316,2200,323],{"class":322},[316,2202,327],{"class":326},[316,2204,330],{"class":326},[316,2206,2207],{"class":788},"              # asks for confirmation\n",[316,2209,2210,2212,2214,2216,2218],{"class":318,"line":702},[316,2211,323],{"class":322},[316,2213,327],{"class":326},[316,2215,330],{"class":326},[316,2217,334],{"class":333},[316,2219,2220],{"class":788},"           # no prompt (use in CI and scripts)\n",[316,2222,2223,2225,2227,2229,2231,2234],{"class":318,"line":727},[316,2224,323],{"class":322},[316,2226,327],{"class":326},[316,2228,330],{"class":326},[316,2230,334],{"class":333},[316,2232,2233],{"class":333}," --ui",[316,2235,2236],{"class":788},"      # also write the reference UI (default: scalar)\n",[316,2238,2239,2241,2243,2245,2247],{"class":318,"line":750},[316,2240,323],{"class":322},[316,2242,327],{"class":326},[316,2244,330],{"class":326},[316,2246,334],{"class":333},[316,2248,2249],{"class":333}," --ui=redoc\n",[389,2251,2252,2262],{},[392,2253,2254],{},[395,2255,2256,2259],{},[398,2257,2258],{},"Option",[398,2260,2261],{},"Effect",[405,2263,2264,2277,2303],{},[395,2265,2266,2274],{},[410,2267,2268,372,2271],{},[298,2269,2270],{},"-f",[298,2272,2273],{},"--force",[410,2275,2276],{},"Skip the confirmation prompt",[395,2278,2279,2287],{},[410,2280,2281,372,2284],{},[298,2282,2283],{},"-u",[298,2285,2286],{},"--ui[=TYPE]",[410,2288,2289,2290,372,2293,1521,2296,2299,2300,472],{},"Write the reference UI: ",[298,2291,2292],{},"scalar",[298,2294,2295],{},"swagger-ui",[298,2297,2298],{},"redoc"," (default from ",[298,2301,2302],{},"API_DOCS_UI",[395,2304,2305,2313],{},[410,2306,2307,372,2310],{},[298,2308,2309],{},"-c",[298,2311,2312],{},"--clean",[410,2314,2315,2316,437,2319,2322,2323,2326],{},"Delete the generated ",[298,2317,2318],{},"routes/",[298,2320,2321],{},"extensions/"," folders under ",[298,2324,2325],{},"docs/json-definitions/"," before generating; top-level hand-authored fragments are kept",[289,2328,2329,2330,441,2333,2335,2336,2339,2340,441,2343,2345,2346,2349,2350,2353],{},"The spec is written to ",[298,2331,2332],{},"documentation.paths.openapi",[298,2334,343],{},") and the UI to ",[298,2337,2338],{},"documentation.paths.output"," + ",[298,2341,2342],{},"documentation.ui.filename",[298,2344,347],{},"). When ",[298,2347,2348],{},"documentation.enabled"," is on (",[298,2351,2352],{},"API_DOCS_ENABLED",", default: on outside production), the app serves them at:",[943,2355,2356,2362],{},[946,2357,2358,2361],{},[298,2359,2360],{},"GET /api-docs",": the reference UI",[946,2363,2364,2367],{},[298,2365,2366],{},"GET /api-docs/openapi.json",": the spec",[289,2369,2370,2371,2374,2375,959],{},"Change the mount point with ",[298,2372,2373],{},"API_DOCS_PATH"," (for example ",[298,2376,2377],{},"API_DOCS_PATH=/docs",[384,2379,2381],{"id":2380},"route-origin-filtering","Route Origin Filtering",[289,2383,2384],{},"Every route is classified by its handler's namespace:",[389,2386,2387,2400],{},[392,2388,2389],{},[395,2390,2391,2394,2397],{},[398,2392,2393],{},"Origin",[398,2395,2396],{},"Handler namespace",[398,2398,2399],{},"Included when",[405,2401,2402,2415,2431],{},[395,2403,2404,2406,2412],{},[410,2405,807],{},[410,2407,2408,2411],{},[298,2409,2410],{},"App\\…",", or a closure",[410,2413,2414],{},"Always",[395,2416,2417,2420,2425],{},[410,2418,2419],{},"Framework",[410,2421,2422],{},[298,2423,2424],{},"Glueful\\…",[410,2426,2427,2430],{},[298,2428,2429],{},"API_DOCS_INCLUDE_FRAMEWORK_ROUTES=true"," (default)",[395,2432,2433,2436,2439],{},[410,2434,2435],{},"Extension",[410,2437,2438],{},"Anything else",[410,2440,2441,2444,2445,2430],{},[298,2442,2443],{},"documentation.options.include_extensions"," is ",[298,2446,2447],{},"true",[289,2449,2450],{},"To publish a spec of only your own API:",[307,2452,2456],{"className":2453,"code":2454,"language":2455,"meta":312,"style":312},"language-env shiki shiki-themes material-theme-lighter github-light github-dark monokai","API_DOCS_INCLUDE_FRAMEWORK_ROUTES=false\n","env",[298,2457,2458],{"__ignoreMap":312},[316,2459,2460],{"class":318,"line":319},[316,2461,2454],{},[289,2463,2464],{},"To trim by tag instead, use comma-separated allow/deny lists. Exclusions win:",[307,2466,2468],{"className":2453,"code":2467,"language":2455,"meta":312,"style":312},"API_DOCS_EXCLUDE_TAGS=Health,Documentation\nAPI_DOCS_INCLUDE_TAGS=\n",[298,2469,2470,2475],{"__ignoreMap":312},[316,2471,2472],{"class":318,"line":319},[316,2473,2474],{},"API_DOCS_EXCLUDE_TAGS=Health,Documentation\n",[316,2476,2477],{"class":318,"line":702},[316,2478,2479],{},"API_DOCS_INCLUDE_TAGS=\n",[289,2481,2482,2485],{},[298,2483,2484],{},"API_DOCS_PRUNE_UNREFERENCED_SCHEMAS=true"," drops built-in component schemas that no path references.",[384,2487,2489],{"id":2488},"hand-authored-fragments","Hand-Authored Fragments",[289,2491,2492,2493,2496,2497,2499,2500,2503,2504,437,2506,2508],{},"For an endpoint the generator can't see, place a JSON fragment at the ",[293,2494,2495],{},"top level"," of ",[298,2498,2325],{},". Every ",[298,2501,2502],{},"*.json"," file there is merged on each run. The ",[298,2505,2318],{},[298,2507,2321],{}," subdirectories are skipped, because they hold output from the removed comment generator.",[307,2510,2514],{"className":2511,"code":2512,"language":2513,"meta":312,"style":312},"language-json shiki shiki-themes material-theme-lighter github-light github-dark monokai","{\n  \"doc\": {\n    \"name\": \"reports/export\",\n    \"method\": \"POST\",\n    \"is_public\": false,\n    \"consumes\": [\"application/json\"],\n    \"fields\": [\n      { \"name\": \"from\", \"type\": \"date\", \"description\": \"Start date\", \"nullable\": false },\n      { \"name\": \"format\", \"type\": \"string\", \"description\": \"csv or xlsx\" }\n    ],\n    \"response\": { \"type\": \"object\", \"properties\": { \"url\": { \"type\": \"string\" } } }\n  }\n}\n","json",[298,2515,2516,2520,2538,2562,2581,2596,2617,2629,2700,2753,2757,2829,2834],{"__ignoreMap":312},[316,2517,2518],{"class":318,"line":319},[316,2519,782],{"class":685},[316,2521,2522,2526,2530,2533,2535],{"class":318,"line":702},[316,2523,2525],{"class":2524},"saDeg","  \"",[316,2527,2529],{"class":2528},"sEff5","doc",[316,2531,2532],{"class":2524},"\"",[316,2534,851],{"class":685},[316,2536,2537],{"class":685}," {\n",[316,2539,2540,2543,2546,2548,2550,2554,2558,2560],{"class":318,"line":727},[316,2541,2542],{"class":2524},"    \"",[316,2544,2545],{"class":838},"name",[316,2547,2532],{"class":2524},[316,2549,851],{"class":685},[316,2551,2553],{"class":2552},"sh1VR"," \"",[316,2555,2557],{"class":2556},"sINAO","reports/export",[316,2559,2532],{"class":2552},[316,2561,1188],{"class":685},[316,2563,2564,2566,2569,2571,2573,2575,2577,2579],{"class":318,"line":750},[316,2565,2542],{"class":2524},[316,2567,2568],{"class":838},"method",[316,2570,2532],{"class":2524},[316,2572,851],{"class":685},[316,2574,2553],{"class":2552},[316,2576,931],{"class":2556},[316,2578,2532],{"class":2552},[316,2580,1188],{"class":685},[316,2582,2583,2585,2588,2590,2592,2594],{"class":318,"line":757},[316,2584,2542],{"class":2524},[316,2586,2587],{"class":838},"is_public",[316,2589,2532],{"class":2524},[316,2591,851],{"class":685},[316,2593,1251],{"class":1250},[316,2595,1188],{"class":685},[316,2597,2598,2600,2603,2605,2607,2609,2611,2613,2615],{"class":318,"line":779},[316,2599,2542],{"class":2524},[316,2601,2602],{"class":838},"consumes",[316,2604,2532],{"class":2524},[316,2606,851],{"class":685},[316,2608,1214],{"class":685},[316,2610,2532],{"class":2552},[316,2612,1822],{"class":2556},[316,2614,2532],{"class":2552},[316,2616,1224],{"class":685},[316,2618,2619,2621,2623,2625,2627],{"class":318,"line":785},[316,2620,2542],{"class":2524},[316,2622,546],{"class":838},[316,2624,2532],{"class":2524},[316,2626,851],{"class":685},[316,2628,1669],{"class":685},[316,2630,2631,2634,2636,2639,2641,2643,2645,2648,2650,2652,2654,2656,2658,2660,2662,2664,2666,2668,2670,2673,2675,2677,2679,2682,2684,2686,2688,2691,2693,2695,2697],{"class":318,"line":822},[316,2632,2633],{"class":685},"      {",[316,2635,2553],{"class":2524},[316,2637,2545],{"class":2638},"sTC9v",[316,2640,2532],{"class":2524},[316,2642,851],{"class":685},[316,2644,2553],{"class":2552},[316,2646,2647],{"class":2556},"from",[316,2649,2532],{"class":2552},[316,2651,693],{"class":685},[316,2653,2553],{"class":2524},[316,2655,1677],{"class":2638},[316,2657,2532],{"class":2524},[316,2659,851],{"class":685},[316,2661,2553],{"class":2552},[316,2663,984],{"class":2556},[316,2665,2532],{"class":2552},[316,2667,693],{"class":685},[316,2669,2553],{"class":2524},[316,2671,2672],{"class":2638},"description",[316,2674,2532],{"class":2524},[316,2676,851],{"class":685},[316,2678,2553],{"class":2552},[316,2680,2681],{"class":2556},"Start date",[316,2683,2532],{"class":2552},[316,2685,693],{"class":685},[316,2687,2553],{"class":2524},[316,2689,2690],{"class":2638},"nullable",[316,2692,2532],{"class":2524},[316,2694,851],{"class":685},[316,2696,1251],{"class":1250},[316,2698,2699],{"class":685}," },\n",[316,2701,2702,2704,2706,2708,2710,2712,2714,2716,2718,2720,2722,2724,2726,2728,2730,2732,2734,2736,2738,2740,2742,2744,2746,2749,2751],{"class":318,"line":865},[316,2703,2633],{"class":685},[316,2705,2553],{"class":2524},[316,2707,2545],{"class":2638},[316,2709,2532],{"class":2524},[316,2711,851],{"class":685},[316,2713,2553],{"class":2552},[316,2715,988],{"class":2556},[316,2717,2532],{"class":2552},[316,2719,693],{"class":685},[316,2721,2553],{"class":2524},[316,2723,1677],{"class":2638},[316,2725,2532],{"class":2524},[316,2727,851],{"class":685},[316,2729,2553],{"class":2552},[316,2731,1274],{"class":2556},[316,2733,2532],{"class":2552},[316,2735,693],{"class":685},[316,2737,2553],{"class":2524},[316,2739,2672],{"class":2638},[316,2741,2532],{"class":2524},[316,2743,851],{"class":685},[316,2745,2553],{"class":2552},[316,2747,2748],{"class":2556},"csv or xlsx",[316,2750,2532],{"class":2552},[316,2752,862],{"class":685},[316,2754,2755],{"class":318,"line":870},[316,2756,1776],{"class":685},[316,2758,2759,2761,2764,2766,2768,2770,2772,2774,2776,2778,2780,2782,2784,2786,2788,2790,2792,2794,2796,2798,2801,2803,2805,2807,2809,2812,2814,2816,2818,2820,2822,2825,2827],{"class":318,"line":889},[316,2760,2542],{"class":2524},[316,2762,2763],{"class":838},"response",[316,2765,2532],{"class":2524},[316,2767,851],{"class":685},[316,2769,856],{"class":685},[316,2771,2553],{"class":2524},[316,2773,1677],{"class":2638},[316,2775,2532],{"class":2524},[316,2777,851],{"class":685},[316,2779,2553],{"class":2552},[316,2781,1687],{"class":2556},[316,2783,2532],{"class":2552},[316,2785,693],{"class":685},[316,2787,2553],{"class":2524},[316,2789,1698],{"class":2638},[316,2791,2532],{"class":2524},[316,2793,851],{"class":685},[316,2795,856],{"class":685},[316,2797,2553],{"class":2524},[316,2799,981],{"class":2800},"sogGa",[316,2802,2532],{"class":2524},[316,2804,851],{"class":685},[316,2806,856],{"class":685},[316,2808,2553],{"class":2524},[316,2810,1677],{"class":2811},"s_i0N",[316,2813,2532],{"class":2524},[316,2815,851],{"class":685},[316,2817,2553],{"class":2552},[316,2819,1274],{"class":2556},[316,2821,2532],{"class":2552},[316,2823,2824],{"class":685}," }",[316,2826,2824],{"class":685},[316,2828,862],{"class":685},[316,2830,2831],{"class":318,"line":920},[316,2832,2833],{"class":685},"  }\n",[316,2835,2836],{"class":318,"line":1752},[316,2837,923],{"class":685},[289,2839,2840,2841,2844,2845,2847,2848,2851,2852,2854,2855,2857,2858,2860],{},"The fragment becomes ",[298,2842,2843],{},"POST /reports/export"," with a request schema built from ",[298,2846,546],{}," (a field with ",[298,2849,2850],{},"\"nullable\": false"," is required) and, when ",[298,2853,2763],{}," is given, a ",[298,2856,1060],{}," response using that schema. Non-public fragments get the ",[298,2859,479],{}," security scheme.",[289,2862,2863,2865,2866,437,2868,2870,2871,959],{},[298,2864,2312],{}," removes only the generated ",[298,2867,2318],{},[298,2869,2321],{}," folders, so top-level fragments survive it (since 1.91; earlier versions deleted every file under ",[298,2872,2325],{},[384,2874,137],{"id":2875},"configuration",[289,2877,2878,2879,851],{},"Settings live in ",[298,2880,2881],{},"config/documentation.php",[389,2883,2884,2897],{},[392,2885,2886],{},[395,2887,2888,2891,2894],{},[398,2889,2890],{},"Key",[398,2892,2893],{},"Env",[398,2895,2896],{},"Default",[405,2898,2899,2916,2940,2970,2987,3002,3025,3044,3065,3080,3095,3112],{},[395,2900,2901,2906,2910],{},[410,2902,2903],{},[298,2904,2905],{},"enabled",[410,2907,2908],{},[298,2909,2352],{},[410,2911,2912,2913],{},"on unless ",[298,2914,2915],{},"APP_ENV=production",[395,2917,2918,2923,2928],{},[410,2919,2920],{},[298,2921,2922],{},"openapi_version",[410,2924,2925],{},[298,2926,2927],{},"OPENAPI_VERSION",[410,2929,2930,2933,2934,372,2937,472],{},[298,2931,2932],{},"3.1.0"," (also ",[298,2935,2936],{},"3.0.0",[298,2938,2939],{},"3.0.3",[395,2941,2942,2953,2964],{},[410,2943,2944,480,2947,480,2950],{},[298,2945,2946],{},"info.title",[298,2948,2949],{},"info.description",[298,2951,2952],{},"info.version",[410,2954,2955,372,2958,372,2961],{},[298,2956,2957],{},"API_TITLE",[298,2959,2960],{},"API_DESCRIPTION",[298,2962,2963],{},"API_VERSION",[410,2965,2966,2967],{},"app name / generic / ",[298,2968,2969],{},"1.0.0",[395,2971,2972,2977,2982],{},[410,2973,2974],{},[298,2975,2976],{},"servers.0.url",[410,2978,2979],{},[298,2980,2981],{},"API_SERVER_URL",[410,2983,2984],{},[298,2985,2986],{},"APP_URL",[395,2988,2989,2994,2998],{},[410,2990,2991],{},[298,2992,2993],{},"route_prefix",[410,2995,2996],{},[298,2997,2373],{},[410,2999,3000],{},[298,3001,351],{},[395,3003,3004,3009,3012],{},[410,3005,3006],{},[298,3007,3008],{},"security_schemes",[410,3010,3011],{},"—",[410,3013,3014,3017,3018,441,3021,3024],{},[298,3015,3016],{},"BearerAuth"," (JWT), ",[298,3019,3020],{},"ApiKeyAuth",[298,3022,3023],{},"X-API-Key"," header)",[395,3026,3027,3032,3034],{},[410,3028,3029],{},[298,3030,3031],{},"middleware_map",[410,3033,3011],{},[410,3035,3036,985,3038,372,3040,985,3042],{},[298,3037,479],{},[298,3039,3016],{},[298,3041,483],{},[298,3043,3020],{},[395,3045,3046,3051,3056],{},[410,3047,3048],{},[298,3049,3050],{},"errors.schema",[410,3052,3053],{},[298,3054,3055],{},"API_DOCS_ERROR_SCHEMA",[410,3057,3058,3061,3062,472],{},[298,3059,3060],{},"null"," (inline ",[298,3063,3064],{},"{success, message}",[395,3066,3067,3072,3074],{},[410,3068,3069],{},[298,3070,3071],{},"errors.always",[410,3073,3011],{},[410,3075,3076,3079],{},[298,3077,3078],{},"[]",": extra error statuses on every operation",[395,3081,3082,3087,3091],{},[410,3083,3084],{},[298,3085,3086],{},"ui.default",[410,3088,3089],{},[298,3090,2302],{},[410,3092,3093],{},[298,3094,2292],{},[395,3096,3097,3102,3107],{},[410,3098,3099],{},[298,3100,3101],{},"options.include_resource_routes",[410,3103,3104],{},[298,3105,3106],{},"API_DOCS_INCLUDE_RESOURCE_ROUTES",[410,3108,3109],{},[298,3110,3111],{},"false",[395,3113,3114,3119,3121],{},[410,3115,3116],{},[298,3117,3118],{},"webhooks",[410,3120,3011],{},[410,3122,3123,3125,3126,3128],{},[298,3124,3078],{},": events emitted into the OpenAPI ",[298,3127,3118],{}," object",[289,3130,3131,3132,3134,3135,3138,3139,3142,3143,3145,3146,3149,3150,959],{},"Map your own middleware to a scheme by adding to ",[298,3133,3031],{},", for example ",[298,3136,3137],{},"'auth_session' => ['BearerAuth']",". Webhook entries (",[298,3140,3141],{},"'order.paid' => ['summary' => ..., 'payload_schema' => 'Order']",") document what ",[655,3144,3118],{"href":126}," send; the documented signature header is ",[298,3147,3148],{},"api.webhooks.signature_header"," (default ",[298,3151,3152],{},"X-Webhook-Signature",[384,3154,3156],{"id":3155},"generating-clients","Generating Clients",[289,3158,3159,3162,3163,3166,3167,3170],{},[298,3160,3161],{},"generate:client"," builds the command for an off-the-shelf code generator: ",[298,3164,3165],{},"openapi-typescript"," for TypeScript, ",[298,3168,3169],{},"openapi-generator-cli"," for every other language. By default it only prints the command:",[307,3172,3174],{"className":309,"code":3173,"language":311,"meta":312,"style":312},"php glueful generate:client typescript --spec=docs/openapi.json -o ./sdk           # prints the command\nphp glueful generate:client python --spec=docs/openapi.json -o ./sdk/python --execute\n",[298,3175,3176,3200],{"__ignoreMap":312},[316,3177,3178,3180,3182,3185,3188,3191,3194,3197],{"class":318,"line":319},[316,3179,323],{"class":322},[316,3181,327],{"class":326},[316,3183,3184],{"class":326}," generate:client",[316,3186,3187],{"class":326}," typescript",[316,3189,3190],{"class":333}," --spec=docs/openapi.json",[316,3192,3193],{"class":333}," -o",[316,3195,3196],{"class":326}," ./sdk",[316,3198,3199],{"class":788},"           # prints the command\n",[316,3201,3202,3204,3206,3208,3211,3213,3215,3218],{"class":318,"line":702},[316,3203,323],{"class":322},[316,3205,327],{"class":326},[316,3207,3184],{"class":326},[316,3209,3210],{"class":326}," python",[316,3212,3190],{"class":333},[316,3214,3193],{"class":333},[316,3216,3217],{"class":326}," ./sdk/python",[316,3219,3220],{"class":333}," --execute\n",[389,3222,3223,3231],{},[392,3224,3225],{},[395,3226,3227,3229],{},[398,3228,2258],{},[398,3230,2896],{},[405,3232,3233,3264,3277,3297],{},[395,3234,3235,3241],{},[410,3236,3237,3240],{},[298,3238,3239],{},"language"," (argument)",[410,3242,3243,569,3246,3249,3250,3253,3254,372,3257,372,3260,3263],{},[298,3244,3245],{},"typescript",[298,3247,3248],{},"ts",", or any ",[298,3251,3252],{},"openapi-generator"," target (",[298,3255,3256],{},"python",[298,3258,3259],{},"go",[298,3261,3262],{},"java",", …)",[395,3265,3266,3271],{},[410,3267,3268],{},[298,3269,3270],{},"--spec",[410,3272,3273,3276],{},[298,3274,3275],{},"openapi.json"," (relative to the current directory)",[395,3278,3279,3287],{},[410,3280,3281,372,3284],{},[298,3282,3283],{},"-o",[298,3285,3286],{},"--output",[410,3288,3289,3292,3293,3296],{},[298,3290,3291],{},"./generated","; TypeScript writes ",[298,3294,3295],{},"api.d.ts"," there",[395,3298,3299,3304],{},[410,3300,3301],{},[298,3302,3303],{},"--execute",[410,3305,3306],{},"Run the command instead of printing it",[289,3308,3309],{},"The generator tool must be installed separately.",[384,3311,3313],{"id":3312},"next-steps","Next Steps",[943,3315,3316,3321,3326,3331],{},[946,3317,3318,3320],{},[655,3319,33],{"href":34},": the DTOs the generator reflects",[946,3322,3323,3325],{},[655,3324,57],{"href":58},": rule strings that become schema constraints",[946,3327,3328,3330],{},[655,3329,29],{"href":30},": route names, constraints and attributes",[946,3332,3333,3336,3337,3339,3340],{},[655,3334,3335],{"href":78},"API Keys",": the ",[298,3338,3020],{}," scheme and ",[298,3341,531],{},[3343,3344,3345],"style",{},"html pre.shiki code .sR7ES, html code.shiki .sR7ES{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .sLACW, html code.shiki .sLACW{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .sFhLe, html code.shiki .sFhLe{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html pre.shiki code .shWJe, html code.shiki .shWJe{--shiki-light:#F76D47;--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .s91G_, html code.shiki .s91G_{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#F8F8F2}html pre.shiki code .sv8o3, html code.shiki .sv8o3{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#F8F8F2}html pre.shiki code .swvn1, html code.shiki .swvn1{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .seZir, html code.shiki .seZir{--shiki-light:#90A4AE;--shiki-light-font-style:inherit;--shiki-default:#005CC5;--shiki-default-font-style:inherit;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .sTNss, html code.shiki .sTNss{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .srJo8, html code.shiki .srJo8{--shiki-light:#9C3EDA;--shiki-light-font-style:inherit;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .sKvfc, html code.shiki .sKvfc{--shiki-light:#E2931D;--shiki-light-text-decoration:inherit;--shiki-default:#6F42C1;--shiki-default-text-decoration:inherit;--shiki-dark:#B392F0;--shiki-dark-text-decoration:inherit;--shiki-sepia:#A6E22E;--shiki-sepia-text-decoration:underline}html pre.shiki code .sW3Pz, html code.shiki .sW3Pz{--shiki-light:#E2931D;--shiki-light-font-style:inherit;--shiki-light-text-decoration:inherit;--shiki-default:#6F42C1;--shiki-default-font-style:inherit;--shiki-default-text-decoration:inherit;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit;--shiki-dark-text-decoration:inherit;--shiki-sepia:#A6E22E;--shiki-sepia-font-style:italic;--shiki-sepia-text-decoration:underline}html pre.shiki code .ss7Ak, html code.shiki .ss7Ak{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit;--shiki-sepia:#88846F;--shiki-sepia-font-style:inherit}html pre.shiki code .s41CE, html code.shiki .s41CE{--shiki-light:#F76D47;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#F92672;--shiki-sepia-font-style:inherit}html pre.shiki code .s6MXs, html code.shiki .s6MXs{--shiki-light:#E2931D;--shiki-light-font-style:italic;--shiki-default:#005CC5;--shiki-default-font-style:inherit;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .smtk4, html code.shiki .smtk4{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#005CC5;--shiki-default-font-style:inherit;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit;--shiki-sepia:#88846F;--shiki-sepia-font-style:inherit}html pre.shiki code .sWXFY, html code.shiki .sWXFY{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#005CC5;--shiki-default-font-style:inherit;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit;--shiki-sepia:#88846F;--shiki-sepia-font-style:inherit}html pre.shiki code .sD0ED, html code.shiki .sD0ED{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .s_MOj, html code.shiki .s_MOj{--shiki-light:#E2931D;--shiki-light-font-style:inherit;--shiki-default:#005CC5;--shiki-default-font-style:inherit;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .ss--_, html code.shiki .ss--_{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sGXK2, html code.shiki .sGXK2{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sYThS, html code.shiki .sYThS{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .sQqfL, html code.shiki .sQqfL{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#F8F8F2}html pre.shiki code .siCPE, html code.shiki .siCPE{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .sMTiH, html code.shiki .sMTiH{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .saDeg, html code.shiki .saDeg{--shiki-light:#39ADB5;--shiki-light-font-style:inherit;--shiki-default:#005CC5;--shiki-default-font-style:inherit;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .sEff5, html code.shiki .sEff5{--shiki-light:#9C3EDA;--shiki-light-font-style:inherit;--shiki-default:#005CC5;--shiki-default-font-style:inherit;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .sh1VR, html code.shiki .sh1VR{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#CFCFC2}html pre.shiki code .sINAO, html code.shiki .sINAO{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#CFCFC2}html pre.shiki code .sTC9v, html code.shiki .sTC9v{--shiki-light:#F76D47;--shiki-light-font-style:inherit;--shiki-default:#005CC5;--shiki-default-font-style:inherit;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .sogGa, html code.shiki .sogGa{--shiki-light:#E53935;--shiki-light-font-style:inherit;--shiki-default:#005CC5;--shiki-default-font-style:inherit;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .s_i0N, html code.shiki .s_i0N{--shiki-light:#916B53;--shiki-light-font-style:inherit;--shiki-default:#005CC5;--shiki-default-font-style:inherit;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}",{"title":312,"searchDepth":319,"depth":702,"links":3347},[3348,3349,3350,3357,3358,3359,3360,3361,3362],{"id":386,"depth":702,"text":387},{"id":649,"depth":702,"text":650},{"id":1109,"depth":702,"text":1110,"children":3351},[3352,3353,3354,3355,3356],{"id":1121,"depth":727,"text":1124},{"id":1296,"depth":727,"text":1299},{"id":1511,"depth":727,"text":1514},{"id":1838,"depth":727,"text":1106},{"id":2113,"depth":727,"text":2114},{"id":2190,"depth":702,"text":2191},{"id":2380,"depth":702,"text":2381},{"id":2488,"depth":702,"text":2489},{"id":2875,"depth":702,"text":137},{"id":3155,"depth":702,"text":3156},{"id":3312,"depth":702,"text":3313},"Generate an OpenAPI 3.1 spec from your live routes and PHP types, add the gaps with a few attributes, and serve it with an interactive reference UI.","md",null,{},{"title":149,"description":3363},"elxV6dSwFwQiHPDkGrVi03cmR9u19C5AlCxvgMgIkrE",[3370,3372],{"title":145,"path":146,"stem":147,"description":3371,"children":-1},"The middleware pipeline — applying middleware, ordering, the built-in alias catalog, and the PSR-15 bridge.",{"title":153,"path":154,"stem":155,"description":3373,"children":-1},"Optimize your Glueful application for production",1793709790908]