[{"data":1,"prerenderedAt":2048},["ShallowReactive",2],{"navigation":3,"\u002Fapi\u002Fconsole-commands":358,"\u002Fapi\u002Fconsole-commands-surround":2043},[4,14,36,69,140,341],{"title":5,"path":6,"stem":7,"children":8},"Introduction","\u002Fgetting-started","1.getting-started\u002F1.index",[9,10],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation",{"title":15,"path":16,"stem":17,"children":18,"page":35},"Guides","\u002Fguides","2.guides",[19,23,27,31],{"title":20,"path":21,"stem":22},"Your First Layout","\u002Fguides\u002Fyour-first-layout","2.guides\u002F1.your-first-layout",{"title":24,"path":25,"stem":26},"Your First Page Template","\u002Fguides\u002Fyour-first-page-template","2.guides\u002F2.your-first-page-template",{"title":28,"path":29,"stem":30},"Your First Component","\u002Fguides\u002Fyour-first-component","2.guides\u002F3.your-first-component",{"title":32,"path":33,"stem":34},"Alternative UI Variants","\u002Fguides\u002Falternative-ui-variants","2.guides\u002F4.alternative-ui-variants",false,{"title":37,"path":38,"stem":39,"children":40,"page":35},"Core Concepts","\u002Fcore-concepts","3.core-concepts",[41,45,49,53,57,61,65],{"title":42,"path":43,"stem":44},"How It All Works","\u002Fcore-concepts\u002Farchitecture","3.core-concepts\u002F1.architecture",{"title":46,"path":47,"stem":48},"The Data Model","\u002Fcore-concepts\u002Fthe-data-model","3.core-concepts\u002F2.the-data-model",{"title":50,"path":51,"stem":52},"Layouts & Pages","\u002Fcore-concepts\u002Flayouts-and-pages","3.core-concepts\u002F3.layouts-and-pages",{"title":54,"path":55,"stem":56},"Dynamic Pages","\u002Fcore-concepts\u002Fdynamic-pages","3.core-concepts\u002F4.dynamic-pages",{"title":58,"path":59,"stem":60},"Components","\u002Fcore-concepts\u002Fcomponents","3.core-concepts\u002F5.components",{"title":62,"path":63,"stem":64},"Draft & Publish Workflow","\u002Fcore-concepts\u002Fdraft-and-publish","3.core-concepts\u002F6.draft-and-publish",{"title":66,"path":67,"stem":68},"The Admin Panel","\u002Fcore-concepts\u002Fadmin-panel","3.core-concepts\u002F7.admin-panel",{"title":70,"path":71,"stem":72,"children":73,"page":35},"Api","\u002Fapi","4.api",[74,78,116,120,124,128,132,136],{"title":75,"path":76,"stem":77},"Bundle Setup","\u002Fapi\u002Fbundle-setup","4.api\u002F1.bundle-setup",{"title":58,"path":79,"stem":80,"children":81,"page":35},"\u002Fapi\u002Fcomponents","4.api\u002F2.components",[82,86,103],{"title":83,"path":84,"stem":85},"Creating Components","\u002Fapi\u002Fcomponents\u002Fcreating-components","4.api\u002F2.components\u002F1.creating-components",{"title":87,"path":88,"stem":89,"children":90,"page":35},"Annotations","\u002Fapi\u002Fcomponents\u002Fannotations","4.api\u002F2.components\u002F2.annotations",[91,95,99],{"title":92,"path":93,"stem":94},"Publishable","\u002Fapi\u002Fcomponents\u002Fannotations\u002Fpublishable","4.api\u002F2.components\u002F2.annotations\u002F1.publishable",{"title":96,"path":97,"stem":98},"Uploadable","\u002Fapi\u002Fcomponents\u002Fannotations\u002Fuploadable","4.api\u002F2.components\u002F2.annotations\u002F2.uploadable",{"title":100,"path":101,"stem":102},"Timestamped","\u002Fapi\u002Fcomponents\u002Fannotations\u002Ftimestamped","4.api\u002F2.components\u002F2.annotations\u002F3.timestamped",{"title":104,"path":105,"stem":106,"children":107,"page":35},"Built Ins","\u002Fapi\u002Fcomponents\u002Fbuilt-ins","4.api\u002F2.components\u002F3.built-ins",[108,112],{"title":109,"path":110,"stem":111},"Collection Component","\u002Fapi\u002Fcomponents\u002Fbuilt-ins\u002Fcollection-component","4.api\u002F2.components\u002F3.built-ins\u002F1.collection-component",{"title":113,"path":114,"stem":115},"Form Component","\u002Fapi\u002Fcomponents\u002Fbuilt-ins\u002Fform-component","4.api\u002F2.components\u002F3.built-ins\u002F2.form-component",{"title":117,"path":118,"stem":119},"Dynamic & Nested Pages","\u002Fapi\u002Fdynamic-pages","4.api\u002F3.dynamic-pages",{"title":121,"path":122,"stem":123},"Users & Security","\u002Fapi\u002Fusers-and-security","4.api\u002F4.users-and-security",{"title":125,"path":126,"stem":127},"Data Fixtures","\u002Fapi\u002Fdata-fixtures","4.api\u002F5.data-fixtures",{"title":129,"path":130,"stem":131},"Configuration Reference","\u002Fapi\u002Fconfiguration","4.api\u002F6.configuration",{"title":133,"path":134,"stem":135},"Console Commands","\u002Fapi\u002Fconsole-commands","4.api\u002F7.console-commands",{"title":137,"path":138,"stem":139},"Debugging & Profiler","\u002Fapi\u002Fdebugging","4.api\u002F8.debugging",{"title":141,"path":142,"stem":143,"children":144,"page":35},"Nuxt Module","\u002Fnuxt-module","5.nuxt-module",[145,149,162,182,207,211,295,320,324],{"title":146,"path":147,"stem":148},"Module Setup","\u002Fnuxt-module\u002Fmodule-setup","5.nuxt-module\u002F1.module-setup",{"title":150,"path":151,"stem":152,"children":153,"page":35},"Configuration","\u002Fnuxt-module\u002Fconfiguration","5.nuxt-module\u002F2.configuration",[154,158],{"title":155,"path":156,"stem":157},"Nuxt Config","\u002Fnuxt-module\u002Fconfiguration\u002Fnuxt-config","5.nuxt-module\u002F2.configuration\u002F1.nuxt-config",{"title":159,"path":160,"stem":161},"Site Config & SEO","\u002Fnuxt-module\u002Fconfiguration\u002Fsite-config-and-seo","5.nuxt-module\u002F2.configuration\u002F2.site-config-and-seo",{"title":163,"path":164,"stem":165,"children":166,"page":35},"Building Your Ui","\u002Fnuxt-module\u002Fbuilding-your-ui","5.nuxt-module\u002F3.building-your-ui",[167,171,175,178],{"title":168,"path":169,"stem":170},"Layouts","\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcreating-layouts","5.nuxt-module\u002F3.building-your-ui\u002F1.creating-layouts",{"title":172,"path":173,"stem":174},"Page Templates","\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcreating-page-templates","5.nuxt-module\u002F3.building-your-ui\u002F2.creating-page-templates",{"title":83,"path":176,"stem":177},"\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcreating-components","5.nuxt-module\u002F3.building-your-ui\u002F3.creating-components",{"title":179,"path":180,"stem":181},"CLI Generator","\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcwa-cli","5.nuxt-module\u002F3.building-your-ui\u002F4.cwa-cli",{"title":183,"path":184,"stem":185,"children":186,"page":35},"Cwa Components","\u002Fnuxt-module\u002Fcwa-components","5.nuxt-module\u002F4.cwa-components",[187,191,195,199,203],{"title":188,"path":189,"stem":190},"\u003CCwaComponentGroup \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-component-group","5.nuxt-module\u002F4.cwa-components\u002F1.cwa-component-group",{"title":192,"path":193,"stem":194},"\u003CCwaPage \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-page","5.nuxt-module\u002F4.cwa-components\u002F2.cwa-page",{"title":196,"path":197,"stem":198},"\u003CCwaLink \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-link","5.nuxt-module\u002F4.cwa-components\u002F3.cwa-link",{"title":200,"path":201,"stem":202},"\u003CCwaImage \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-image","5.nuxt-module\u002F4.cwa-components\u002F4.cwa-image",{"title":204,"path":205,"stem":206},"\u003CCwaDefaultLayout \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-default-layout","5.nuxt-module\u002F4.cwa-components\u002F5.cwa-default-layout",{"title":208,"path":209,"stem":210},"The useCwa() API","\u002Fnuxt-module\u002Fcwa-api","5.nuxt-module\u002F5.cwa-api",{"title":212,"path":213,"stem":214,"children":215,"page":35},"Composables","\u002Fnuxt-module\u002Fcomposables","5.nuxt-module\u002F6.composables",[216,224,261,278],{"title":217,"path":218,"stem":219,"children":220,"page":35},"Layout","\u002Fnuxt-module\u002Fcomposables\u002Flayout","5.nuxt-module\u002F6.composables\u002F0.layout",[221],{"title":217,"path":222,"stem":223},"\u002Fnuxt-module\u002Fcomposables\u002Flayout\u002Fuse-cwa-layout","5.nuxt-module\u002F6.composables\u002F0.layout\u002F1.use-cwa-layout",{"title":225,"path":226,"stem":227,"children":228,"page":35},"Component","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent","5.nuxt-module\u002F6.composables\u002F1.component",[229,233,237,241,245,249,253,257],{"title":230,"path":231,"stem":232},"Component (recommended)","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-component","5.nuxt-module\u002F6.composables\u002F1.component\u002F0.use-cwa-component",{"title":234,"path":235,"stem":236},"Resource","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-resource","5.nuxt-module\u002F6.composables\u002F1.component\u002F1.use-cwa-resource",{"title":238,"path":239,"stem":240},"Collection Resource","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-collection-resource","5.nuxt-module\u002F6.composables\u002F1.component\u002F2.use-cwa-collection-resource",{"title":242,"path":243,"stem":244},"Image Resource","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-image-resource","5.nuxt-module\u002F6.composables\u002F1.component\u002F3.use-cwa-image-resource",{"title":246,"path":247,"stem":248},"Form","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-form","5.nuxt-module\u002F6.composables\u002F1.component\u002F4.use-cwa-form",{"title":250,"path":251,"stem":252},"Form Input","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-form-input","5.nuxt-module\u002F6.composables\u002F1.component\u002F5.use-cwa-form-input",{"title":254,"path":255,"stem":256},"Form Repeated","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-form-repeated","5.nuxt-module\u002F6.composables\u002F1.component\u002F6.use-cwa-form-repeated",{"title":258,"path":259,"stem":260},"Form Collection","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-form-collection","5.nuxt-module\u002F6.composables\u002F1.component\u002F7.use-cwa-form-collection",{"title":262,"path":263,"stem":264,"children":265,"page":35},"Admin Manager","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager","5.nuxt-module\u002F6.composables\u002F2.admin-manager",[266,270,274],{"title":267,"path":268,"stem":269},"Manager Tab","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager\u002Fuse-cwa-resource-manager-tab","5.nuxt-module\u002F6.composables\u002F2.admin-manager\u002F1.use-cwa-resource-manager-tab",{"title":271,"path":272,"stem":273},"Resource Model","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager\u002Fuse-cwa-resource-model","5.nuxt-module\u002F6.composables\u002F2.admin-manager\u002F2.use-cwa-resource-model",{"title":275,"path":276,"stem":277},"Resource Upload","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager\u002Fuse-cwa-resource-upload","5.nuxt-module\u002F6.composables\u002F2.admin-manager\u002F3.use-cwa-resource-upload",{"title":279,"path":280,"stem":281,"children":282,"page":35},"Utilities","\u002Fnuxt-module\u002Fcomposables\u002Futilities","5.nuxt-module\u002F6.composables\u002F3.utilities",[283,287,291],{"title":284,"path":285,"stem":286},"Resource Endpoint","\u002Fnuxt-module\u002Fcomposables\u002Futilities\u002Fuse-cwa-resource-endpoint","5.nuxt-module\u002F6.composables\u002F3.utilities\u002F1.use-cwa-resource-endpoint",{"title":288,"path":289,"stem":290},"Query Model","\u002Fnuxt-module\u002Fcomposables\u002Futilities\u002Fuse-query-bound-model","5.nuxt-module\u002F6.composables\u002F3.utilities\u002F2.use-query-bound-model",{"title":292,"path":293,"stem":294},"Resource Route","\u002Fnuxt-module\u002Fcomposables\u002Futilities\u002Fuse-cwa-resource-route","5.nuxt-module\u002F6.composables\u002F3.utilities\u002F3.use-cwa-resource-route",{"title":296,"path":297,"stem":298,"children":299,"page":35},"Component Helpers","\u002Fnuxt-module\u002Fcomponent-helpers","5.nuxt-module\u002F7.component-helpers",[300,304,308,312,316],{"title":301,"path":302,"stem":303},"Images & Media","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fimages-and-uploads","5.nuxt-module\u002F7.component-helpers\u002F1.images-and-uploads",{"title":305,"path":306,"stem":307},"Collections & Pagination","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fcollections-and-pagination","5.nuxt-module\u002F7.component-helpers\u002F2.collections-and-pagination",{"title":309,"path":310,"stem":311},"HTML Content","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fhtml-content","5.nuxt-module\u002F7.component-helpers\u002F3.html-content",{"title":313,"path":314,"stem":315},"Real-Time Updates","\u002Fnuxt-module\u002Fcomponent-helpers\u002Freal-time-updates","5.nuxt-module\u002F7.component-helpers\u002F4.real-time-updates",{"title":317,"path":318,"stem":319},"Forms","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fforms","5.nuxt-module\u002F7.component-helpers\u002F5.forms",{"title":321,"path":322,"stem":323},"Authentication","\u002Fnuxt-module\u002Fauthentication","5.nuxt-module\u002F8.authentication",{"title":325,"path":326,"stem":327,"children":328,"page":35},"Cwa Layer","\u002Fnuxt-module\u002Fcwa-layer","5.nuxt-module\u002F9.cwa-layer",[329,333,337],{"title":330,"path":331,"stem":332},"Overview","\u002Fnuxt-module\u002Fcwa-layer\u002Foverview","5.nuxt-module\u002F9.cwa-layer\u002F1.overview",{"title":334,"path":335,"stem":336},"Auth Pages","\u002Fnuxt-module\u002Fcwa-layer\u002Fauth-pages","5.nuxt-module\u002F9.cwa-layer\u002F2.auth-pages",{"title":338,"path":339,"stem":340},"Admin Panel","\u002Fnuxt-module\u002Fcwa-layer\u002Fadmin-panel","5.nuxt-module\u002F9.cwa-layer\u002F3.admin-panel",{"title":342,"path":343,"stem":344,"children":345,"page":35},"Deployment","\u002Fdeployment","6.deployment",[346,350,354],{"title":347,"path":348,"stem":349},"Docker","\u002Fdeployment\u002Fdocker","6.deployment\u002F1.docker",{"title":351,"path":352,"stem":353},"Kubernetes & Helm","\u002Fdeployment\u002Fkubernetes","6.deployment\u002F2.kubernetes",{"title":355,"path":356,"stem":357},"CI\u002FCD","\u002Fdeployment\u002Fci-cd","6.deployment\u002F3.ci-cd",{"id":359,"title":133,"badge":360,"body":361,"description":2038,"extension":2039,"links":360,"meta":2040,"navigation":621,"path":134,"seo":2041,"stem":135,"__hash__":2042},"docs\u002F4.api\u002F7.console-commands.md",null,{"type":362,"value":363,"toc":2013},"minimark",[364,373,412,415,449,456,459,473,476,503,508,573,586,592,595,670,675,686,700,703,706,710,725,730,737,751,762,782,788,821,831,833,836,843,849,855,869,872,895,898,957,961,1159,1166,1172,1182,1196,1199,1228,1239,1243,1410,1413,1438,1443,1449,1455,1469,1472,1501,1504,1558,1561,1842,1849,1880,1889,1895,1910,1924,1930,1950,1954,1981,1985,1999,2009],[365,366,367,368,372],"p",{},"Most commands use the ",[369,370,371],"code",{},"silverback:api-components:"," prefix. Run them via the Symfony console:",[374,375,380],"pre",{"className":376,"code":377,"language":378,"meta":379,"style":379},"language-bash shiki shiki-themes github-light github-dark material-theme-palenight","php bin\u002Fconsole silverback:api-components:\u003Ccommand>\n","bash","",[369,381,382],{"__ignoreMap":379},[383,384,387,391,395,398,402,405,409],"span",{"class":385,"line":386},"line",1,[383,388,390],{"class":389},"sRCss","php",[383,392,394],{"class":393},"sLL54"," bin\u002Fconsole",[383,396,397],{"class":393}," silverback:api-components:",[383,399,401],{"class":400},"sVlFx","\u003C",[383,403,404],{"class":393},"comman",[383,406,408],{"class":407},"sPB8G","d",[383,410,411],{"class":400},">\n",[365,413,414],{},"In a Docker Compose setup, prefix with the service name:",[374,416,418],{"className":376,"code":417,"language":378,"meta":379,"style":379},"docker compose exec api php bin\u002Fconsole silverback:api-components:\u003Ccommand>\n",[369,419,420],{"__ignoreMap":379},[383,421,422,425,428,431,434,437,439,441,443,445,447],{"class":385,"line":386},[383,423,424],{"class":389},"docker",[383,426,427],{"class":393}," compose",[383,429,430],{"class":393}," exec",[383,432,433],{"class":393}," api",[383,435,436],{"class":393}," php",[383,438,394],{"class":393},[383,440,397],{"class":393},[383,442,401],{"class":400},[383,444,404],{"class":393},[383,446,408],{"class":407},[383,448,411],{"class":400},[450,451,453],"h2",{"id":452},"usercreate",[369,454,455],{},"user:create",[365,457,458],{},"Create a user account directly from the command line, without going through the registration API. Useful for creating the first admin on a fresh installation before the front-end is set up.",[374,460,462],{"className":376,"code":461,"language":378,"meta":379,"style":379},"php bin\u002Fconsole silverback:api-components:user:create\n",[369,463,464],{"__ignoreMap":379},[383,465,466,468,470],{"class":385,"line":386},[383,467,390],{"class":389},[383,469,394],{"class":393},[383,471,472],{"class":393}," silverback:api-components:user:create\n",[365,474,475],{},"The command prompts interactively for username, email, and password. You can also pass them as positional arguments:",[374,477,479],{"className":376,"code":478,"language":378,"meta":379,"style":379},"php bin\u002Fconsole silverback:api-components:user:create alice alice@example.com s3cr3t --admin\n",[369,480,481],{"__ignoreMap":379},[383,482,483,485,487,490,493,496,499],{"class":385,"line":386},[383,484,390],{"class":389},[383,486,394],{"class":393},[383,488,489],{"class":393}," silverback:api-components:user:create",[383,491,492],{"class":393}," alice",[383,494,495],{"class":393}," alice@example.com",[383,497,498],{"class":393}," s3cr3t",[383,500,502],{"class":501},"szhYu"," --admin\n",[504,505,507],"h3",{"id":506},"options","Options",[509,510,511,524],"table",{},[512,513,514],"thead",{},[515,516,517,521],"tr",{},[518,519,520],"th",{},"Option",[518,522,523],{},"Description",[525,526,527,541,553,563],"tbody",{},[515,528,529,535],{},[530,531,532],"td",{},[369,533,534],{},"--admin",[530,536,537,538],{},"Create with ",[369,539,540],{},"ROLE_ADMIN",[515,542,543,548],{},[530,544,545],{},[369,546,547],{},"--super-admin",[530,549,537,550],{},[369,551,552],{},"ROLE_SUPER_ADMIN",[515,554,555,560],{},[530,556,557],{},[369,558,559],{},"--inactive",[530,561,562],{},"Create as disabled (cannot log in until enabled)",[515,564,565,570],{},[530,566,567],{},[369,568,569],{},"--overwrite",[530,571,572],{},"Update the user if they already exist instead of erroring",[365,574,575,576,578,579,581,582,585],{},"Without ",[369,577,534],{}," or ",[369,580,547],{},", the user is created with ",[369,583,584],{},"ROLE_USER"," only.",[450,587,589],{"id":588},"refresh-tokensexpire",[369,590,591],{},"refresh-tokens:expire",[365,593,594],{},"Expire all refresh tokens, or all tokens for a specific user. Use this to force re-login after a security incident or account change.",[374,596,598],{"className":376,"code":597,"language":378,"meta":379,"style":379},"# Expire all tokens for all users\nphp bin\u002Fconsole silverback:api-components:refresh-tokens:expire\n\n# Expire tokens for one user (by username)\nphp bin\u002Fconsole silverback:api-components:refresh-tokens:expire alice\n\n# Expire by email instead of username\nphp bin\u002Fconsole silverback:api-components:refresh-tokens:expire alice@example.com --field email\n",[369,599,600,606,616,623,629,642,647,653],{"__ignoreMap":379},[383,601,602],{"class":385,"line":386},[383,603,605],{"class":604},"sTBSN","# Expire all tokens for all users\n",[383,607,609,611,613],{"class":385,"line":608},2,[383,610,390],{"class":389},[383,612,394],{"class":393},[383,614,615],{"class":393}," silverback:api-components:refresh-tokens:expire\n",[383,617,619],{"class":385,"line":618},3,[383,620,622],{"emptyLinePlaceholder":621},true,"\n",[383,624,626],{"class":385,"line":625},4,[383,627,628],{"class":604},"# Expire tokens for one user (by username)\n",[383,630,632,634,636,639],{"class":385,"line":631},5,[383,633,390],{"class":389},[383,635,394],{"class":393},[383,637,638],{"class":393}," silverback:api-components:refresh-tokens:expire",[383,640,641],{"class":393}," alice\n",[383,643,645],{"class":385,"line":644},6,[383,646,622],{"emptyLinePlaceholder":621},[383,648,650],{"class":385,"line":649},7,[383,651,652],{"class":604},"# Expire by email instead of username\n",[383,654,656,658,660,662,664,667],{"class":385,"line":655},8,[383,657,390],{"class":389},[383,659,394],{"class":393},[383,661,638],{"class":393},[383,663,495],{"class":393},[383,665,666],{"class":501}," --field",[383,668,669],{"class":393}," email\n",[450,671,673],{"id":672},"clean-orphaned",[369,674,672],{},[365,676,677,678,681,682,685],{},"Scan every ",[369,679,680],{},"ComponentGroup"," and ",[369,683,684],{},"AbstractComponent"," in the database and delete any that are no longer attached to any layout, page, or parent component.",[374,687,689],{"className":376,"code":688,"language":378,"meta":379,"style":379},"php bin\u002Fconsole silverback:api-components:clean-orphaned\n",[369,690,691],{"__ignoreMap":379},[383,692,693,695,697],{"class":385,"line":386},[383,694,390],{"class":389},[383,696,394],{"class":393},[383,698,699],{"class":393}," silverback:api-components:clean-orphaned\n",[365,701,702],{},"Run this after bulk deletions or data migrations to keep the database tidy. The command outputs a progress bar and reports how many orphaned records were removed.",[704,705],"hr",{},[450,707,709],{"id":708},"maker-commands","Maker Commands",[365,711,712,713,716,717,724],{},"These commands use the standard ",[369,714,715],{},"make:"," prefix from ",[718,719,723],"a",{"href":720,"rel":721},"https:\u002F\u002Fsymfony.com\u002Fbundles\u002FSymfonyMakerBundle\u002Fcurrent\u002Findex.html",[722],"nofollow","Symfony MakerBundle"," and are only registered when MakerBundle is installed.",[450,726,728],{"id":727},"generate-fixtures",[369,729,727],{},[365,731,732,733,736],{},"Walk the live database and output a complete ",[369,734,735],{},"AbstractCwaScaffold","-compatible PHP class. Useful for capturing a known-good database state as a reproducible fixture, or as a starting point after setting up a site through the admin UI.",[374,738,740],{"className":376,"code":739,"language":378,"meta":379,"style":379},"php bin\u002Fconsole silverback:api-components:generate-fixtures\n",[369,741,742],{"__ignoreMap":379},[383,743,744,746,748],{"class":385,"line":386},[383,745,390],{"class":389},[383,747,394],{"class":393},[383,749,750],{"class":393}," silverback:api-components:generate-fixtures\n",[365,752,753,754,757,758,761],{},"By default the class is written to ",[369,755,756],{},"src\u002FDataFixtures\u002FGeneratedScaffold.php",". Pass ",[369,759,760],{},"--output"," to change the path:",[374,763,765],{"className":376,"code":764,"language":378,"meta":379,"style":379},"php bin\u002Fconsole silverback:api-components:generate-fixtures --output src\u002FDataFixtures\u002FMyScaffold.php\n",[369,766,767],{"__ignoreMap":379},[383,768,769,771,773,776,779],{"class":385,"line":386},[383,770,390],{"class":389},[383,772,394],{"class":393},[383,774,775],{"class":393}," silverback:api-components:generate-fixtures",[383,777,778],{"class":501}," --output",[383,780,781],{"class":393}," src\u002FDataFixtures\u002FMyScaffold.php\n",[365,783,784,785,787],{},"The generated class extends ",[369,786,735],{}," and reproduces:",[789,790,791,795,801,808,818],"ul",{},[792,793,794],"li",{},"All layouts, pages, and page data records with their routes",[792,796,797,798],{},"ComponentGroups and their ",[369,799,800],{},"allowedComponents",[792,802,803,804,807],{},"ComponentPositions — including ",[369,805,806],{},"pageDataPosition"," calls for template pages",[792,809,810,811,814,815],{},"Components with all public PHP entity properties, ",[369,812,813],{},"uiComponent",", and ",[369,816,817],{},"uiClassNames",[792,819,820],{},"Nested closures for parent\u002Fchild page and page data relationships",[365,822,823,824,827,828,830],{},"After generation, review the file and run ",[369,825,826],{},"php bin\u002Fconsole doctrine:fixtures:load"," to reload the captured state. See ",[718,829,125],{"href":126}," for the full builder API reference.",[704,832],{},[450,834,709],{"id":835},"maker-commands-1",[365,837,712,838,716,840,724],{},[369,839,715],{},[718,841,723],{"href":720,"rel":842},[722],[450,844,846],{"id":845},"makeapi-component",[369,847,848],{},"make:api-component",[365,850,851,852,854],{},"Generate a new ",[369,853,684],{}," entity with the correct namespace, attributes, and optional behaviour traits wired up automatically.",[374,856,858],{"className":376,"code":857,"language":378,"meta":379,"style":379},"php bin\u002Fconsole make:api-component\n",[369,859,860],{"__ignoreMap":379},[383,861,862,864,866],{"class":385,"line":386},[383,863,390],{"class":389},[383,865,394],{"class":393},[383,867,868],{"class":393}," make:api-component\n",[365,870,871],{},"The command prompts interactively for the class name and which behaviours to add. You can also pass everything as arguments:",[374,873,875],{"className":376,"code":874,"language":378,"meta":379,"style":379},"php bin\u002Fconsole make:api-component HeroBlock --timestamped --publishable\n",[369,876,877],{"__ignoreMap":379},[383,878,879,881,883,886,889,892],{"class":385,"line":386},[383,880,390],{"class":389},[383,882,394],{"class":393},[383,884,885],{"class":393}," make:api-component",[383,887,888],{"class":393}," HeroBlock",[383,890,891],{"class":501}," --timestamped",[383,893,894],{"class":501}," --publishable\n",[504,896,507],{"id":897},"options-1",[789,899,900,924,938],{},[792,901,902,908,909,912,913,916,917,920,921],{},[903,904,905],"strong",{},[369,906,907],{},"--timestamped"," — Add ",[369,910,911],{},"#[Timestamped]",": generates ",[369,914,915],{},"createdAt"," \u002F ",[369,918,919],{},"updatedAt"," columns via ",[369,922,923],{},"TimestampedTrait",[792,925,926,908,931,934,935],{},[903,927,928],{},[369,929,930],{},"--publishable",[369,932,933],{},"#[Publishable]",": wires up the draft\u002Fpublish lifecycle via ",[369,936,937],{},"PublishableTrait",[792,939,940,908,945,948,949,952,953,956],{},[903,941,942],{},[369,943,944],{},"--uploadable",[369,946,947],{},"#[Uploadable]",": includes a ",[369,950,951],{},"$file"," property and ",[369,954,955],{},"UploadableTrait"," for file handling",[504,958,960],{"id":959},"example-output-with-all-three-flags","Example output (with all three flags)",[374,962,965],{"className":963,"code":964,"language":390,"meta":379,"style":379},"language-php shiki shiki-themes github-light github-dark material-theme-palenight","#[Silverback\\Timestamped]\n#[Silverback\\Publishable]\n#[Silverback\\Uploadable]\n#[ApiResource]\n#[ORM\\Entity]\nclass HeroBlock extends AbstractComponent\n{\n    use TimestampedTrait;\n    use PublishableTrait;\n    use UploadableTrait;\n\n    #[Silverback\\UploadableField(adapter: 'local')]\n    public ?File $file = null;\n}\n",[369,966,967,985,997,1009,1018,1032,1046,1052,1064,1074,1084,1089,1126,1153],{"__ignoreMap":379},[383,968,969,972,976,980,982],{"class":385,"line":386},[383,970,971],{"class":407},"#[",[383,973,975],{"class":974},"sc2zw","Silverback",[383,977,979],{"class":978},"sBtbT","\\",[383,981,100],{"class":974},[383,983,984],{"class":407},"]\n",[383,986,987,989,991,993,995],{"class":385,"line":608},[383,988,971],{"class":407},[383,990,975],{"class":974},[383,992,979],{"class":978},[383,994,92],{"class":974},[383,996,984],{"class":407},[383,998,999,1001,1003,1005,1007],{"class":385,"line":618},[383,1000,971],{"class":407},[383,1002,975],{"class":974},[383,1004,979],{"class":978},[383,1006,96],{"class":974},[383,1008,984],{"class":407},[383,1010,1011,1013,1016],{"class":385,"line":625},[383,1012,971],{"class":407},[383,1014,1015],{"class":974},"ApiResource",[383,1017,984],{"class":407},[383,1019,1020,1022,1025,1027,1030],{"class":385,"line":631},[383,1021,971],{"class":407},[383,1023,1024],{"class":974},"ORM",[383,1026,979],{"class":978},[383,1028,1029],{"class":974},"Entity",[383,1031,984],{"class":407},[383,1033,1034,1038,1040,1043],{"class":385,"line":644},[383,1035,1037],{"class":1036},"swB56","class",[383,1039,888],{"class":389},[383,1041,1042],{"class":1036}," extends",[383,1044,1045],{"class":389}," AbstractComponent\n",[383,1047,1048],{"class":385,"line":649},[383,1049,1051],{"class":1050},"sOvfz","{\n",[383,1053,1054,1058,1061],{"class":385,"line":655},[383,1055,1057],{"class":1056},"stmX-","    use",[383,1059,1060],{"class":974}," TimestampedTrait",[383,1062,1063],{"class":1050},";\n",[383,1065,1067,1069,1072],{"class":385,"line":1066},9,[383,1068,1057],{"class":1056},[383,1070,1071],{"class":974}," PublishableTrait",[383,1073,1063],{"class":1050},[383,1075,1077,1079,1082],{"class":385,"line":1076},10,[383,1078,1057],{"class":1056},[383,1080,1081],{"class":974}," UploadableTrait",[383,1083,1063],{"class":1050},[383,1085,1087],{"class":385,"line":1086},11,[383,1088,622],{"emptyLinePlaceholder":621},[383,1090,1092,1095,1097,1099,1102,1105,1108,1111,1115,1118,1121,1124],{"class":385,"line":1091},12,[383,1093,1094],{"class":407},"    #[",[383,1096,975],{"class":974},[383,1098,979],{"class":978},[383,1100,1101],{"class":974},"UploadableField",[383,1103,1104],{"class":1050},"(",[383,1106,1107],{"class":389},"adapter",[383,1109,1110],{"class":1050},":",[383,1112,1114],{"class":1113},"seSrl"," '",[383,1116,1117],{"class":393},"local",[383,1119,1120],{"class":1113},"'",[383,1122,1123],{"class":1050},")",[383,1125,984],{"class":407},[383,1127,1129,1132,1135,1139,1142,1145,1148,1151],{"class":385,"line":1128},13,[383,1130,1131],{"class":1036},"    public",[383,1133,1134],{"class":400}," ?",[383,1136,1138],{"class":1137},"sbW4m","File",[383,1140,1141],{"class":1050}," $",[383,1143,1144],{"class":407},"file ",[383,1146,1147],{"class":400},"=",[383,1149,1150],{"class":978}," null",[383,1152,1063],{"class":1050},[383,1154,1156],{"class":385,"line":1155},14,[383,1157,1158],{"class":1050},"}\n",[365,1160,1161,1162,1165],{},"After generation, run ",[369,1163,1164],{},"make:migration"," and review the generated SQL before executing it — the traits add columns and (for publishable) self-referencing foreign keys.",[450,1167,1169],{"id":1168},"makepage-data",[369,1170,1171],{},"make:page-data",[365,1173,851,1174,1177,1178,1181],{},[369,1175,1176],{},"AbstractPageData"," entity with typed properties pre-wired, plus console output showing the matching ",[369,1179,1180],{},"nuxt.config"," snippet and fixture stub.",[374,1183,1185],{"className":376,"code":1184,"language":378,"meta":379,"style":379},"php bin\u002Fconsole make:page-data\n",[369,1186,1187],{"__ignoreMap":379},[383,1188,1189,1191,1193],{"class":385,"line":386},[383,1190,390],{"class":389},[383,1192,394],{"class":393},[383,1194,1195],{"class":393}," make:page-data\n",[365,1197,1198],{},"The command prompts interactively for the class name and properties. You can pass everything inline:",[374,1200,1202],{"className":376,"code":1201,"language":378,"meta":379,"style":379},"php bin\u002Fconsole make:page-data ConferenceData --properties headline:?string body:?string heroImage:?string\n",[369,1203,1204],{"__ignoreMap":379},[383,1205,1206,1208,1210,1213,1216,1219,1222,1225],{"class":385,"line":386},[383,1207,390],{"class":389},[383,1209,394],{"class":393},[383,1211,1212],{"class":393}," make:page-data",[383,1214,1215],{"class":393}," ConferenceData",[383,1217,1218],{"class":501}," --properties",[383,1220,1221],{"class":393}," headline:?string",[383,1223,1224],{"class":393}," body:?string",[383,1226,1227],{"class":393}," heroImage:?string\n",[365,1229,1230,1231,1234,1235,1238],{},"Properties are defined as ",[369,1232,1233],{},"name:type"," pairs. Nullable types use the ",[369,1236,1237],{},"?"," prefix.",[504,1240,1242],{"id":1241},"example-output","Example output",[374,1244,1246],{"className":963,"code":1245,"language":390,"meta":379,"style":379},"#[ApiResource]\n#[ORM\\Entity]\nclass ConferenceData extends AbstractPageData\n{\n    #[ORM\\Column(nullable: true)]\n    public ?string $headline;\n\n    #[ORM\\Column(nullable: true)]\n    public ?string $body;\n\n    #[ORM\\Column(nullable: true)]\n    public ?string $heroImage;\n}\n",[369,1247,1248,1256,1268,1279,1283,1308,1324,1328,1350,1365,1369,1391,1406],{"__ignoreMap":379},[383,1249,1250,1252,1254],{"class":385,"line":386},[383,1251,971],{"class":407},[383,1253,1015],{"class":974},[383,1255,984],{"class":407},[383,1257,1258,1260,1262,1264,1266],{"class":385,"line":608},[383,1259,971],{"class":407},[383,1261,1024],{"class":974},[383,1263,979],{"class":978},[383,1265,1029],{"class":974},[383,1267,984],{"class":407},[383,1269,1270,1272,1274,1276],{"class":385,"line":618},[383,1271,1037],{"class":1036},[383,1273,1215],{"class":389},[383,1275,1042],{"class":1036},[383,1277,1278],{"class":389}," AbstractPageData\n",[383,1280,1281],{"class":385,"line":625},[383,1282,1051],{"class":1050},[383,1284,1285,1287,1289,1291,1294,1296,1299,1301,1304,1306],{"class":385,"line":631},[383,1286,1094],{"class":407},[383,1288,1024],{"class":974},[383,1290,979],{"class":978},[383,1292,1293],{"class":974},"Column",[383,1295,1104],{"class":1050},[383,1297,1298],{"class":389},"nullable",[383,1300,1110],{"class":1050},[383,1302,1303],{"class":978}," true",[383,1305,1123],{"class":1050},[383,1307,984],{"class":407},[383,1309,1310,1312,1314,1317,1319,1322],{"class":385,"line":644},[383,1311,1131],{"class":1036},[383,1313,1134],{"class":400},[383,1315,1316],{"class":1056},"string",[383,1318,1141],{"class":1050},[383,1320,1321],{"class":407},"headline",[383,1323,1063],{"class":1050},[383,1325,1326],{"class":385,"line":649},[383,1327,622],{"emptyLinePlaceholder":621},[383,1329,1330,1332,1334,1336,1338,1340,1342,1344,1346,1348],{"class":385,"line":655},[383,1331,1094],{"class":407},[383,1333,1024],{"class":974},[383,1335,979],{"class":978},[383,1337,1293],{"class":974},[383,1339,1104],{"class":1050},[383,1341,1298],{"class":389},[383,1343,1110],{"class":1050},[383,1345,1303],{"class":978},[383,1347,1123],{"class":1050},[383,1349,984],{"class":407},[383,1351,1352,1354,1356,1358,1360,1363],{"class":385,"line":1066},[383,1353,1131],{"class":1036},[383,1355,1134],{"class":400},[383,1357,1316],{"class":1056},[383,1359,1141],{"class":1050},[383,1361,1362],{"class":407},"body",[383,1364,1063],{"class":1050},[383,1366,1367],{"class":385,"line":1076},[383,1368,622],{"emptyLinePlaceholder":621},[383,1370,1371,1373,1375,1377,1379,1381,1383,1385,1387,1389],{"class":385,"line":1086},[383,1372,1094],{"class":407},[383,1374,1024],{"class":974},[383,1376,979],{"class":978},[383,1378,1293],{"class":974},[383,1380,1104],{"class":1050},[383,1382,1298],{"class":389},[383,1384,1110],{"class":1050},[383,1386,1303],{"class":978},[383,1388,1123],{"class":1050},[383,1390,984],{"class":407},[383,1392,1393,1395,1397,1399,1401,1404],{"class":385,"line":1091},[383,1394,1131],{"class":1036},[383,1396,1134],{"class":400},[383,1398,1316],{"class":1056},[383,1400,1141],{"class":1050},[383,1402,1403],{"class":407},"heroImage",[383,1405,1063],{"class":1050},[383,1407,1408],{"class":385,"line":1128},[383,1409,1158],{"class":1050},[365,1411,1412],{},"After generation the command prints:",[789,1414,1415,1426,1432],{},[792,1416,1417,1418,1421,1422,1425],{},"The ",[369,1419,1420],{},"nuxt.config.ts"," ",[369,1423,1424],{},"cwa.pageData.ConferenceData.properties"," snippet to add human-readable labels for the admin picker",[792,1427,1428,1429],{},"A fixture scaffold stub: ",[369,1430,1431],{},"$cwa->pageData(new ConferenceData(), template: 'my-template')",[792,1433,1434,1437],{},[369,1435,1436],{},"->pageDataPosition(ConferenceData::class, 'propertyName')"," calls for each property, ready to paste into a template group",[365,1439,1161,1440,1442],{},[369,1441,1164],{}," and review the generated SQL before executing it.",[450,1444,1446],{"id":1445},"makecwa-scaffold",[369,1447,1448],{},"make:cwa-scaffold",[365,1450,1451,1452,1454],{},"Generate a starter ",[369,1453,735],{}," subclass pre-wired with a layout, a home page, and commented-out nav link stubs.",[374,1456,1458],{"className":376,"code":1457,"language":378,"meta":379,"style":379},"php bin\u002Fconsole make:cwa-scaffold\n",[369,1459,1460],{"__ignoreMap":379},[383,1461,1462,1464,1466],{"class":385,"line":386},[383,1463,390],{"class":389},[383,1465,394],{"class":393},[383,1467,1468],{"class":393}," make:cwa-scaffold\n",[365,1470,1471],{},"The command prompts interactively for the class name, layout reference key, and layout UI component name. You can pass everything inline:",[374,1473,1475],{"className":376,"code":1474,"language":378,"meta":379,"style":379},"php bin\u002Fconsole make:cwa-scaffold AppScaffold --layout-ref main --layout-component Primary\n",[369,1476,1477],{"__ignoreMap":379},[383,1478,1479,1481,1483,1486,1489,1492,1495,1498],{"class":385,"line":386},[383,1480,390],{"class":389},[383,1482,394],{"class":393},[383,1484,1485],{"class":393}," make:cwa-scaffold",[383,1487,1488],{"class":393}," AppScaffold",[383,1490,1491],{"class":501}," --layout-ref",[383,1493,1494],{"class":393}," main",[383,1496,1497],{"class":501}," --layout-component",[383,1499,1500],{"class":393}," Primary\n",[504,1502,507],{"id":1503},"options-2",[509,1505,1506,1517],{},[512,1507,1508],{},[515,1509,1510,1512,1515],{},[518,1511,520],{},[518,1513,1514],{},"Default",[518,1516,523],{},[525,1518,1519,1537],{},[515,1520,1521,1526,1531],{},[530,1522,1523],{},[369,1524,1525],{},"--layout-ref",[530,1527,1528],{},[369,1529,1530],{},"main",[530,1532,1533,1534],{},"Reference key passed to ",[369,1535,1536],{},"$cwa->layout()",[515,1538,1539,1544,1549],{},[530,1540,1541],{},[369,1542,1543],{},"--layout-component",[530,1545,1546],{},[369,1547,1548],{},"CwaLayoutPrimary",[530,1550,1551,1552,1555,1556,1123],{},"Layout UI suffix (e.g. ",[369,1553,1554],{},"Primary"," → stores ",[369,1557,1548],{},[504,1559,1242],{"id":1560},"example-output-1",[374,1562,1564],{"className":963,"code":1563,"language":390,"meta":379,"style":379},"class AppScaffold extends AbstractCwaScaffold\n{\n    public function build(CwaFixtureBuilder $cwa): void\n    {\n        $navGroup = $cwa->layout('main', 'Primary')\n            ->group('top');\n\n        $cwa->page('home', 'PrimaryPageTemplate', layout: 'main', route: '\u002F', routeName: 'home-page',\n            configure: fn (PageBuilder $page) => $page\n                ->title('Home')\n                ->group('primary')\n        );\n\n        \u002F\u002F $navGroup->add(...) — nav links go here after routes exist\n    }\n}\n",[369,1565,1566,1577,1581,1609,1614,1654,1674,1678,1751,1781,1800,1817,1822,1826,1831,1837],{"__ignoreMap":379},[383,1567,1568,1570,1572,1574],{"class":385,"line":386},[383,1569,1037],{"class":1036},[383,1571,1488],{"class":389},[383,1573,1042],{"class":1036},[383,1575,1576],{"class":389}," AbstractCwaScaffold\n",[383,1578,1579],{"class":385,"line":608},[383,1580,1051],{"class":1050},[383,1582,1583,1585,1588,1592,1594,1597,1599,1602,1604,1606],{"class":385,"line":618},[383,1584,1131],{"class":1036},[383,1586,1587],{"class":1036}," function",[383,1589,1591],{"class":1590},"sKpYG"," build",[383,1593,1104],{"class":1050},[383,1595,1596],{"class":1137},"CwaFixtureBuilder",[383,1598,1141],{"class":1050},[383,1600,1601],{"class":407},"cwa",[383,1603,1123],{"class":1050},[383,1605,1110],{"class":400},[383,1607,1608],{"class":1056}," void\n",[383,1610,1611],{"class":385,"line":625},[383,1612,1613],{"class":1050},"    {\n",[383,1615,1616,1619,1622,1624,1626,1628,1631,1634,1636,1638,1640,1642,1645,1647,1649,1651],{"class":385,"line":631},[383,1617,1618],{"class":1050},"        $",[383,1620,1621],{"class":407},"navGroup ",[383,1623,1147],{"class":400},[383,1625,1141],{"class":1050},[383,1627,1601],{"class":407},[383,1629,1630],{"class":400},"->",[383,1632,1633],{"class":1590},"layout",[383,1635,1104],{"class":1050},[383,1637,1120],{"class":1113},[383,1639,1530],{"class":393},[383,1641,1120],{"class":1113},[383,1643,1644],{"class":1050},",",[383,1646,1114],{"class":1113},[383,1648,1554],{"class":393},[383,1650,1120],{"class":1113},[383,1652,1653],{"class":1050},")\n",[383,1655,1656,1659,1662,1664,1666,1669,1671],{"class":385,"line":644},[383,1657,1658],{"class":400},"            ->",[383,1660,1661],{"class":1590},"group",[383,1663,1104],{"class":1050},[383,1665,1120],{"class":1113},[383,1667,1668],{"class":393},"top",[383,1670,1120],{"class":1113},[383,1672,1673],{"class":1050},");\n",[383,1675,1676],{"class":385,"line":649},[383,1677,622],{"emptyLinePlaceholder":621},[383,1679,1680,1682,1684,1686,1689,1691,1693,1696,1698,1700,1702,1705,1707,1709,1712,1714,1716,1718,1720,1722,1725,1727,1729,1732,1734,1736,1739,1741,1743,1746,1748],{"class":385,"line":655},[383,1681,1618],{"class":1050},[383,1683,1601],{"class":407},[383,1685,1630],{"class":400},[383,1687,1688],{"class":1590},"page",[383,1690,1104],{"class":1050},[383,1692,1120],{"class":1113},[383,1694,1695],{"class":393},"home",[383,1697,1120],{"class":1113},[383,1699,1644],{"class":1050},[383,1701,1114],{"class":1113},[383,1703,1704],{"class":393},"PrimaryPageTemplate",[383,1706,1120],{"class":1113},[383,1708,1644],{"class":1050},[383,1710,1711],{"class":389}," layout",[383,1713,1110],{"class":1050},[383,1715,1114],{"class":1113},[383,1717,1530],{"class":393},[383,1719,1120],{"class":1113},[383,1721,1644],{"class":1050},[383,1723,1724],{"class":389}," route",[383,1726,1110],{"class":1050},[383,1728,1114],{"class":1113},[383,1730,1731],{"class":393},"\u002F",[383,1733,1120],{"class":1113},[383,1735,1644],{"class":1050},[383,1737,1738],{"class":389}," routeName",[383,1740,1110],{"class":1050},[383,1742,1114],{"class":1113},[383,1744,1745],{"class":393},"home-page",[383,1747,1120],{"class":1113},[383,1749,1750],{"class":1050},",\n",[383,1752,1753,1756,1758,1761,1764,1767,1769,1771,1773,1776,1778],{"class":385,"line":1066},[383,1754,1755],{"class":389},"            configure",[383,1757,1110],{"class":1050},[383,1759,1760],{"class":1036}," fn",[383,1762,1763],{"class":1050}," (",[383,1765,1766],{"class":1137},"PageBuilder",[383,1768,1141],{"class":1050},[383,1770,1688],{"class":407},[383,1772,1123],{"class":1050},[383,1774,1775],{"class":1050}," =>",[383,1777,1141],{"class":1050},[383,1779,1780],{"class":407},"page\n",[383,1782,1783,1786,1789,1791,1793,1796,1798],{"class":385,"line":1076},[383,1784,1785],{"class":400},"                ->",[383,1787,1788],{"class":1590},"title",[383,1790,1104],{"class":1050},[383,1792,1120],{"class":1113},[383,1794,1795],{"class":393},"Home",[383,1797,1120],{"class":1113},[383,1799,1653],{"class":1050},[383,1801,1802,1804,1806,1808,1810,1813,1815],{"class":385,"line":1086},[383,1803,1785],{"class":400},[383,1805,1661],{"class":1590},[383,1807,1104],{"class":1050},[383,1809,1120],{"class":1113},[383,1811,1812],{"class":393},"primary",[383,1814,1120],{"class":1113},[383,1816,1653],{"class":1050},[383,1818,1819],{"class":385,"line":1091},[383,1820,1821],{"class":1050},"        );\n",[383,1823,1824],{"class":385,"line":1128},[383,1825,622],{"emptyLinePlaceholder":621},[383,1827,1828],{"class":385,"line":1155},[383,1829,1830],{"class":604},"        \u002F\u002F $navGroup->add(...) — nav links go here after routes exist\n",[383,1832,1834],{"class":385,"line":1833},15,[383,1835,1836],{"class":1050},"    }\n",[383,1838,1840],{"class":385,"line":1839},16,[383,1841,1158],{"class":1050},[365,1843,1844,1845,1848],{},"After generation the command prints the ",[369,1846,1847],{},"config\u002Fservices.yaml"," snippet to register the class as a Doctrine fixture:",[374,1850,1854],{"className":1851,"code":1852,"language":1853,"meta":379,"style":379},"language-yaml shiki shiki-themes github-light github-dark material-theme-palenight","App\\DataFixtures\\AppScaffold:\n    tags: [doctrine.fixture.orm]\n","yaml",[369,1855,1856,1865],{"__ignoreMap":379},[383,1857,1858,1862],{"class":385,"line":386},[383,1859,1861],{"class":1860},"s-h7I","App\\DataFixtures\\AppScaffold",[383,1863,1864],{"class":1050},":\n",[383,1866,1867,1870,1872,1875,1878],{"class":385,"line":608},[383,1868,1869],{"class":1860},"    tags",[383,1871,1110],{"class":1050},[383,1873,1874],{"class":1050}," [",[383,1876,1877],{"class":393},"doctrine.fixture.orm",[383,1879,984],{"class":1050},[365,1881,1882,1883,1885,1886,1888],{},"Then run ",[369,1884,826],{}," to seed the database. See ",[718,1887,125],{"href":126}," for the full builder API.",[450,1890,1892],{"id":1891},"makerename-component",[369,1893,1894],{},"make:rename-component",[365,1896,1897,1898,1901,1902,1905,1906,1909],{},"Generate a Doctrine migration to rename a CWA component type. Use this when you need to rename a PHP entity class that is already stored in the database — it updates the discriminator column (",[369,1899,1900],{},"dtype",") in ",[369,1903,1904],{},"abstract_component"," and replaces old collection IRIs in ",[369,1907,1908],{},"component_group.allowed_components",".",[374,1911,1913],{"className":376,"code":1912,"language":378,"meta":379,"style":379},"php bin\u002Fconsole make:rename-component\n",[369,1914,1915],{"__ignoreMap":379},[383,1916,1917,1919,1921],{"class":385,"line":386},[383,1918,390],{"class":389},[383,1920,394],{"class":393},[383,1922,1923],{"class":393}," make:rename-component\n",[365,1925,1926,1927,1929],{},"The command prompts interactively for the old and new class names, FQCNs, and ",[369,1928,1900],{}," values (defaulting to lowercase class names):",[374,1931,1933],{"className":376,"code":1932,"language":378,"meta":379,"style":379},"php bin\u002Fconsole make:rename-component HtmlContent RichText\n",[369,1934,1935],{"__ignoreMap":379},[383,1936,1937,1939,1941,1944,1947],{"class":385,"line":386},[383,1938,390],{"class":389},[383,1940,394],{"class":393},[383,1942,1943],{"class":393}," make:rename-component",[383,1945,1946],{"class":393}," HtmlContent",[383,1948,1949],{"class":393}," RichText\n",[504,1951,1953],{"id":1952},"what-it-does","What it does",[1955,1956,1957,1963,1972],"ol",{},[792,1958,1959,1960],{},"Generates a Doctrine migration class at ",[369,1961,1962],{},"src\u002FMigrations\u002FRenameComponentHtmlContentToRichText.php",[792,1964,1965,1966,681,1969,1971],{},"The migration updates ",[369,1967,1968],{},"abstract_component.dtype",[369,1970,1908],{}," in the database",[792,1973,1974,1975,1977,1978,1980],{},"After generation, the command prints any ",[369,1976,680],{}," records whose ",[369,1979,800],{}," array references the old IRI — these need front-end updates too",[504,1982,1984],{"id":1983},"front-end-checklist-printed-after-generation","Front-end checklist (printed after generation)",[1955,1986,1987,1990,1993],{},[792,1988,1989],{},"Rename the Vue component file from the old name to the new name",[792,1991,1992],{},"Update any imports or registrations referencing the old name",[792,1994,1995,1996],{},"Run ",[369,1997,1998],{},"php bin\u002Fconsole doctrine:migrations:migrate",[2000,2001,2004],"callout",{"color":2002,"icon":2003},"warning","i-heroicons-exclamation-triangle",[365,2005,1995,2006,2008],{},[369,2007,1164],{}," and review the generated SQL before executing. The migration is written for you — do not skip the review step.",[2010,2011,2012],"style",{},"html pre.shiki code .sRCss, html code.shiki .sRCss{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#FFCB6B}html pre.shiki code .sLL54, html code.shiki .sLL54{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#C3E88D}html pre.shiki code .sVlFx, html code.shiki .sVlFx{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#89DDFF}html pre.shiki code .sPB8G, html code.shiki .sPB8G{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#BABED8}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 pre.shiki code .szhYu, html code.shiki .szhYu{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#C3E88D}html pre.shiki code .sTBSN, html code.shiki .sTBSN{--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sc2zw, html code.shiki .sc2zw{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#BABED8}html pre.shiki code .sBtbT, html code.shiki .sBtbT{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#89DDFF}html pre.shiki code .swB56, html code.shiki .swB56{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#C792EA}html pre.shiki code .sOvfz, html code.shiki .sOvfz{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#89DDFF}html pre.shiki code .stmX-, html code.shiki .stmX-{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F78C6C}html pre.shiki code .seSrl, html code.shiki .seSrl{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#89DDFF}html pre.shiki code .sbW4m, html code.shiki .sbW4m{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#FFCB6B}html pre.shiki code .sKpYG, html code.shiki .sKpYG{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#82AAFF}html pre.shiki code .s-h7I, html code.shiki .s-h7I{--shiki-light:#22863A;--shiki-default:#85E89D;--shiki-dark:#F07178}",{"title":379,"searchDepth":608,"depth":608,"links":2014},[2015,2018,2019,2020,2021,2022,2023,2027,2030,2034],{"id":452,"depth":608,"text":455,"children":2016},[2017],{"id":506,"depth":618,"text":507},{"id":588,"depth":608,"text":591},{"id":672,"depth":608,"text":672},{"id":708,"depth":608,"text":709},{"id":727,"depth":608,"text":727},{"id":835,"depth":608,"text":709},{"id":845,"depth":608,"text":848,"children":2024},[2025,2026],{"id":897,"depth":618,"text":507},{"id":959,"depth":618,"text":960},{"id":1168,"depth":608,"text":1171,"children":2028},[2029],{"id":1241,"depth":618,"text":1242},{"id":1445,"depth":608,"text":1448,"children":2031},[2032,2033],{"id":1503,"depth":618,"text":507},{"id":1560,"depth":618,"text":1242},{"id":1891,"depth":608,"text":1894,"children":2035},[2036,2037],{"id":1952,"depth":618,"text":1953},{"id":1983,"depth":618,"text":1984},"Symfony console commands provided by the API Components Bundle for managing users, cleaning up data, and generating component entities.","md",{},{"title":133,"description":2038},"IkYyuWMjZSzGqDyBqdBsnLop7l03eiFd92V5x8GCWKM",[2044,2046],{"title":129,"path":130,"stem":131,"description":2045,"children":-1},"Complete reference for all silverback_api_components bundle configuration options.",{"title":137,"path":138,"stem":139,"description":2047,"children":-1},"The CWA Symfony profiler panel surfaces JWT activity, resolved routes, and Mercure publications in the web toolbar.",1782512895925]