[{"data":1,"prerenderedAt":5722},["ShallowReactive",2],{"navigation":3,"\u002Fapi\u002Fdata-fixtures":342,"\u002Fapi\u002Fdata-fixtures-surround":5717},[4,14,36,69,140,325],{"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,178,203,207,279,304,308],{"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],{"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,"children":182,"page":35},"Cwa Components","\u002Fnuxt-module\u002Fcwa-components","5.nuxt-module\u002F4.cwa-components",[183,187,191,195,199],{"title":184,"path":185,"stem":186},"\u003CCwaComponentGroup \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-component-group","5.nuxt-module\u002F4.cwa-components\u002F1.cwa-component-group",{"title":188,"path":189,"stem":190},"\u003CCwaPage \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-page","5.nuxt-module\u002F4.cwa-components\u002F2.cwa-page",{"title":192,"path":193,"stem":194},"\u003CCwaLink \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-link","5.nuxt-module\u002F4.cwa-components\u002F3.cwa-link",{"title":196,"path":197,"stem":198},"\u003CCwaImage \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-image","5.nuxt-module\u002F4.cwa-components\u002F4.cwa-image",{"title":200,"path":201,"stem":202},"\u003CCwaDefaultLayout \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-default-layout","5.nuxt-module\u002F4.cwa-components\u002F5.cwa-default-layout",{"title":204,"path":205,"stem":206},"The useCwa() API","\u002Fnuxt-module\u002Fcwa-api","5.nuxt-module\u002F5.cwa-api",{"title":208,"path":209,"stem":210,"children":211,"page":35},"Composables","\u002Fnuxt-module\u002Fcomposables","5.nuxt-module\u002F6.composables",[212,245,262],{"title":213,"path":214,"stem":215,"children":216,"page":35},"Component","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent","5.nuxt-module\u002F6.composables\u002F1.component",[217,221,225,229,233,237,241],{"title":218,"path":219,"stem":220},"Resource","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-resource","5.nuxt-module\u002F6.composables\u002F1.component\u002F1.use-cwa-resource",{"title":222,"path":223,"stem":224},"Collection Resource","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-collection-resource","5.nuxt-module\u002F6.composables\u002F1.component\u002F2.use-cwa-collection-resource",{"title":226,"path":227,"stem":228},"Image Resource","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-image-resource","5.nuxt-module\u002F6.composables\u002F1.component\u002F3.use-cwa-image-resource",{"title":230,"path":231,"stem":232},"Form","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-form","5.nuxt-module\u002F6.composables\u002F1.component\u002F4.use-cwa-form",{"title":234,"path":235,"stem":236},"Form Input","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-form-input","5.nuxt-module\u002F6.composables\u002F1.component\u002F5.use-cwa-form-input",{"title":238,"path":239,"stem":240},"Form Repeated","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-form-repeated","5.nuxt-module\u002F6.composables\u002F1.component\u002F6.use-cwa-form-repeated",{"title":242,"path":243,"stem":244},"Form Collection","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-form-collection","5.nuxt-module\u002F6.composables\u002F1.component\u002F7.use-cwa-form-collection",{"title":246,"path":247,"stem":248,"children":249,"page":35},"Admin Manager","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager","5.nuxt-module\u002F6.composables\u002F2.admin-manager",[250,254,258],{"title":251,"path":252,"stem":253},"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":255,"path":256,"stem":257},"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":259,"path":260,"stem":261},"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":263,"path":264,"stem":265,"children":266,"page":35},"Utilities","\u002Fnuxt-module\u002Fcomposables\u002Futilities","5.nuxt-module\u002F6.composables\u002F3.utilities",[267,271,275],{"title":268,"path":269,"stem":270},"Resource Endpoint","\u002Fnuxt-module\u002Fcomposables\u002Futilities\u002Fuse-cwa-resource-endpoint","5.nuxt-module\u002F6.composables\u002F3.utilities\u002F1.use-cwa-resource-endpoint",{"title":272,"path":273,"stem":274},"Query Model","\u002Fnuxt-module\u002Fcomposables\u002Futilities\u002Fuse-query-bound-model","5.nuxt-module\u002F6.composables\u002F3.utilities\u002F2.use-query-bound-model",{"title":276,"path":277,"stem":278},"Resource Route","\u002Fnuxt-module\u002Fcomposables\u002Futilities\u002Fuse-cwa-resource-route","5.nuxt-module\u002F6.composables\u002F3.utilities\u002F3.use-cwa-resource-route",{"title":280,"path":281,"stem":282,"children":283,"page":35},"Component Helpers","\u002Fnuxt-module\u002Fcomponent-helpers","5.nuxt-module\u002F7.component-helpers",[284,288,292,296,300],{"title":285,"path":286,"stem":287},"Images & Media","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fimages-and-uploads","5.nuxt-module\u002F7.component-helpers\u002F1.images-and-uploads",{"title":289,"path":290,"stem":291},"Collections & Pagination","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fcollections-and-pagination","5.nuxt-module\u002F7.component-helpers\u002F2.collections-and-pagination",{"title":293,"path":294,"stem":295},"HTML Content","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fhtml-content","5.nuxt-module\u002F7.component-helpers\u002F3.html-content",{"title":297,"path":298,"stem":299},"Real-Time Updates","\u002Fnuxt-module\u002Fcomponent-helpers\u002Freal-time-updates","5.nuxt-module\u002F7.component-helpers\u002F4.real-time-updates",{"title":301,"path":302,"stem":303},"Forms","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fforms","5.nuxt-module\u002F7.component-helpers\u002F5.forms",{"title":305,"path":306,"stem":307},"Authentication","\u002Fnuxt-module\u002Fauthentication","5.nuxt-module\u002F8.authentication",{"title":309,"path":310,"stem":311,"children":312,"page":35},"Cwa Layer","\u002Fnuxt-module\u002Fcwa-layer","5.nuxt-module\u002F9.cwa-layer",[313,317,321],{"title":314,"path":315,"stem":316},"Overview","\u002Fnuxt-module\u002Fcwa-layer\u002Foverview","5.nuxt-module\u002F9.cwa-layer\u002F1.overview",{"title":318,"path":319,"stem":320},"Auth Pages","\u002Fnuxt-module\u002Fcwa-layer\u002Fauth-pages","5.nuxt-module\u002F9.cwa-layer\u002F2.auth-pages",{"title":322,"path":323,"stem":324},"Admin Panel","\u002Fnuxt-module\u002Fcwa-layer\u002Fadmin-panel","5.nuxt-module\u002F9.cwa-layer\u002F3.admin-panel",{"title":326,"path":327,"stem":328,"children":329,"page":35},"Deployment","\u002Fdeployment","6.deployment",[330,334,338],{"title":331,"path":332,"stem":333},"Docker","\u002Fdeployment\u002Fdocker","6.deployment\u002F1.docker",{"title":335,"path":336,"stem":337},"Kubernetes & Helm","\u002Fdeployment\u002Fkubernetes","6.deployment\u002F2.kubernetes",{"title":339,"path":340,"stem":341},"CI\u002FCD","\u002Fdeployment\u002Fci-cd","6.deployment\u002F3.ci-cd",{"id":343,"title":125,"badge":344,"body":347,"description":5711,"extension":5712,"links":5713,"meta":5714,"navigation":433,"path":126,"seo":5715,"stem":127,"__hash__":5716},"docs\u002F4.api\u002F5.data-fixtures.md",{"label":345,"color":346},"Draft","amber",{"type":348,"value":349,"toc":5672},"minimark",[350,359,364,371,400,411,702,728,743,791,794,807,810,814,820,862,865,896,909,913,1045,1048,1102,1108,1375,1381,1484,1491,1521,1527,1556,1563,1569,1599,1602,1607,1636,1654,1658,1678,1698,1700,1704,1713,1794,1805,1813,1917,1929,2101,2109,2168,2178,2427,2438,2524,2534,2550,2680,2688,2727,2730,2834,2836,2843,2860,2863,3024,3034,3036,3040,3046,3133,3139,3141,3145,3148,4161,4163,4167,4266,4268,4272,4283,4653,4662,4666,4851,4855,4922,4929,4940,5025,5029,5050,5060,5066,5223,5227,5348,5352,5363,5497,5501,5603,5627,5629,5633,5668],[351,352,353,354,358],"p",{},"The API bundle ships a fluent fixture scaffold that handles all the complexity of seeding CWA data: entity persistence ordering, phase-aware flushing, route generation, and ComponentPosition wiring. You describe what you want, call ",[355,356,357],"code",{},"flush()",", and the builder handles the rest.",[360,361,363],"h2",{"id":362},"setup","Setup",[351,365,366,367,370],{},"Install ",[355,368,369],{},"doctrine\u002Fdoctrine-fixtures-bundle"," if not already present:",[372,373,378],"pre",{"className":374,"code":375,"language":376,"meta":377,"style":377},"language-bash shiki shiki-themes github-light github-dark material-theme-palenight","composer require --dev doctrine\u002Fdoctrine-fixtures-bundle\n","bash","",[355,379,380],{"__ignoreMap":377},[381,382,385,389,393,397],"span",{"class":383,"line":384},"line",1,[381,386,388],{"class":387},"sRCss","composer",[381,390,392],{"class":391},"sLL54"," require",[381,394,396],{"class":395},"szhYu"," --dev",[381,398,399],{"class":391}," doctrine\u002Fdoctrine-fixtures-bundle\n",[351,401,402,403,406,407,410],{},"Extend ",[355,404,405],{},"AbstractCwaScaffold"," instead of implementing ",[355,408,409],{},"FixtureInterface"," directly:",[372,412,416],{"className":413,"code":414,"language":415,"meta":377,"style":377},"language-php shiki shiki-themes github-light github-dark material-theme-palenight","\u003C?php\n\nnamespace App\\DataFixtures;\n\nuse Silverback\\ApiComponentsBundle\\Fixture\\AbstractCwaScaffold;\nuse Silverback\\ApiComponentsBundle\\Fixture\\CwaFixtureBuilder;\n\nclass AppFixtures extends AbstractCwaScaffold\n{\n    public function build(CwaFixtureBuilder $cwa): void\n    {\n        $cwa->layout('main', 'CwaLayoutPrimary');\n        $cwa->page('home', 'PrimaryPageTemplate', layout: 'main', route: '\u002F');\n        $cwa->flush();\n    }\n}\n","php",[355,417,418,428,435,456,461,487,509,514,530,536,571,577,616,675,690,696],{"__ignoreMap":377},[381,419,420,424],{"class":383,"line":384},[381,421,423],{"class":422},"sVlFx","\u003C?",[381,425,427],{"class":426},"sc2zw","php\n",[381,429,431],{"class":383,"line":430},2,[381,432,434],{"emptyLinePlaceholder":433},true,"\n",[381,436,438,442,445,449,452],{"class":383,"line":437},3,[381,439,441],{"class":440},"stmX-","namespace",[381,443,444],{"class":387}," App",[381,446,448],{"class":447},"sn4go","\\",[381,450,451],{"class":387},"DataFixtures",[381,453,455],{"class":454},"sOvfz",";\n",[381,457,459],{"class":383,"line":458},4,[381,460,434],{"emptyLinePlaceholder":433},[381,462,464,467,470,473,476,478,481,483,485],{"class":383,"line":463},5,[381,465,466],{"class":440},"use",[381,468,469],{"class":426}," Silverback",[381,471,448],{"class":472},"sBtbT",[381,474,475],{"class":426},"ApiComponentsBundle",[381,477,448],{"class":472},[381,479,480],{"class":426},"Fixture",[381,482,448],{"class":472},[381,484,405],{"class":426},[381,486,455],{"class":454},[381,488,490,492,494,496,498,500,502,504,507],{"class":383,"line":489},6,[381,491,466],{"class":440},[381,493,469],{"class":426},[381,495,448],{"class":472},[381,497,475],{"class":426},[381,499,448],{"class":472},[381,501,480],{"class":426},[381,503,448],{"class":472},[381,505,506],{"class":426},"CwaFixtureBuilder",[381,508,455],{"class":454},[381,510,512],{"class":383,"line":511},7,[381,513,434],{"emptyLinePlaceholder":433},[381,515,517,521,524,527],{"class":383,"line":516},8,[381,518,520],{"class":519},"swB56","class",[381,522,523],{"class":387}," AppFixtures",[381,525,526],{"class":519}," extends",[381,528,529],{"class":387}," AbstractCwaScaffold\n",[381,531,533],{"class":383,"line":532},9,[381,534,535],{"class":454},"{\n",[381,537,539,542,545,549,552,555,558,562,565,568],{"class":383,"line":538},10,[381,540,541],{"class":519},"    public",[381,543,544],{"class":519}," function",[381,546,548],{"class":547},"sKpYG"," build",[381,550,551],{"class":454},"(",[381,553,506],{"class":554},"sbW4m",[381,556,557],{"class":454}," $",[381,559,561],{"class":560},"sPB8G","cwa",[381,563,564],{"class":454},")",[381,566,567],{"class":422},":",[381,569,570],{"class":440}," void\n",[381,572,574],{"class":383,"line":573},11,[381,575,576],{"class":454},"    {\n",[381,578,580,583,585,588,591,593,597,600,602,605,608,611,613],{"class":383,"line":579},12,[381,581,582],{"class":454},"        $",[381,584,561],{"class":560},[381,586,587],{"class":422},"->",[381,589,590],{"class":547},"layout",[381,592,551],{"class":454},[381,594,596],{"class":595},"seSrl","'",[381,598,599],{"class":391},"main",[381,601,596],{"class":595},[381,603,604],{"class":454},",",[381,606,607],{"class":595}," '",[381,609,610],{"class":391},"CwaLayoutPrimary",[381,612,596],{"class":595},[381,614,615],{"class":454},");\n",[381,617,619,621,623,625,628,630,632,635,637,639,641,644,646,648,651,653,655,657,659,661,664,666,668,671,673],{"class":383,"line":618},13,[381,620,582],{"class":454},[381,622,561],{"class":560},[381,624,587],{"class":422},[381,626,627],{"class":547},"page",[381,629,551],{"class":454},[381,631,596],{"class":595},[381,633,634],{"class":391},"home",[381,636,596],{"class":595},[381,638,604],{"class":454},[381,640,607],{"class":595},[381,642,643],{"class":391},"PrimaryPageTemplate",[381,645,596],{"class":595},[381,647,604],{"class":454},[381,649,650],{"class":387}," layout",[381,652,567],{"class":454},[381,654,607],{"class":595},[381,656,599],{"class":391},[381,658,596],{"class":595},[381,660,604],{"class":454},[381,662,663],{"class":387}," route",[381,665,567],{"class":454},[381,667,607],{"class":595},[381,669,670],{"class":391},"\u002F",[381,672,596],{"class":595},[381,674,615],{"class":454},[381,676,678,680,682,684,687],{"class":383,"line":677},14,[381,679,582],{"class":454},[381,681,561],{"class":560},[381,683,587],{"class":422},[381,685,686],{"class":547},"flush",[381,688,689],{"class":454},"();\n",[381,691,693],{"class":383,"line":692},15,[381,694,695],{"class":454},"    }\n",[381,697,699],{"class":383,"line":698},16,[381,700,701],{"class":454},"}\n",[351,703,704,706,707,709,710,713,714,717,718,721,722,724,725,727],{},[355,705,405],{}," implements ",[355,708,409],{},". Its ",[355,711,712],{},"load()"," method injects the ",[355,715,716],{},"ObjectManager",", calls your ",[355,719,720],{},"build()",", then calls ",[355,723,357],{}," again. ",[355,726,506],{}," is injected automatically via Symfony's service container.",[351,729,730,731,734,735,738,739,742],{},"With ",[355,732,733],{},"autoconfigure: true"," (the Symfony default), your fixture class is detected and tagged as a Doctrine fixture automatically — no ",[355,736,737],{},"services.yaml"," entry needed. If ",[355,740,741],{},"autoconfigure"," is disabled, register manually:",[372,744,748],{"className":745,"code":746,"language":747,"meta":377,"style":377},"language-yaml shiki shiki-themes github-light github-dark material-theme-palenight","# config\u002Fservices.yaml\nApp\\DataFixtures\\AppFixtures:\n    tags:\n        - { name: doctrine.fixture.orm }\n","yaml",[355,749,750,756,765,772],{"__ignoreMap":377},[381,751,752],{"class":383,"line":384},[381,753,755],{"class":754},"sTBSN","# config\u002Fservices.yaml\n",[381,757,758,762],{"class":383,"line":430},[381,759,761],{"class":760},"s-h7I","App\\DataFixtures\\AppFixtures",[381,763,764],{"class":454},":\n",[381,766,767,770],{"class":383,"line":437},[381,768,769],{"class":760},"    tags",[381,771,764],{"class":454},[381,773,774,777,780,783,785,788],{"class":383,"line":458},[381,775,776],{"class":454},"        -",[381,778,779],{"class":454}," {",[381,781,782],{"class":760}," name",[381,784,567],{"class":454},[381,786,787],{"class":391}," doctrine.fixture.orm",[381,789,790],{"class":454}," }\n",[351,792,793],{},"Run your fixtures:",[372,795,797],{"className":374,"code":796,"language":376,"meta":377,"style":377},"bin\u002Fconsole doctrine:fixtures:load\n",[355,798,799],{"__ignoreMap":377},[381,800,801,804],{"class":383,"line":384},[381,802,803],{"class":387},"bin\u002Fconsole",[381,805,806],{"class":391}," doctrine:fixtures:load\n",[808,809],"hr",{},[360,811,813],{"id":812},"the-builder-api","The Builder API",[815,816,817],"h3",{"id":590},[355,818,819],{},"layout()",[372,821,823],{"className":413,"code":822,"language":415,"meta":377,"style":377},"$cwa->layout(string $ref, string $uiComponent): LayoutBuilder\n",[355,824,825],{"__ignoreMap":377},[381,826,827,830,832,834,836,838,841,843,846,848,851,853,856,859],{"class":383,"line":384},[381,828,829],{"class":454},"$",[381,831,561],{"class":560},[381,833,587],{"class":422},[381,835,590],{"class":547},[381,837,551],{"class":454},[381,839,840],{"class":519},"string",[381,842,557],{"class":454},[381,844,845],{"class":560},"ref",[381,847,604],{"class":454},[381,849,850],{"class":519}," string",[381,852,557],{"class":454},[381,854,855],{"class":560},"uiComponent",[381,857,858],{"class":454},"):",[381,860,861],{"class":426}," LayoutBuilder\n",[351,863,864],{},"Creates (or retrieves if already registered) a Layout entity.",[866,867,868,879],"ul",{},[869,870,871,874,875,878],"li",{},[355,872,873],{},"$ref"," — a local key used to reference this layout in ",[355,876,877],{},"page()"," calls. Not stored in the database.",[869,880,881,884,885,887,888,891,892,895],{},[355,882,883],{},"$uiComponent"," — the ",[355,886,855],{}," field value (e.g. ",[355,889,890],{},"'CwaLayoutPrimary'","). Maps to ",[355,893,894],{},"app\u002Fcwa\u002Flayouts\u002Fprimary.vue"," in the Nuxt app.",[351,897,898,899,901,902,904,905,908],{},"Calling ",[355,900,819],{}," twice with the same ",[355,903,873],{}," returns the same ",[355,906,907],{},"LayoutBuilder"," — useful for adding groups across separate calls.",[815,910,911],{"id":627},[355,912,877],{},[372,914,916],{"className":413,"code":915,"language":415,"meta":377,"style":377},"$cwa->page(\n    string $ref,\n    string $uiComponent,\n    string $layout,\n    ?string $route = null,\n    ?string $routeName = null,\n    bool $isTemplate = false,\n    ?\\Closure $configure = null\n): PageBuilder\n",[355,917,918,931,943,953,963,983,1000,1017,1036],{"__ignoreMap":377},[381,919,920,922,924,926,928],{"class":383,"line":384},[381,921,829],{"class":454},[381,923,561],{"class":560},[381,925,587],{"class":422},[381,927,627],{"class":547},[381,929,930],{"class":454},"(\n",[381,932,933,936,938,940],{"class":383,"line":430},[381,934,935],{"class":519},"    string",[381,937,557],{"class":454},[381,939,845],{"class":560},[381,941,942],{"class":454},",\n",[381,944,945,947,949,951],{"class":383,"line":437},[381,946,935],{"class":519},[381,948,557],{"class":454},[381,950,855],{"class":560},[381,952,942],{"class":454},[381,954,955,957,959,961],{"class":383,"line":458},[381,956,935],{"class":519},[381,958,557],{"class":454},[381,960,590],{"class":560},[381,962,942],{"class":454},[381,964,965,968,970,972,975,978,981],{"class":383,"line":463},[381,966,967],{"class":422},"    ?",[381,969,840],{"class":519},[381,971,557],{"class":454},[381,973,974],{"class":560},"route ",[381,976,977],{"class":422},"=",[381,979,980],{"class":472}," null",[381,982,942],{"class":454},[381,984,985,987,989,991,994,996,998],{"class":383,"line":489},[381,986,967],{"class":422},[381,988,840],{"class":519},[381,990,557],{"class":454},[381,992,993],{"class":560},"routeName ",[381,995,977],{"class":422},[381,997,980],{"class":472},[381,999,942],{"class":454},[381,1001,1002,1005,1007,1010,1012,1015],{"class":383,"line":511},[381,1003,1004],{"class":519},"    bool",[381,1006,557],{"class":454},[381,1008,1009],{"class":560},"isTemplate ",[381,1011,977],{"class":422},[381,1013,1014],{"class":472}," false",[381,1016,942],{"class":454},[381,1018,1019,1021,1023,1026,1028,1031,1033],{"class":383,"line":516},[381,1020,967],{"class":422},[381,1022,448],{"class":560},[381,1024,1025],{"class":426},"Closure",[381,1027,557],{"class":454},[381,1029,1030],{"class":560},"configure ",[381,1032,977],{"class":422},[381,1034,1035],{"class":472}," null\n",[381,1037,1038,1040,1042],{"class":383,"line":532},[381,1039,564],{"class":560},[381,1041,567],{"class":422},[381,1043,1044],{"class":426}," PageBuilder\n",[351,1046,1047],{},"Creates a Page entity.",[866,1049,1050,1055,1060,1068,1074,1086,1092],{},[869,1051,1052,1054],{},[355,1053,873],{}," — local key unique within this fixture",[869,1056,1057,1059],{},[355,1058,883],{}," — maps to your page template Vue file",[869,1061,1062,884,1065,1067],{},[355,1063,1064],{},"$layout",[355,1066,873],{}," of a layout already registered in this builder",[869,1069,1070,1073],{},[355,1071,1072],{},"route"," — creates an explicit Route at this path; omit to auto-generate from the page title",[869,1075,1076,1079,1080,1083,1084],{},[355,1077,1078],{},"routeName"," — a name for ",[355,1081,1082],{},"getRoute()"," retrieval after ",[355,1085,357],{},[869,1087,1088,1091],{},[355,1089,1090],{},"isTemplate: true"," — marks the page as a template (no route is generated)",[869,1093,1094,1097,1098,1101],{},[355,1095,1096],{},"configure"," — optional closure called immediately with the ",[355,1099,1100],{},"PageBuilder",", for inline configuration",[351,1103,1104,1105,1107],{},"The ",[355,1106,1096],{}," closure is equivalent to chaining on the returned builder, but keeps setup co-located with the call — useful when creating multiple pages or when you don't need to reference the builder later:",[372,1109,1111],{"className":413,"code":1110,"language":415,"meta":377,"style":377},"\u002F\u002F Using configure closure — inline, no variable needed\n$cwa->page('home', 'PrimaryPageTemplate', layout: 'main', route: '\u002F',\n    configure: function (PageBuilder $builder) use ($hero): void {\n        $builder->title('Home')\n            ->group('hero')->add($hero);\n    }\n);\n\n\u002F\u002F Equivalent chained form\n$cwa->page('home', 'PrimaryPageTemplate', layout: 'main', route: '\u002F')\n    ->title('Home')\n    ->group('hero')->add($hero);\n",[355,1112,1113,1118,1170,1210,1233,1263,1267,1271,1275,1280,1332,1349],{"__ignoreMap":377},[381,1114,1115],{"class":383,"line":384},[381,1116,1117],{"class":754},"\u002F\u002F Using configure closure — inline, no variable needed\n",[381,1119,1120,1122,1124,1126,1128,1130,1132,1134,1136,1138,1140,1142,1144,1146,1148,1150,1152,1154,1156,1158,1160,1162,1164,1166,1168],{"class":383,"line":430},[381,1121,829],{"class":454},[381,1123,561],{"class":560},[381,1125,587],{"class":422},[381,1127,627],{"class":547},[381,1129,551],{"class":454},[381,1131,596],{"class":595},[381,1133,634],{"class":391},[381,1135,596],{"class":595},[381,1137,604],{"class":454},[381,1139,607],{"class":595},[381,1141,643],{"class":391},[381,1143,596],{"class":595},[381,1145,604],{"class":454},[381,1147,650],{"class":387},[381,1149,567],{"class":454},[381,1151,607],{"class":595},[381,1153,599],{"class":391},[381,1155,596],{"class":595},[381,1157,604],{"class":454},[381,1159,663],{"class":387},[381,1161,567],{"class":454},[381,1163,607],{"class":595},[381,1165,670],{"class":391},[381,1167,596],{"class":595},[381,1169,942],{"class":454},[381,1171,1172,1175,1177,1179,1182,1184,1186,1189,1191,1194,1197,1200,1202,1204,1207],{"class":383,"line":437},[381,1173,1174],{"class":387},"    configure",[381,1176,567],{"class":454},[381,1178,544],{"class":519},[381,1180,1181],{"class":454}," (",[381,1183,1100],{"class":554},[381,1185,557],{"class":454},[381,1187,1188],{"class":560},"builder",[381,1190,564],{"class":454},[381,1192,1193],{"class":440}," use",[381,1195,1196],{"class":454}," ($",[381,1198,1199],{"class":560},"hero",[381,1201,564],{"class":454},[381,1203,567],{"class":422},[381,1205,1206],{"class":440}," void",[381,1208,1209],{"class":454}," {\n",[381,1211,1212,1214,1216,1218,1221,1223,1225,1228,1230],{"class":383,"line":458},[381,1213,582],{"class":454},[381,1215,1188],{"class":560},[381,1217,587],{"class":422},[381,1219,1220],{"class":547},"title",[381,1222,551],{"class":454},[381,1224,596],{"class":595},[381,1226,1227],{"class":391},"Home",[381,1229,596],{"class":595},[381,1231,1232],{"class":454},")\n",[381,1234,1235,1238,1241,1243,1245,1247,1249,1251,1253,1256,1259,1261],{"class":383,"line":463},[381,1236,1237],{"class":422},"            ->",[381,1239,1240],{"class":547},"group",[381,1242,551],{"class":454},[381,1244,596],{"class":595},[381,1246,1199],{"class":391},[381,1248,596],{"class":595},[381,1250,564],{"class":454},[381,1252,587],{"class":422},[381,1254,1255],{"class":547},"add",[381,1257,1258],{"class":454},"($",[381,1260,1199],{"class":560},[381,1262,615],{"class":454},[381,1264,1265],{"class":383,"line":489},[381,1266,695],{"class":454},[381,1268,1269],{"class":383,"line":511},[381,1270,615],{"class":454},[381,1272,1273],{"class":383,"line":516},[381,1274,434],{"emptyLinePlaceholder":433},[381,1276,1277],{"class":383,"line":532},[381,1278,1279],{"class":754},"\u002F\u002F Equivalent chained form\n",[381,1281,1282,1284,1286,1288,1290,1292,1294,1296,1298,1300,1302,1304,1306,1308,1310,1312,1314,1316,1318,1320,1322,1324,1326,1328,1330],{"class":383,"line":538},[381,1283,829],{"class":454},[381,1285,561],{"class":560},[381,1287,587],{"class":422},[381,1289,627],{"class":547},[381,1291,551],{"class":454},[381,1293,596],{"class":595},[381,1295,634],{"class":391},[381,1297,596],{"class":595},[381,1299,604],{"class":454},[381,1301,607],{"class":595},[381,1303,643],{"class":391},[381,1305,596],{"class":595},[381,1307,604],{"class":454},[381,1309,650],{"class":387},[381,1311,567],{"class":454},[381,1313,607],{"class":595},[381,1315,599],{"class":391},[381,1317,596],{"class":595},[381,1319,604],{"class":454},[381,1321,663],{"class":387},[381,1323,567],{"class":454},[381,1325,607],{"class":595},[381,1327,670],{"class":391},[381,1329,596],{"class":595},[381,1331,1232],{"class":454},[381,1333,1334,1337,1339,1341,1343,1345,1347],{"class":383,"line":573},[381,1335,1336],{"class":422},"    ->",[381,1338,1220],{"class":547},[381,1340,551],{"class":454},[381,1342,596],{"class":595},[381,1344,1227],{"class":391},[381,1346,596],{"class":595},[381,1348,1232],{"class":454},[381,1350,1351,1353,1355,1357,1359,1361,1363,1365,1367,1369,1371,1373],{"class":383,"line":579},[381,1352,1336],{"class":422},[381,1354,1240],{"class":547},[381,1356,551],{"class":454},[381,1358,596],{"class":595},[381,1360,1199],{"class":391},[381,1362,596],{"class":595},[381,1364,564],{"class":454},[381,1366,587],{"class":422},[381,1368,1255],{"class":547},[381,1370,1258],{"class":454},[381,1372,1199],{"class":560},[381,1374,615],{"class":454},[815,1376,1378],{"id":1377},"pagedata",[355,1379,1380],{},"pageData()",[372,1382,1384],{"className":413,"code":1383,"language":415,"meta":377,"style":377},"$cwa->pageData(\n    AbstractPageData $pageData,\n    ?string $template = null,\n    ?string $route = null,\n    ?string $routeName = null,\n    ?\\Closure $configure = null\n): PageDataBuilder\n",[355,1385,1386,1399,1410,1427,1443,1459,1475],{"__ignoreMap":377},[381,1387,1388,1390,1392,1394,1397],{"class":383,"line":384},[381,1389,829],{"class":454},[381,1391,561],{"class":560},[381,1393,587],{"class":422},[381,1395,1396],{"class":547},"pageData",[381,1398,930],{"class":454},[381,1400,1401,1404,1406,1408],{"class":383,"line":430},[381,1402,1403],{"class":426},"    AbstractPageData",[381,1405,557],{"class":454},[381,1407,1396],{"class":560},[381,1409,942],{"class":454},[381,1411,1412,1414,1416,1418,1421,1423,1425],{"class":383,"line":437},[381,1413,967],{"class":422},[381,1415,840],{"class":519},[381,1417,557],{"class":454},[381,1419,1420],{"class":560},"template ",[381,1422,977],{"class":422},[381,1424,980],{"class":472},[381,1426,942],{"class":454},[381,1428,1429,1431,1433,1435,1437,1439,1441],{"class":383,"line":458},[381,1430,967],{"class":422},[381,1432,840],{"class":519},[381,1434,557],{"class":454},[381,1436,974],{"class":560},[381,1438,977],{"class":422},[381,1440,980],{"class":472},[381,1442,942],{"class":454},[381,1444,1445,1447,1449,1451,1453,1455,1457],{"class":383,"line":463},[381,1446,967],{"class":422},[381,1448,840],{"class":519},[381,1450,557],{"class":454},[381,1452,993],{"class":560},[381,1454,977],{"class":422},[381,1456,980],{"class":472},[381,1458,942],{"class":454},[381,1460,1461,1463,1465,1467,1469,1471,1473],{"class":383,"line":489},[381,1462,967],{"class":422},[381,1464,448],{"class":560},[381,1466,1025],{"class":426},[381,1468,557],{"class":454},[381,1470,1030],{"class":560},[381,1472,977],{"class":422},[381,1474,1035],{"class":472},[381,1476,1477,1479,1481],{"class":383,"line":511},[381,1478,564],{"class":560},[381,1480,567],{"class":422},[381,1482,1483],{"class":426}," PageDataBuilder\n",[351,1485,1486,1487,1490],{},"Wraps a ",[355,1488,1489],{},"PageData"," record (e.g. a blog article).",[866,1492,1493,1501,1511],{},[869,1494,1495,884,1498,1500],{},[355,1496,1497],{},"$template",[355,1499,873],{}," of the template page this data record uses",[869,1502,1503,1505,1506,1508,1509],{},[355,1504,1072],{}," \u002F ",[355,1507,1078],{}," — same as ",[355,1510,877],{},[869,1512,1513,1097,1515,1518,1519],{},[355,1514,1096],{},[355,1516,1517],{},"PageDataBuilder",", same inline pattern as ",[355,1520,877],{},[815,1522,1524],{"id":1523},"component",[355,1525,1526],{},"component()",[372,1528,1530],{"className":413,"code":1529,"language":415,"meta":377,"style":377},"$cwa->component(AbstractComponent $component): ComponentBuilder\n",[355,1531,1532],{"__ignoreMap":377},[381,1533,1534,1536,1538,1540,1542,1544,1547,1549,1551,1553],{"class":383,"line":384},[381,1535,829],{"class":454},[381,1537,561],{"class":560},[381,1539,587],{"class":422},[381,1541,1523],{"class":547},[381,1543,551],{"class":454},[381,1545,1546],{"class":426},"AbstractComponent",[381,1548,557],{"class":454},[381,1550,1523],{"class":560},[381,1552,858],{"class":454},[381,1554,1555],{"class":426}," ComponentBuilder\n",[351,1557,1558,1559,1562],{},"Registers a component entity with the builder. The component is persisted in Phase 1. Returns a ",[355,1560,1561],{},"ComponentBuilder"," for adding child groups.",[815,1564,1566],{"id":1565},"persist",[355,1567,1568],{},"persist()",[372,1570,1572],{"className":413,"code":1571,"language":415,"meta":377,"style":377},"$cwa->persist(object $entity): static\n",[355,1573,1574],{"__ignoreMap":377},[381,1575,1576,1578,1580,1582,1584,1586,1589,1591,1594,1596],{"class":383,"line":384},[381,1577,829],{"class":454},[381,1579,561],{"class":560},[381,1581,587],{"class":422},[381,1583,1565],{"class":547},[381,1585,551],{"class":454},[381,1587,1588],{"class":519},"object",[381,1590,557],{"class":454},[381,1592,1593],{"class":560},"entity",[381,1595,858],{"class":454},[381,1597,1598],{"class":519}," static\n",[351,1600,1601],{},"Explicitly persist any non-CWA entity (custom relations, settings, etc.). Walks owning-side associations and persists related objects recursively.",[815,1603,1605],{"id":1604},"getroute",[355,1606,1082],{},[372,1608,1610],{"className":413,"code":1609,"language":415,"meta":377,"style":377},"$cwa->getRoute(string $routeName): Route\n",[355,1611,1612],{"__ignoreMap":377},[381,1613,1614,1616,1618,1620,1623,1625,1627,1629,1631,1633],{"class":383,"line":384},[381,1615,829],{"class":454},[381,1617,561],{"class":560},[381,1619,587],{"class":422},[381,1621,1622],{"class":547},"getRoute",[381,1624,551],{"class":454},[381,1626,840],{"class":519},[381,1628,557],{"class":454},[381,1630,1078],{"class":560},[381,1632,858],{"class":454},[381,1634,1635],{"class":426}," Route\n",[351,1637,1638,1639,1642,1643,1645,1646,1649,1650,1653],{},"Returns a named ",[355,1640,1641],{},"Route"," after ",[355,1644,357],{},". Throws ",[355,1647,1648],{},"LogicException"," if called before routes have been created. Use to retrieve a route and assign it to a ",[355,1651,1652],{},"NavigationLink"," component.",[815,1655,1656],{"id":686},[355,1657,357],{},[372,1659,1661],{"className":413,"code":1660,"language":415,"meta":377,"style":377},"$cwa->flush(): void\n",[355,1662,1663],{"__ignoreMap":377},[381,1664,1665,1667,1669,1671,1673,1676],{"class":383,"line":384},[381,1666,829],{"class":454},[381,1668,561],{"class":560},[381,1670,587],{"class":422},[381,1672,686],{"class":547},[381,1674,1675],{"class":454},"():",[381,1677,570],{"class":426},[351,1679,1680,1681,1686,1687,1690,1691,1693,1694,1697],{},"Triggers the full persistence sequence (see ",[1682,1683,1685],"a",{"href":1684},"#flush-phases","below","). Call it at least once — and call it again any time you register new entities or positions after the first call. All phases are idempotent: already-processed entities, nested closures, and ",[355,1688,1689],{},"onRoutesCreated"," callbacks are tracked internally and skipped on subsequent calls. Only work added since the previous ",[355,1692,357],{}," is processed, and the underlying ",[355,1695,1696],{},"EntityManager::flush()"," is only called when something actually changed.",[808,1699],{},[360,1701,1703],{"id":1702},"sub-builder-apis","Sub-builder APIs",[815,1705,1707,1709,1710],{"id":1706},"layoutbuilder-from-cwa-layout",[355,1708,907],{}," — from ",[355,1711,1712],{},"$cwa->layout()",[372,1714,1716],{"className":413,"code":1715,"language":415,"meta":377,"style":377},"->group(\n    string $name,\n    array $allow = [],\n    ?\\Closure $configure = null,\n    ?string $locationReference = null\n): GroupBuilder\n",[355,1717,1718,1726,1737,1752,1770,1785],{"__ignoreMap":377},[381,1719,1720,1722,1724],{"class":383,"line":384},[381,1721,587],{"class":422},[381,1723,1240],{"class":547},[381,1725,930],{"class":454},[381,1727,1728,1730,1732,1735],{"class":383,"line":430},[381,1729,935],{"class":519},[381,1731,557],{"class":454},[381,1733,1734],{"class":560},"name",[381,1736,942],{"class":454},[381,1738,1739,1742,1744,1747,1749],{"class":383,"line":437},[381,1740,1741],{"class":519},"    array",[381,1743,557],{"class":454},[381,1745,1746],{"class":560},"allow ",[381,1748,977],{"class":422},[381,1750,1751],{"class":454}," [],\n",[381,1753,1754,1756,1758,1760,1762,1764,1766,1768],{"class":383,"line":458},[381,1755,967],{"class":422},[381,1757,448],{"class":560},[381,1759,1025],{"class":426},[381,1761,557],{"class":454},[381,1763,1030],{"class":560},[381,1765,977],{"class":422},[381,1767,980],{"class":472},[381,1769,942],{"class":454},[381,1771,1772,1774,1776,1778,1781,1783],{"class":383,"line":463},[381,1773,967],{"class":422},[381,1775,840],{"class":519},[381,1777,557],{"class":454},[381,1779,1780],{"class":560},"locationReference ",[381,1782,977],{"class":422},[381,1784,1035],{"class":472},[381,1786,1787,1789,1791],{"class":383,"line":489},[381,1788,564],{"class":560},[381,1790,567],{"class":422},[381,1792,1793],{"class":426}," GroupBuilder\n",[351,1795,1796,1797,1800,1801,1804],{},"Creates a ",[355,1798,1799],{},"ComponentGroup"," linked to this layout. ",[355,1802,1803],{},"$allow"," is an array of component class names to restrict what admins can add. Leave empty to allow all types.",[815,1806,1808,1709,1810],{"id":1807},"pagebuilder-from-cwa-page",[355,1809,1100],{},[355,1811,1812],{},"$cwa->page()",[372,1814,1816],{"className":413,"code":1815,"language":415,"meta":377,"style":377},"->title(string $title): self\n->metaDescription(string $description): self\n->group(string $name, ...): GroupBuilder\n->nested(\\Closure $configure): void\n->getRoute(): ?Route    \u002F\u002F available after flush()\n",[355,1817,1818,1837,1857,1880,1901],{"__ignoreMap":377},[381,1819,1820,1822,1824,1826,1828,1830,1832,1834],{"class":383,"line":384},[381,1821,587],{"class":422},[381,1823,1220],{"class":547},[381,1825,551],{"class":454},[381,1827,840],{"class":519},[381,1829,557],{"class":454},[381,1831,1220],{"class":560},[381,1833,858],{"class":454},[381,1835,1836],{"class":519}," self\n",[381,1838,1839,1841,1844,1846,1848,1850,1853,1855],{"class":383,"line":430},[381,1840,587],{"class":422},[381,1842,1843],{"class":547},"metaDescription",[381,1845,551],{"class":454},[381,1847,840],{"class":519},[381,1849,557],{"class":454},[381,1851,1852],{"class":560},"description",[381,1854,858],{"class":454},[381,1856,1836],{"class":519},[381,1858,1859,1861,1863,1865,1867,1869,1871,1873,1876,1878],{"class":383,"line":437},[381,1860,587],{"class":422},[381,1862,1240],{"class":547},[381,1864,551],{"class":454},[381,1866,840],{"class":519},[381,1868,557],{"class":454},[381,1870,1734],{"class":560},[381,1872,604],{"class":454},[381,1874,1875],{"class":422}," ...",[381,1877,858],{"class":454},[381,1879,1793],{"class":426},[381,1881,1882,1884,1887,1889,1891,1893,1895,1897,1899],{"class":383,"line":458},[381,1883,587],{"class":422},[381,1885,1886],{"class":547},"nested",[381,1888,551],{"class":454},[381,1890,448],{"class":560},[381,1892,1025],{"class":426},[381,1894,557],{"class":454},[381,1896,1096],{"class":560},[381,1898,858],{"class":454},[381,1900,570],{"class":426},[381,1902,1903,1905,1907,1909,1912,1914],{"class":383,"line":463},[381,1904,587],{"class":422},[381,1906,1622],{"class":547},[381,1908,1675],{"class":454},[381,1910,1911],{"class":422}," ?",[381,1913,1641],{"class":426},[381,1915,1916],{"class":754},"    \u002F\u002F available after flush()\n",[351,1918,1919,1922,1923,1925,1926,1928],{},[355,1920,1921],{},"nested()"," receives a ",[355,1924,506],{}," scoped to this page as parent, for creating child ",[355,1927,1489],{}," records:",[372,1930,1932],{"className":413,"code":1931,"language":415,"meta":377,"style":377},"$cwa->page('blog-template', 'BlogPageTemplate', layout: 'main', isTemplate: true)\n    ->nested(function (CwaFixtureBuilder $child): void {\n        $article = new BlogArticle();\n        $article->title = 'First Post';\n        $child->pageData($article, template: 'blog-template', route: '\u002Fblog\u002Ffirst-post');\n    });\n",[355,1933,1934,1986,2014,2031,2054,2096],{"__ignoreMap":377},[381,1935,1936,1938,1940,1942,1944,1946,1948,1951,1953,1955,1957,1960,1962,1964,1966,1968,1970,1972,1974,1976,1979,1981,1984],{"class":383,"line":384},[381,1937,829],{"class":454},[381,1939,561],{"class":560},[381,1941,587],{"class":422},[381,1943,627],{"class":547},[381,1945,551],{"class":454},[381,1947,596],{"class":595},[381,1949,1950],{"class":391},"blog-template",[381,1952,596],{"class":595},[381,1954,604],{"class":454},[381,1956,607],{"class":595},[381,1958,1959],{"class":391},"BlogPageTemplate",[381,1961,596],{"class":595},[381,1963,604],{"class":454},[381,1965,650],{"class":387},[381,1967,567],{"class":454},[381,1969,607],{"class":595},[381,1971,599],{"class":391},[381,1973,596],{"class":595},[381,1975,604],{"class":454},[381,1977,1978],{"class":387}," isTemplate",[381,1980,567],{"class":454},[381,1982,1983],{"class":472}," true",[381,1985,1232],{"class":454},[381,1987,1988,1990,1992,1994,1997,1999,2001,2003,2006,2008,2010,2012],{"class":383,"line":430},[381,1989,1336],{"class":422},[381,1991,1886],{"class":547},[381,1993,551],{"class":454},[381,1995,1996],{"class":519},"function",[381,1998,1181],{"class":454},[381,2000,506],{"class":554},[381,2002,557],{"class":454},[381,2004,2005],{"class":560},"child",[381,2007,564],{"class":454},[381,2009,567],{"class":422},[381,2011,1206],{"class":440},[381,2013,1209],{"class":454},[381,2015,2016,2018,2021,2023,2026,2029],{"class":383,"line":437},[381,2017,582],{"class":454},[381,2019,2020],{"class":560},"article ",[381,2022,977],{"class":422},[381,2024,2025],{"class":440}," new",[381,2027,2028],{"class":554}," BlogArticle",[381,2030,689],{"class":454},[381,2032,2033,2035,2038,2040,2043,2045,2047,2050,2052],{"class":383,"line":458},[381,2034,582],{"class":454},[381,2036,2037],{"class":560},"article",[381,2039,587],{"class":422},[381,2041,2042],{"class":560},"title ",[381,2044,977],{"class":422},[381,2046,607],{"class":595},[381,2048,2049],{"class":391},"First Post",[381,2051,596],{"class":595},[381,2053,455],{"class":454},[381,2055,2056,2058,2060,2062,2064,2066,2068,2070,2073,2075,2077,2079,2081,2083,2085,2087,2089,2092,2094],{"class":383,"line":463},[381,2057,582],{"class":454},[381,2059,2005],{"class":560},[381,2061,587],{"class":422},[381,2063,1396],{"class":547},[381,2065,1258],{"class":454},[381,2067,2037],{"class":560},[381,2069,604],{"class":454},[381,2071,2072],{"class":387}," template",[381,2074,567],{"class":454},[381,2076,607],{"class":595},[381,2078,1950],{"class":391},[381,2080,596],{"class":595},[381,2082,604],{"class":454},[381,2084,663],{"class":387},[381,2086,567],{"class":454},[381,2088,607],{"class":595},[381,2090,2091],{"class":391},"\u002Fblog\u002Ffirst-post",[381,2093,596],{"class":595},[381,2095,615],{"class":454},[381,2097,2098],{"class":383,"line":489},[381,2099,2100],{"class":454},"    });\n",[815,2102,2104,1709,2106],{"id":2103},"pagedatabuilder-from-cwa-pagedata",[355,2105,1517],{},[355,2107,2108],{},"$cwa->pageData()",[372,2110,2112],{"className":413,"code":2111,"language":415,"meta":377,"style":377},"->nested(\\Closure $configure): void\n->onRoutesCreated(\\Closure $cb): self\n->getRoute(): ?Route\n",[355,2113,2114,2134,2155],{"__ignoreMap":377},[381,2115,2116,2118,2120,2122,2124,2126,2128,2130,2132],{"class":383,"line":384},[381,2117,587],{"class":422},[381,2119,1886],{"class":547},[381,2121,551],{"class":454},[381,2123,448],{"class":560},[381,2125,1025],{"class":426},[381,2127,557],{"class":454},[381,2129,1096],{"class":560},[381,2131,858],{"class":454},[381,2133,570],{"class":426},[381,2135,2136,2138,2140,2142,2144,2146,2148,2151,2153],{"class":383,"line":430},[381,2137,587],{"class":422},[381,2139,1689],{"class":547},[381,2141,551],{"class":454},[381,2143,448],{"class":560},[381,2145,1025],{"class":426},[381,2147,557],{"class":454},[381,2149,2150],{"class":560},"cb",[381,2152,858],{"class":454},[381,2154,1836],{"class":519},[381,2156,2157,2159,2161,2163,2165],{"class":383,"line":437},[381,2158,587],{"class":422},[381,2160,1622],{"class":547},[381,2162,1675],{"class":454},[381,2164,1911],{"class":422},[381,2166,2167],{"class":426},"Route\n",[351,2169,2170,2173,2174,2177],{},[355,2171,2172],{},"onRoutesCreated()"," fires after all child routes have been created. The closure receives ",[355,2175,2176],{},"array\u003CPageBuilder>"," of child page builders, useful for wiring nav links that target child URLs:",[372,2179,2181],{"className":413,"code":2180,"language":415,"meta":377,"style":377},"$cwa->pageData($section, template: 'section-template')\n    ->nested(function (CwaFixtureBuilder $child): void {\n        $child->pageData(new Article(), template: 'article-template', routeName: 'article-1');\n    })\n    ->onRoutesCreated(function (array $childBuilders) use ($cwa): void {\n        foreach ($childBuilders as $child) {\n            $link = new NavigationLink();\n            $link->route = $child->getRoute();\n            $cwa->component($link);\n        }\n        $cwa->flush();\n    });\n",[355,2182,2183,2213,2239,2287,2292,2328,2350,2367,2390,2406,2411,2423],{"__ignoreMap":377},[381,2184,2185,2187,2189,2191,2193,2195,2198,2200,2202,2204,2206,2209,2211],{"class":383,"line":384},[381,2186,829],{"class":454},[381,2188,561],{"class":560},[381,2190,587],{"class":422},[381,2192,1396],{"class":547},[381,2194,1258],{"class":454},[381,2196,2197],{"class":560},"section",[381,2199,604],{"class":454},[381,2201,2072],{"class":387},[381,2203,567],{"class":454},[381,2205,607],{"class":595},[381,2207,2208],{"class":391},"section-template",[381,2210,596],{"class":595},[381,2212,1232],{"class":454},[381,2214,2215,2217,2219,2221,2223,2225,2227,2229,2231,2233,2235,2237],{"class":383,"line":430},[381,2216,1336],{"class":422},[381,2218,1886],{"class":547},[381,2220,551],{"class":454},[381,2222,1996],{"class":519},[381,2224,1181],{"class":454},[381,2226,506],{"class":554},[381,2228,557],{"class":454},[381,2230,2005],{"class":560},[381,2232,564],{"class":454},[381,2234,567],{"class":422},[381,2236,1206],{"class":440},[381,2238,1209],{"class":454},[381,2240,2241,2243,2245,2247,2249,2251,2254,2257,2260,2262,2264,2266,2269,2271,2273,2276,2278,2280,2283,2285],{"class":383,"line":437},[381,2242,582],{"class":454},[381,2244,2005],{"class":560},[381,2246,587],{"class":422},[381,2248,1396],{"class":547},[381,2250,551],{"class":454},[381,2252,2253],{"class":440},"new",[381,2255,2256],{"class":554}," Article",[381,2258,2259],{"class":454},"(),",[381,2261,2072],{"class":387},[381,2263,567],{"class":454},[381,2265,607],{"class":595},[381,2267,2268],{"class":391},"article-template",[381,2270,596],{"class":595},[381,2272,604],{"class":454},[381,2274,2275],{"class":387}," routeName",[381,2277,567],{"class":454},[381,2279,607],{"class":595},[381,2281,2282],{"class":391},"article-1",[381,2284,596],{"class":595},[381,2286,615],{"class":454},[381,2288,2289],{"class":383,"line":458},[381,2290,2291],{"class":454},"    })\n",[381,2293,2294,2296,2298,2300,2302,2304,2307,2309,2312,2314,2316,2318,2320,2322,2324,2326],{"class":383,"line":463},[381,2295,1336],{"class":422},[381,2297,1689],{"class":547},[381,2299,551],{"class":454},[381,2301,1996],{"class":519},[381,2303,1181],{"class":454},[381,2305,2306],{"class":440},"array",[381,2308,557],{"class":454},[381,2310,2311],{"class":560},"childBuilders",[381,2313,564],{"class":454},[381,2315,1193],{"class":440},[381,2317,1196],{"class":454},[381,2319,561],{"class":560},[381,2321,564],{"class":454},[381,2323,567],{"class":422},[381,2325,1206],{"class":440},[381,2327,1209],{"class":454},[381,2329,2330,2334,2336,2339,2342,2344,2346,2348],{"class":383,"line":489},[381,2331,2333],{"class":2332},"sm4w6","        foreach",[381,2335,1196],{"class":454},[381,2337,2338],{"class":560},"childBuilders ",[381,2340,2341],{"class":422},"as",[381,2343,557],{"class":454},[381,2345,2005],{"class":560},[381,2347,564],{"class":454},[381,2349,1209],{"class":454},[381,2351,2352,2355,2358,2360,2362,2365],{"class":383,"line":511},[381,2353,2354],{"class":454},"            $",[381,2356,2357],{"class":560},"link ",[381,2359,977],{"class":422},[381,2361,2025],{"class":440},[381,2363,2364],{"class":554}," NavigationLink",[381,2366,689],{"class":454},[381,2368,2369,2371,2374,2376,2378,2380,2382,2384,2386,2388],{"class":383,"line":516},[381,2370,2354],{"class":454},[381,2372,2373],{"class":560},"link",[381,2375,587],{"class":422},[381,2377,974],{"class":560},[381,2379,977],{"class":422},[381,2381,557],{"class":454},[381,2383,2005],{"class":560},[381,2385,587],{"class":422},[381,2387,1622],{"class":547},[381,2389,689],{"class":454},[381,2391,2392,2394,2396,2398,2400,2402,2404],{"class":383,"line":532},[381,2393,2354],{"class":454},[381,2395,561],{"class":560},[381,2397,587],{"class":422},[381,2399,1523],{"class":547},[381,2401,1258],{"class":454},[381,2403,2373],{"class":560},[381,2405,615],{"class":454},[381,2407,2408],{"class":383,"line":538},[381,2409,2410],{"class":454},"        }\n",[381,2412,2413,2415,2417,2419,2421],{"class":383,"line":573},[381,2414,582],{"class":454},[381,2416,561],{"class":560},[381,2418,587],{"class":422},[381,2420,686],{"class":547},[381,2422,689],{"class":454},[381,2424,2425],{"class":383,"line":579},[381,2426,2100],{"class":454},[815,2428,2430,2433,2434,2437],{"id":2429},"groupbuilder-from-any-group-call",[355,2431,2432],{},"GroupBuilder"," — from any ",[355,2435,2436],{},"->group()"," call",[372,2439,2441],{"className":413,"code":2440,"language":415,"meta":377,"style":377},"->add(AbstractComponent $component, ?int $sort = null): self\n->pageDataPosition(string $pageDataClass, string $propertyName, ?int $sort = null): self\n",[355,2442,2443,2479],{"__ignoreMap":377},[381,2444,2445,2447,2449,2451,2453,2455,2457,2459,2461,2464,2466,2469,2471,2473,2475,2477],{"class":383,"line":384},[381,2446,587],{"class":422},[381,2448,1255],{"class":547},[381,2450,551],{"class":454},[381,2452,1546],{"class":426},[381,2454,557],{"class":454},[381,2456,1523],{"class":560},[381,2458,604],{"class":454},[381,2460,1911],{"class":422},[381,2462,2463],{"class":519},"int",[381,2465,557],{"class":454},[381,2467,2468],{"class":560},"sort ",[381,2470,977],{"class":422},[381,2472,980],{"class":472},[381,2474,564],{"class":560},[381,2476,567],{"class":422},[381,2478,1836],{"class":519},[381,2480,2481,2483,2486,2488,2490,2492,2495,2497,2499,2501,2504,2506,2508,2510,2512,2514,2516,2518,2520,2522],{"class":383,"line":430},[381,2482,587],{"class":422},[381,2484,2485],{"class":547},"pageDataPosition",[381,2487,551],{"class":454},[381,2489,840],{"class":519},[381,2491,557],{"class":454},[381,2493,2494],{"class":560},"pageDataClass",[381,2496,604],{"class":454},[381,2498,850],{"class":519},[381,2500,557],{"class":454},[381,2502,2503],{"class":560},"propertyName",[381,2505,604],{"class":454},[381,2507,1911],{"class":422},[381,2509,2463],{"class":519},[381,2511,557],{"class":454},[381,2513,2468],{"class":560},[381,2515,977],{"class":422},[381,2517,980],{"class":472},[381,2519,564],{"class":560},[381,2521,567],{"class":422},[381,2523,1836],{"class":519},[351,2525,2526,2529,2530,2533],{},[355,2527,2528],{},"add()"," creates a ",[355,2531,2532],{},"ComponentPosition"," pointing to the component. Sort values auto-increment by 10 unless specified.",[351,2535,2536,2539,2540,2542,2543,2545,2546,2549],{},[355,2537,2538],{},"pageDataPosition()"," creates a position bound to a field on a specific ",[355,2541,1489],{}," class — used in template pages where a region renders a component held by the associated data record. ",[355,2544,2494],{}," must be the fully-qualified class name of an ",[355,2547,2548],{},"AbstractPageData"," subclass registered as an API Platform resource:",[372,2551,2553],{"className":413,"code":2552,"language":415,"meta":377,"style":377},"$cwa->page('blog-template', 'BlogPageTemplate', layout: 'main', isTemplate: true)\n    ->group('content')\n        ->pageDataPosition(BlogArticle::class, 'headline')  \u002F\u002F renders BlogArticle->headline component\n        ->pageDataPosition(BlogArticle::class, 'body');     \u002F\u002F renders BlogArticle->body component\n",[355,2554,2555,2603,2620,2651],{"__ignoreMap":377},[381,2556,2557,2559,2561,2563,2565,2567,2569,2571,2573,2575,2577,2579,2581,2583,2585,2587,2589,2591,2593,2595,2597,2599,2601],{"class":383,"line":384},[381,2558,829],{"class":454},[381,2560,561],{"class":560},[381,2562,587],{"class":422},[381,2564,627],{"class":547},[381,2566,551],{"class":454},[381,2568,596],{"class":595},[381,2570,1950],{"class":391},[381,2572,596],{"class":595},[381,2574,604],{"class":454},[381,2576,607],{"class":595},[381,2578,1959],{"class":391},[381,2580,596],{"class":595},[381,2582,604],{"class":454},[381,2584,650],{"class":387},[381,2586,567],{"class":454},[381,2588,607],{"class":595},[381,2590,599],{"class":391},[381,2592,596],{"class":595},[381,2594,604],{"class":454},[381,2596,1978],{"class":387},[381,2598,567],{"class":454},[381,2600,1983],{"class":472},[381,2602,1232],{"class":454},[381,2604,2605,2607,2609,2611,2613,2616,2618],{"class":383,"line":430},[381,2606,1336],{"class":422},[381,2608,1240],{"class":547},[381,2610,551],{"class":454},[381,2612,596],{"class":595},[381,2614,2615],{"class":391},"content",[381,2617,596],{"class":595},[381,2619,1232],{"class":454},[381,2621,2622,2625,2627,2629,2632,2635,2637,2639,2641,2644,2646,2648],{"class":383,"line":437},[381,2623,2624],{"class":422},"        ->",[381,2626,2485],{"class":547},[381,2628,551],{"class":454},[381,2630,2631],{"class":554},"BlogArticle",[381,2633,2634],{"class":422},"::",[381,2636,520],{"class":440},[381,2638,604],{"class":454},[381,2640,607],{"class":595},[381,2642,2643],{"class":391},"headline",[381,2645,596],{"class":595},[381,2647,564],{"class":454},[381,2649,2650],{"class":754},"  \u002F\u002F renders BlogArticle->headline component\n",[381,2652,2653,2655,2657,2659,2661,2663,2665,2667,2669,2672,2674,2677],{"class":383,"line":458},[381,2654,2624],{"class":422},[381,2656,2485],{"class":547},[381,2658,551],{"class":454},[381,2660,2631],{"class":554},[381,2662,2634],{"class":422},[381,2664,520],{"class":440},[381,2666,604],{"class":454},[381,2668,607],{"class":595},[381,2670,2671],{"class":391},"body",[381,2673,596],{"class":595},[381,2675,2676],{"class":454},");",[381,2678,2679],{"class":754},"     \u002F\u002F renders BlogArticle->body component\n",[815,2681,2683,1709,2685],{"id":2682},"componentbuilder-from-cwa-component",[355,2684,1561],{},[355,2686,2687],{},"$cwa->component()",[372,2689,2691],{"className":413,"code":2690,"language":415,"meta":377,"style":377},"->group(string $name, array $allow = [], ...): GroupBuilder\n",[355,2692,2693],{"__ignoreMap":377},[381,2694,2695,2697,2699,2701,2703,2705,2707,2709,2712,2714,2716,2718,2721,2723,2725],{"class":383,"line":384},[381,2696,587],{"class":422},[381,2698,1240],{"class":547},[381,2700,551],{"class":454},[381,2702,840],{"class":519},[381,2704,557],{"class":454},[381,2706,1734],{"class":560},[381,2708,604],{"class":454},[381,2710,2711],{"class":519}," array",[381,2713,557],{"class":454},[381,2715,1746],{"class":560},[381,2717,977],{"class":422},[381,2719,2720],{"class":454}," [],",[381,2722,1875],{"class":422},[381,2724,858],{"class":454},[381,2726,1793],{"class":426},[351,2728,2729],{},"For components that contain other components (e.g. a carousel with slide children):",[372,2731,2733],{"className":413,"code":2732,"language":415,"meta":377,"style":377},"$carousel = new Carousel();\n$cwa->component($carousel)\n    ->group('slides', allow: [Slide::class])\n        ->add(new Slide())\n        ->add(new Slide());\n",[355,2734,2735,2751,2768,2803,2819],{"__ignoreMap":377},[381,2736,2737,2739,2742,2744,2746,2749],{"class":383,"line":384},[381,2738,829],{"class":454},[381,2740,2741],{"class":560},"carousel ",[381,2743,977],{"class":422},[381,2745,2025],{"class":440},[381,2747,2748],{"class":554}," Carousel",[381,2750,689],{"class":454},[381,2752,2753,2755,2757,2759,2761,2763,2766],{"class":383,"line":430},[381,2754,829],{"class":454},[381,2756,561],{"class":560},[381,2758,587],{"class":422},[381,2760,1523],{"class":547},[381,2762,1258],{"class":454},[381,2764,2765],{"class":560},"carousel",[381,2767,1232],{"class":454},[381,2769,2770,2772,2774,2776,2778,2781,2783,2785,2788,2790,2793,2796,2798,2800],{"class":383,"line":437},[381,2771,1336],{"class":422},[381,2773,1240],{"class":547},[381,2775,551],{"class":454},[381,2777,596],{"class":595},[381,2779,2780],{"class":391},"slides",[381,2782,596],{"class":595},[381,2784,604],{"class":454},[381,2786,2787],{"class":387}," allow",[381,2789,567],{"class":454},[381,2791,2792],{"class":454}," [",[381,2794,2795],{"class":554},"Slide",[381,2797,2634],{"class":422},[381,2799,520],{"class":440},[381,2801,2802],{"class":454},"])\n",[381,2804,2805,2807,2809,2811,2813,2816],{"class":383,"line":458},[381,2806,2624],{"class":422},[381,2808,1255],{"class":547},[381,2810,551],{"class":454},[381,2812,2253],{"class":440},[381,2814,2815],{"class":554}," Slide",[381,2817,2818],{"class":454},"())\n",[381,2820,2821,2823,2825,2827,2829,2831],{"class":383,"line":463},[381,2822,2624],{"class":422},[381,2824,1255],{"class":547},[381,2826,551],{"class":454},[381,2828,2253],{"class":440},[381,2830,2815],{"class":554},[381,2832,2833],{"class":454},"());\n",[808,2835],{},[360,2837,2839,2842],{"id":2838},"locationreference-shared-groups",[355,2840,2841],{},"locationReference"," — Shared Groups",[351,2844,2845,2846,2848,2849,2852,2853,2855,2856,2859],{},"By default a ",[355,2847,1799],{}," reference is ",[355,2850,2851],{},"\"{groupName}_{ownerIri}\"",". If ",[355,2854,2841],{}," is set, the reference becomes ",[355,2857,2858],{},"\"{groupName}_{locationReference}\""," — stable across environments and shared across multiple owners.",[351,2861,2862],{},"This is how a single navigation group can serve multiple layouts:",[372,2864,2866],{"className":413,"code":2865,"language":415,"meta":377,"style":377},"\u002F\u002F Both layouts share the same ComponentGroup record\n$cwa->layout('primary', 'CwaLayoutPrimary')\n    ->group('nav', allow: [NavigationLink::class], locationReference: 'global-nav');\n\n$cwa->layout('minimal', 'CwaLayoutMinimal')\n    ->group('nav', allow: [NavigationLink::class], locationReference: 'global-nav');\n",[355,2867,2868,2873,2902,2948,2952,2982],{"__ignoreMap":377},[381,2869,2870],{"class":383,"line":384},[381,2871,2872],{"class":754},"\u002F\u002F Both layouts share the same ComponentGroup record\n",[381,2874,2875,2877,2879,2881,2883,2885,2887,2890,2892,2894,2896,2898,2900],{"class":383,"line":430},[381,2876,829],{"class":454},[381,2878,561],{"class":560},[381,2880,587],{"class":422},[381,2882,590],{"class":547},[381,2884,551],{"class":454},[381,2886,596],{"class":595},[381,2888,2889],{"class":391},"primary",[381,2891,596],{"class":595},[381,2893,604],{"class":454},[381,2895,607],{"class":595},[381,2897,610],{"class":391},[381,2899,596],{"class":595},[381,2901,1232],{"class":454},[381,2903,2904,2906,2908,2910,2912,2915,2917,2919,2921,2923,2925,2927,2929,2931,2934,2937,2939,2941,2944,2946],{"class":383,"line":437},[381,2905,1336],{"class":422},[381,2907,1240],{"class":547},[381,2909,551],{"class":454},[381,2911,596],{"class":595},[381,2913,2914],{"class":391},"nav",[381,2916,596],{"class":595},[381,2918,604],{"class":454},[381,2920,2787],{"class":387},[381,2922,567],{"class":454},[381,2924,2792],{"class":454},[381,2926,1652],{"class":554},[381,2928,2634],{"class":422},[381,2930,520],{"class":440},[381,2932,2933],{"class":454},"],",[381,2935,2936],{"class":387}," locationReference",[381,2938,567],{"class":454},[381,2940,607],{"class":595},[381,2942,2943],{"class":391},"global-nav",[381,2945,596],{"class":595},[381,2947,615],{"class":454},[381,2949,2950],{"class":383,"line":458},[381,2951,434],{"emptyLinePlaceholder":433},[381,2953,2954,2956,2958,2960,2962,2964,2966,2969,2971,2973,2975,2978,2980],{"class":383,"line":463},[381,2955,829],{"class":454},[381,2957,561],{"class":560},[381,2959,587],{"class":422},[381,2961,590],{"class":547},[381,2963,551],{"class":454},[381,2965,596],{"class":595},[381,2967,2968],{"class":391},"minimal",[381,2970,596],{"class":595},[381,2972,604],{"class":454},[381,2974,607],{"class":595},[381,2976,2977],{"class":391},"CwaLayoutMinimal",[381,2979,596],{"class":595},[381,2981,1232],{"class":454},[381,2983,2984,2986,2988,2990,2992,2994,2996,2998,3000,3002,3004,3006,3008,3010,3012,3014,3016,3018,3020,3022],{"class":383,"line":489},[381,2985,1336],{"class":422},[381,2987,1240],{"class":547},[381,2989,551],{"class":454},[381,2991,596],{"class":595},[381,2993,2914],{"class":391},[381,2995,596],{"class":595},[381,2997,604],{"class":454},[381,2999,2787],{"class":387},[381,3001,567],{"class":454},[381,3003,2792],{"class":454},[381,3005,1652],{"class":554},[381,3007,2634],{"class":422},[381,3009,520],{"class":440},[381,3011,2933],{"class":454},[381,3013,2936],{"class":387},[381,3015,567],{"class":454},[381,3017,607],{"class":595},[381,3019,2943],{"class":391},[381,3021,596],{"class":595},[381,3023,615],{"class":454},[351,3025,3026,3027,3030,3031,3033],{},"The Vue ",[355,3028,3029],{},"\u003CCwaComponentGroup>"," with the matching ",[355,3032,2841],{}," prop renders this shared group.",[808,3035],{},[360,3037,3039],{"id":3038},"flush-phases","Flush Phases",[351,3041,3042,3043,3045],{},"Every ",[355,3044,357],{}," call runs the full sequence. Each phase is idempotent — it tracks what it has already processed and only does new work:",[3047,3048,3049,3062],"table",{},[3050,3051,3052],"thead",{},[3053,3054,3055,3059],"tr",{},[3056,3057,3058],"th",{},"Phase",[3056,3060,3061],{},"What happens",[3063,3064,3065,3080,3093,3107,3120],"tbody",{},[3053,3066,3067,3074],{},[3068,3069,3070],"td",{},[3071,3072,3073],"strong",{},"1",[3068,3075,3076,3077,3079],{},"Persist layouts, pages, pageData, components; create ComponentGroups. Skips already-persisted entities. Calls ",[355,3078,1696],{}," only if anything new was added.",[3053,3081,3082,3086],{},[3068,3083,3084],{},[3071,3085,1886],{},[3068,3087,3088,3089,3092],{},"Evaluate ",[355,3090,3091],{},"->nested()"," closures. Each closure is tracked by object ID and runs at most once.",[3053,3094,3095,3100],{},[3068,3096,3097],{},[3071,3098,3099],{},"3",[3068,3101,3102,3103,3106],{},"Call ",[355,3104,3105],{},"RouteGenerator::create()"," for entities that don't yet have a route, in parent-before-child order.",[3053,3108,3109,3114],{},[3068,3110,3111],{},[3071,3112,3113],{},"3.5",[3068,3115,3116,3117,3119],{},"Fire ",[355,3118,1689],{}," callbacks. Each callback fires at most once.",[3053,3121,3122,3127],{},[3068,3123,3124],{},[3071,3125,3126],{},"4",[3068,3128,3129,3130,3132],{},"Create ",[355,3131,2532],{}," entities for all registered group builders. Picks up any positions added since the last call.",[351,3134,3135,3136,3138],{},"Because every phase is idempotent, you can call ",[355,3137,357],{}," as many times as you like — for example once to create routes, then again after wiring nav links that reference those routes.",[808,3140],{},[360,3142,3144],{"id":3143},"complete-example","Complete Example",[351,3146,3147],{},"This example creates a layout with a shared nav, a home page with a hero component, a blog template with two articles, and nav links pointing to each page:",[372,3149,3151],{"className":413,"code":3150,"language":415,"meta":377,"style":377},"\u003C?php\n\nnamespace App\\DataFixtures;\n\nuse App\\Entity\\BlogArticle;\nuse App\\Entity\\Hero;\nuse App\\Entity\\NavigationLink;\nuse Silverback\\ApiComponentsBundle\\Fixture\\AbstractCwaScaffold;\nuse Silverback\\ApiComponentsBundle\\Fixture\\CwaFixtureBuilder;\n\nclass AppFixtures extends AbstractCwaScaffold\n{\n    public function build(CwaFixtureBuilder $cwa): void\n    {\n        \u002F\u002F Layout with a shared nav group\n        $navGroup = $cwa->layout('main', 'CwaLayoutPrimary')\n            ->group('nav', allow: [NavigationLink::class], locationReference: 'global-nav');\n\n        \u002F\u002F Home page with a hero component\n        $hero = new Hero();\n        $hero->headline = 'Welcome';\n\n        $cwa->page('home', 'PrimaryPageTemplate', layout: 'main', route: '\u002F', routeName: 'home')\n            ->title('Home')\n            ->group('hero')->add($hero)\n            ->group('content');\n\n        \u002F\u002F Blog template — no route (isTemplate: true)\n        $cwa->page('blog-template', 'BlogPageTemplate', layout: 'main', isTemplate: true)\n            ->group('body')->pageDataPosition(BlogArticle::class, 'body');\n\n        \u002F\u002F Two blog articles\n        $article1 = new BlogArticle();\n        $article1->title = 'First Post';\n        $cwa->pageData($article1, template: 'blog-template', route: '\u002Fblog\u002Ffirst-post', routeName: 'article-1');\n\n        $article2 = new BlogArticle();\n        $article2->title = 'Second Post';\n        $cwa->pageData($article2, template: 'blog-template', route: '\u002Fblog\u002Fsecond-post', routeName: 'article-2');\n\n        \u002F\u002F Phase 1–3: persist everything and create routes\n        $cwa->flush();\n\n        \u002F\u002F Now use named routes to build nav links\n        $homeLink = new NavigationLink();\n        $homeLink->label = 'Home';\n        $homeLink->route = $cwa->getRoute('home');\n\n        $blogLink = new NavigationLink();\n        $blogLink->label = 'Blog';\n        $blogLink->rawPath = '\u002Fblog\u002Ffirst-post';\n\n        $cwa->component($homeLink);\n        $cwa->component($blogLink);\n\n        \u002F\u002F Add to the shared nav group\n        $navGroup->add($homeLink)->add($blogLink);\n\n        \u002F\u002F Phase 4: create the nav ComponentPositions\n        $cwa->flush();\n    }\n}\n",[355,3152,3153,3159,3163,3175,3179,3196,3213,3229,3249,3269,3273,3283,3287,3309,3313,3318,3353,3396,3401,3407,3424,3447,3452,3517,3534,3561,3578,3583,3589,3638,3677,3682,3688,3704,3726,3779,3784,3800,3823,3878,3883,3889,3902,3907,3913,3929,3952,3983,3988,4004,4027,4049,4054,4071,4088,4093,4099,4127,4132,4138,4151,4156],{"__ignoreMap":377},[381,3154,3155,3157],{"class":383,"line":384},[381,3156,423],{"class":422},[381,3158,427],{"class":426},[381,3160,3161],{"class":383,"line":430},[381,3162,434],{"emptyLinePlaceholder":433},[381,3164,3165,3167,3169,3171,3173],{"class":383,"line":437},[381,3166,441],{"class":440},[381,3168,444],{"class":387},[381,3170,448],{"class":447},[381,3172,451],{"class":387},[381,3174,455],{"class":454},[381,3176,3177],{"class":383,"line":458},[381,3178,434],{"emptyLinePlaceholder":433},[381,3180,3181,3183,3185,3187,3190,3192,3194],{"class":383,"line":463},[381,3182,466],{"class":440},[381,3184,444],{"class":426},[381,3186,448],{"class":472},[381,3188,3189],{"class":426},"Entity",[381,3191,448],{"class":472},[381,3193,2631],{"class":426},[381,3195,455],{"class":454},[381,3197,3198,3200,3202,3204,3206,3208,3211],{"class":383,"line":489},[381,3199,466],{"class":440},[381,3201,444],{"class":426},[381,3203,448],{"class":472},[381,3205,3189],{"class":426},[381,3207,448],{"class":472},[381,3209,3210],{"class":426},"Hero",[381,3212,455],{"class":454},[381,3214,3215,3217,3219,3221,3223,3225,3227],{"class":383,"line":511},[381,3216,466],{"class":440},[381,3218,444],{"class":426},[381,3220,448],{"class":472},[381,3222,3189],{"class":426},[381,3224,448],{"class":472},[381,3226,1652],{"class":426},[381,3228,455],{"class":454},[381,3230,3231,3233,3235,3237,3239,3241,3243,3245,3247],{"class":383,"line":516},[381,3232,466],{"class":440},[381,3234,469],{"class":426},[381,3236,448],{"class":472},[381,3238,475],{"class":426},[381,3240,448],{"class":472},[381,3242,480],{"class":426},[381,3244,448],{"class":472},[381,3246,405],{"class":426},[381,3248,455],{"class":454},[381,3250,3251,3253,3255,3257,3259,3261,3263,3265,3267],{"class":383,"line":532},[381,3252,466],{"class":440},[381,3254,469],{"class":426},[381,3256,448],{"class":472},[381,3258,475],{"class":426},[381,3260,448],{"class":472},[381,3262,480],{"class":426},[381,3264,448],{"class":472},[381,3266,506],{"class":426},[381,3268,455],{"class":454},[381,3270,3271],{"class":383,"line":538},[381,3272,434],{"emptyLinePlaceholder":433},[381,3274,3275,3277,3279,3281],{"class":383,"line":573},[381,3276,520],{"class":519},[381,3278,523],{"class":387},[381,3280,526],{"class":519},[381,3282,529],{"class":387},[381,3284,3285],{"class":383,"line":579},[381,3286,535],{"class":454},[381,3288,3289,3291,3293,3295,3297,3299,3301,3303,3305,3307],{"class":383,"line":618},[381,3290,541],{"class":519},[381,3292,544],{"class":519},[381,3294,548],{"class":547},[381,3296,551],{"class":454},[381,3298,506],{"class":554},[381,3300,557],{"class":454},[381,3302,561],{"class":560},[381,3304,564],{"class":454},[381,3306,567],{"class":422},[381,3308,570],{"class":440},[381,3310,3311],{"class":383,"line":677},[381,3312,576],{"class":454},[381,3314,3315],{"class":383,"line":692},[381,3316,3317],{"class":754},"        \u002F\u002F Layout with a shared nav group\n",[381,3319,3320,3322,3325,3327,3329,3331,3333,3335,3337,3339,3341,3343,3345,3347,3349,3351],{"class":383,"line":698},[381,3321,582],{"class":454},[381,3323,3324],{"class":560},"navGroup ",[381,3326,977],{"class":422},[381,3328,557],{"class":454},[381,3330,561],{"class":560},[381,3332,587],{"class":422},[381,3334,590],{"class":547},[381,3336,551],{"class":454},[381,3338,596],{"class":595},[381,3340,599],{"class":391},[381,3342,596],{"class":595},[381,3344,604],{"class":454},[381,3346,607],{"class":595},[381,3348,610],{"class":391},[381,3350,596],{"class":595},[381,3352,1232],{"class":454},[381,3354,3356,3358,3360,3362,3364,3366,3368,3370,3372,3374,3376,3378,3380,3382,3384,3386,3388,3390,3392,3394],{"class":383,"line":3355},17,[381,3357,1237],{"class":422},[381,3359,1240],{"class":547},[381,3361,551],{"class":454},[381,3363,596],{"class":595},[381,3365,2914],{"class":391},[381,3367,596],{"class":595},[381,3369,604],{"class":454},[381,3371,2787],{"class":387},[381,3373,567],{"class":454},[381,3375,2792],{"class":454},[381,3377,1652],{"class":554},[381,3379,2634],{"class":422},[381,3381,520],{"class":440},[381,3383,2933],{"class":454},[381,3385,2936],{"class":387},[381,3387,567],{"class":454},[381,3389,607],{"class":595},[381,3391,2943],{"class":391},[381,3393,596],{"class":595},[381,3395,615],{"class":454},[381,3397,3399],{"class":383,"line":3398},18,[381,3400,434],{"emptyLinePlaceholder":433},[381,3402,3404],{"class":383,"line":3403},19,[381,3405,3406],{"class":754},"        \u002F\u002F Home page with a hero component\n",[381,3408,3410,3412,3415,3417,3419,3422],{"class":383,"line":3409},20,[381,3411,582],{"class":454},[381,3413,3414],{"class":560},"hero ",[381,3416,977],{"class":422},[381,3418,2025],{"class":440},[381,3420,3421],{"class":554}," Hero",[381,3423,689],{"class":454},[381,3425,3427,3429,3431,3433,3436,3438,3440,3443,3445],{"class":383,"line":3426},21,[381,3428,582],{"class":454},[381,3430,1199],{"class":560},[381,3432,587],{"class":422},[381,3434,3435],{"class":560},"headline ",[381,3437,977],{"class":422},[381,3439,607],{"class":595},[381,3441,3442],{"class":391},"Welcome",[381,3444,596],{"class":595},[381,3446,455],{"class":454},[381,3448,3450],{"class":383,"line":3449},22,[381,3451,434],{"emptyLinePlaceholder":433},[381,3453,3455,3457,3459,3461,3463,3465,3467,3469,3471,3473,3475,3477,3479,3481,3483,3485,3487,3489,3491,3493,3495,3497,3499,3501,3503,3505,3507,3509,3511,3513,3515],{"class":383,"line":3454},23,[381,3456,582],{"class":454},[381,3458,561],{"class":560},[381,3460,587],{"class":422},[381,3462,627],{"class":547},[381,3464,551],{"class":454},[381,3466,596],{"class":595},[381,3468,634],{"class":391},[381,3470,596],{"class":595},[381,3472,604],{"class":454},[381,3474,607],{"class":595},[381,3476,643],{"class":391},[381,3478,596],{"class":595},[381,3480,604],{"class":454},[381,3482,650],{"class":387},[381,3484,567],{"class":454},[381,3486,607],{"class":595},[381,3488,599],{"class":391},[381,3490,596],{"class":595},[381,3492,604],{"class":454},[381,3494,663],{"class":387},[381,3496,567],{"class":454},[381,3498,607],{"class":595},[381,3500,670],{"class":391},[381,3502,596],{"class":595},[381,3504,604],{"class":454},[381,3506,2275],{"class":387},[381,3508,567],{"class":454},[381,3510,607],{"class":595},[381,3512,634],{"class":391},[381,3514,596],{"class":595},[381,3516,1232],{"class":454},[381,3518,3520,3522,3524,3526,3528,3530,3532],{"class":383,"line":3519},24,[381,3521,1237],{"class":422},[381,3523,1220],{"class":547},[381,3525,551],{"class":454},[381,3527,596],{"class":595},[381,3529,1227],{"class":391},[381,3531,596],{"class":595},[381,3533,1232],{"class":454},[381,3535,3537,3539,3541,3543,3545,3547,3549,3551,3553,3555,3557,3559],{"class":383,"line":3536},25,[381,3538,1237],{"class":422},[381,3540,1240],{"class":547},[381,3542,551],{"class":454},[381,3544,596],{"class":595},[381,3546,1199],{"class":391},[381,3548,596],{"class":595},[381,3550,564],{"class":454},[381,3552,587],{"class":422},[381,3554,1255],{"class":547},[381,3556,1258],{"class":454},[381,3558,1199],{"class":560},[381,3560,1232],{"class":454},[381,3562,3564,3566,3568,3570,3572,3574,3576],{"class":383,"line":3563},26,[381,3565,1237],{"class":422},[381,3567,1240],{"class":547},[381,3569,551],{"class":454},[381,3571,596],{"class":595},[381,3573,2615],{"class":391},[381,3575,596],{"class":595},[381,3577,615],{"class":454},[381,3579,3581],{"class":383,"line":3580},27,[381,3582,434],{"emptyLinePlaceholder":433},[381,3584,3586],{"class":383,"line":3585},28,[381,3587,3588],{"class":754},"        \u002F\u002F Blog template — no route (isTemplate: true)\n",[381,3590,3592,3594,3596,3598,3600,3602,3604,3606,3608,3610,3612,3614,3616,3618,3620,3622,3624,3626,3628,3630,3632,3634,3636],{"class":383,"line":3591},29,[381,3593,582],{"class":454},[381,3595,561],{"class":560},[381,3597,587],{"class":422},[381,3599,627],{"class":547},[381,3601,551],{"class":454},[381,3603,596],{"class":595},[381,3605,1950],{"class":391},[381,3607,596],{"class":595},[381,3609,604],{"class":454},[381,3611,607],{"class":595},[381,3613,1959],{"class":391},[381,3615,596],{"class":595},[381,3617,604],{"class":454},[381,3619,650],{"class":387},[381,3621,567],{"class":454},[381,3623,607],{"class":595},[381,3625,599],{"class":391},[381,3627,596],{"class":595},[381,3629,604],{"class":454},[381,3631,1978],{"class":387},[381,3633,567],{"class":454},[381,3635,1983],{"class":472},[381,3637,1232],{"class":454},[381,3639,3641,3643,3645,3647,3649,3651,3653,3655,3657,3659,3661,3663,3665,3667,3669,3671,3673,3675],{"class":383,"line":3640},30,[381,3642,1237],{"class":422},[381,3644,1240],{"class":547},[381,3646,551],{"class":454},[381,3648,596],{"class":595},[381,3650,2671],{"class":391},[381,3652,596],{"class":595},[381,3654,564],{"class":454},[381,3656,587],{"class":422},[381,3658,2485],{"class":547},[381,3660,551],{"class":454},[381,3662,2631],{"class":554},[381,3664,2634],{"class":422},[381,3666,520],{"class":440},[381,3668,604],{"class":454},[381,3670,607],{"class":595},[381,3672,2671],{"class":391},[381,3674,596],{"class":595},[381,3676,615],{"class":454},[381,3678,3680],{"class":383,"line":3679},31,[381,3681,434],{"emptyLinePlaceholder":433},[381,3683,3685],{"class":383,"line":3684},32,[381,3686,3687],{"class":754},"        \u002F\u002F Two blog articles\n",[381,3689,3691,3693,3696,3698,3700,3702],{"class":383,"line":3690},33,[381,3692,582],{"class":454},[381,3694,3695],{"class":560},"article1 ",[381,3697,977],{"class":422},[381,3699,2025],{"class":440},[381,3701,2028],{"class":554},[381,3703,689],{"class":454},[381,3705,3707,3709,3712,3714,3716,3718,3720,3722,3724],{"class":383,"line":3706},34,[381,3708,582],{"class":454},[381,3710,3711],{"class":560},"article1",[381,3713,587],{"class":422},[381,3715,2042],{"class":560},[381,3717,977],{"class":422},[381,3719,607],{"class":595},[381,3721,2049],{"class":391},[381,3723,596],{"class":595},[381,3725,455],{"class":454},[381,3727,3729,3731,3733,3735,3737,3739,3741,3743,3745,3747,3749,3751,3753,3755,3757,3759,3761,3763,3765,3767,3769,3771,3773,3775,3777],{"class":383,"line":3728},35,[381,3730,582],{"class":454},[381,3732,561],{"class":560},[381,3734,587],{"class":422},[381,3736,1396],{"class":547},[381,3738,1258],{"class":454},[381,3740,3711],{"class":560},[381,3742,604],{"class":454},[381,3744,2072],{"class":387},[381,3746,567],{"class":454},[381,3748,607],{"class":595},[381,3750,1950],{"class":391},[381,3752,596],{"class":595},[381,3754,604],{"class":454},[381,3756,663],{"class":387},[381,3758,567],{"class":454},[381,3760,607],{"class":595},[381,3762,2091],{"class":391},[381,3764,596],{"class":595},[381,3766,604],{"class":454},[381,3768,2275],{"class":387},[381,3770,567],{"class":454},[381,3772,607],{"class":595},[381,3774,2282],{"class":391},[381,3776,596],{"class":595},[381,3778,615],{"class":454},[381,3780,3782],{"class":383,"line":3781},36,[381,3783,434],{"emptyLinePlaceholder":433},[381,3785,3787,3789,3792,3794,3796,3798],{"class":383,"line":3786},37,[381,3788,582],{"class":454},[381,3790,3791],{"class":560},"article2 ",[381,3793,977],{"class":422},[381,3795,2025],{"class":440},[381,3797,2028],{"class":554},[381,3799,689],{"class":454},[381,3801,3803,3805,3808,3810,3812,3814,3816,3819,3821],{"class":383,"line":3802},38,[381,3804,582],{"class":454},[381,3806,3807],{"class":560},"article2",[381,3809,587],{"class":422},[381,3811,2042],{"class":560},[381,3813,977],{"class":422},[381,3815,607],{"class":595},[381,3817,3818],{"class":391},"Second Post",[381,3820,596],{"class":595},[381,3822,455],{"class":454},[381,3824,3826,3828,3830,3832,3834,3836,3838,3840,3842,3844,3846,3848,3850,3852,3854,3856,3858,3861,3863,3865,3867,3869,3871,3874,3876],{"class":383,"line":3825},39,[381,3827,582],{"class":454},[381,3829,561],{"class":560},[381,3831,587],{"class":422},[381,3833,1396],{"class":547},[381,3835,1258],{"class":454},[381,3837,3807],{"class":560},[381,3839,604],{"class":454},[381,3841,2072],{"class":387},[381,3843,567],{"class":454},[381,3845,607],{"class":595},[381,3847,1950],{"class":391},[381,3849,596],{"class":595},[381,3851,604],{"class":454},[381,3853,663],{"class":387},[381,3855,567],{"class":454},[381,3857,607],{"class":595},[381,3859,3860],{"class":391},"\u002Fblog\u002Fsecond-post",[381,3862,596],{"class":595},[381,3864,604],{"class":454},[381,3866,2275],{"class":387},[381,3868,567],{"class":454},[381,3870,607],{"class":595},[381,3872,3873],{"class":391},"article-2",[381,3875,596],{"class":595},[381,3877,615],{"class":454},[381,3879,3881],{"class":383,"line":3880},40,[381,3882,434],{"emptyLinePlaceholder":433},[381,3884,3886],{"class":383,"line":3885},41,[381,3887,3888],{"class":754},"        \u002F\u002F Phase 1–3: persist everything and create routes\n",[381,3890,3892,3894,3896,3898,3900],{"class":383,"line":3891},42,[381,3893,582],{"class":454},[381,3895,561],{"class":560},[381,3897,587],{"class":422},[381,3899,686],{"class":547},[381,3901,689],{"class":454},[381,3903,3905],{"class":383,"line":3904},43,[381,3906,434],{"emptyLinePlaceholder":433},[381,3908,3910],{"class":383,"line":3909},44,[381,3911,3912],{"class":754},"        \u002F\u002F Now use named routes to build nav links\n",[381,3914,3916,3918,3921,3923,3925,3927],{"class":383,"line":3915},45,[381,3917,582],{"class":454},[381,3919,3920],{"class":560},"homeLink ",[381,3922,977],{"class":422},[381,3924,2025],{"class":440},[381,3926,2364],{"class":554},[381,3928,689],{"class":454},[381,3930,3932,3934,3937,3939,3942,3944,3946,3948,3950],{"class":383,"line":3931},46,[381,3933,582],{"class":454},[381,3935,3936],{"class":560},"homeLink",[381,3938,587],{"class":422},[381,3940,3941],{"class":560},"label ",[381,3943,977],{"class":422},[381,3945,607],{"class":595},[381,3947,1227],{"class":391},[381,3949,596],{"class":595},[381,3951,455],{"class":454},[381,3953,3955,3957,3959,3961,3963,3965,3967,3969,3971,3973,3975,3977,3979,3981],{"class":383,"line":3954},47,[381,3956,582],{"class":454},[381,3958,3936],{"class":560},[381,3960,587],{"class":422},[381,3962,974],{"class":560},[381,3964,977],{"class":422},[381,3966,557],{"class":454},[381,3968,561],{"class":560},[381,3970,587],{"class":422},[381,3972,1622],{"class":547},[381,3974,551],{"class":454},[381,3976,596],{"class":595},[381,3978,634],{"class":391},[381,3980,596],{"class":595},[381,3982,615],{"class":454},[381,3984,3986],{"class":383,"line":3985},48,[381,3987,434],{"emptyLinePlaceholder":433},[381,3989,3991,3993,3996,3998,4000,4002],{"class":383,"line":3990},49,[381,3992,582],{"class":454},[381,3994,3995],{"class":560},"blogLink ",[381,3997,977],{"class":422},[381,3999,2025],{"class":440},[381,4001,2364],{"class":554},[381,4003,689],{"class":454},[381,4005,4007,4009,4012,4014,4016,4018,4020,4023,4025],{"class":383,"line":4006},50,[381,4008,582],{"class":454},[381,4010,4011],{"class":560},"blogLink",[381,4013,587],{"class":422},[381,4015,3941],{"class":560},[381,4017,977],{"class":422},[381,4019,607],{"class":595},[381,4021,4022],{"class":391},"Blog",[381,4024,596],{"class":595},[381,4026,455],{"class":454},[381,4028,4030,4032,4034,4036,4039,4041,4043,4045,4047],{"class":383,"line":4029},51,[381,4031,582],{"class":454},[381,4033,4011],{"class":560},[381,4035,587],{"class":422},[381,4037,4038],{"class":560},"rawPath ",[381,4040,977],{"class":422},[381,4042,607],{"class":595},[381,4044,2091],{"class":391},[381,4046,596],{"class":595},[381,4048,455],{"class":454},[381,4050,4052],{"class":383,"line":4051},52,[381,4053,434],{"emptyLinePlaceholder":433},[381,4055,4057,4059,4061,4063,4065,4067,4069],{"class":383,"line":4056},53,[381,4058,582],{"class":454},[381,4060,561],{"class":560},[381,4062,587],{"class":422},[381,4064,1523],{"class":547},[381,4066,1258],{"class":454},[381,4068,3936],{"class":560},[381,4070,615],{"class":454},[381,4072,4074,4076,4078,4080,4082,4084,4086],{"class":383,"line":4073},54,[381,4075,582],{"class":454},[381,4077,561],{"class":560},[381,4079,587],{"class":422},[381,4081,1523],{"class":547},[381,4083,1258],{"class":454},[381,4085,4011],{"class":560},[381,4087,615],{"class":454},[381,4089,4091],{"class":383,"line":4090},55,[381,4092,434],{"emptyLinePlaceholder":433},[381,4094,4096],{"class":383,"line":4095},56,[381,4097,4098],{"class":754},"        \u002F\u002F Add to the shared nav group\n",[381,4100,4102,4104,4107,4109,4111,4113,4115,4117,4119,4121,4123,4125],{"class":383,"line":4101},57,[381,4103,582],{"class":454},[381,4105,4106],{"class":560},"navGroup",[381,4108,587],{"class":422},[381,4110,1255],{"class":547},[381,4112,1258],{"class":454},[381,4114,3936],{"class":560},[381,4116,564],{"class":454},[381,4118,587],{"class":422},[381,4120,1255],{"class":547},[381,4122,1258],{"class":454},[381,4124,4011],{"class":560},[381,4126,615],{"class":454},[381,4128,4130],{"class":383,"line":4129},58,[381,4131,434],{"emptyLinePlaceholder":433},[381,4133,4135],{"class":383,"line":4134},59,[381,4136,4137],{"class":754},"        \u002F\u002F Phase 4: create the nav ComponentPositions\n",[381,4139,4141,4143,4145,4147,4149],{"class":383,"line":4140},60,[381,4142,582],{"class":454},[381,4144,561],{"class":560},[381,4146,587],{"class":422},[381,4148,686],{"class":547},[381,4150,689],{"class":454},[381,4152,4154],{"class":383,"line":4153},61,[381,4155,695],{"class":454},[381,4157,4159],{"class":383,"line":4158},62,[381,4160,701],{"class":454},[808,4162],{},[360,4164,4166],{"id":4165},"route-generation-rules","Route Generation Rules",[3047,4168,4169,4179],{},[3050,4170,4171],{},[3053,4172,4173,4176],{},[3056,4174,4175],{},"Situation",[3056,4177,4178],{},"Result",[3063,4180,4181,4192,4205,4217,4236,4254],{},[3053,4182,4183,4189],{},[3068,4184,4185,4188],{},[355,4186,4187],{},"route: '\u002Fpath'"," explicit",[3068,4190,4191],{},"Creates a Route at that path",[3053,4193,4194,4199],{},[3068,4195,4196],{},[355,4197,4198],{},"routeName: 'name'",[3068,4200,4201,4202],{},"Also names the route for ",[355,4203,4204],{},"getRoute('name')",[3053,4206,4207,4214],{},[3068,4208,4209,4211,4212],{},[355,4210,1090],{},", no ",[355,4213,1072],{},[3068,4215,4216],{},"No Route created",[3053,4218,4219,4227],{},[3068,4220,4221,4222,4224,4225],{},"No ",[355,4223,1072],{},", has ",[355,4226,1220],{},[3068,4228,4229,4232,4233],{},[355,4230,4231],{},"RouteGenerator"," slugifies the title → ",[355,4234,4235],{},"\u002Fmy-title",[3053,4237,4238,4246],{},[3068,4239,4240,4242,4243,4245],{},[355,4241,1380],{}," inside ",[355,4244,3091],{},", no route",[3068,4247,4248,4250,4251],{},[355,4249,4231],{}," → ",[355,4252,4253],{},"\u002Fparent-path\u002Fslug",[3053,4255,4256,4263],{},[3068,4257,4221,4258,4211,4260,4262],{},[355,4259,1072],{},[355,4261,1220],{},", top-level",[3068,4264,4265],{},"No Route (draft)",[808,4267],{},[360,4269,4271],{"id":4270},"seeding-html-content","Seeding HTML Content",[351,4273,4274,4275,4278,4279,4282],{},"When seeding components that have HTML body fields (e.g. a rich-text ",[355,4276,4277],{},"HtmlContent"," entity), you need structured placeholder HTML rather than a raw lorem ipsum string. The bundle ships ",[355,4280,4281],{},"HtmlContentPlaceholder"," as a registered service — inject it directly into your fixture class:",[372,4284,4286],{"className":413,"code":4285,"language":415,"meta":377,"style":377},"use Silverback\\ApiComponentsBundle\\Fixture\\AbstractCwaScaffold;\nuse Silverback\\ApiComponentsBundle\\Fixture\\CwaFixtureBuilder;\nuse Silverback\\ApiComponentsBundle\\Fixture\\Placeholder\\HtmlContentPlaceholder;\n\nclass AppFixtures extends AbstractCwaScaffold\n{\n    public function __construct(private readonly HtmlContentPlaceholder $placeholder)\n    {\n    }\n\n    public function build(CwaFixtureBuilder $cwa): void\n    {\n        $content = new HtmlContent();\n        $content->html = $this->placeholder->generate([\n            'paragraphs'      => 4,\n            'paragraphLength' => HtmlContentPlaceholder::LENGTH_MEDIUM,\n            'includeHeadings' => true,\n            'includeLists'    => true,\n            'includeQuotes'   => false,\n            'includeCode'     => false,\n            'includeLinks'    => true,\n            'format'          => HtmlContentPlaceholder::FORMAT_HTML,\n        ]);\n\n        $cwa->component($content);\n    }\n}\n",[355,4287,4288,4308,4328,4353,4357,4367,4371,4399,4403,4407,4411,4433,4437,4453,4481,4500,4521,4536,4552,4568,4584,4599,4620,4625,4629,4645,4649],{"__ignoreMap":377},[381,4289,4290,4292,4294,4296,4298,4300,4302,4304,4306],{"class":383,"line":384},[381,4291,466],{"class":440},[381,4293,469],{"class":426},[381,4295,448],{"class":472},[381,4297,475],{"class":426},[381,4299,448],{"class":472},[381,4301,480],{"class":426},[381,4303,448],{"class":472},[381,4305,405],{"class":426},[381,4307,455],{"class":454},[381,4309,4310,4312,4314,4316,4318,4320,4322,4324,4326],{"class":383,"line":430},[381,4311,466],{"class":440},[381,4313,469],{"class":426},[381,4315,448],{"class":472},[381,4317,475],{"class":426},[381,4319,448],{"class":472},[381,4321,480],{"class":426},[381,4323,448],{"class":472},[381,4325,506],{"class":426},[381,4327,455],{"class":454},[381,4329,4330,4332,4334,4336,4338,4340,4342,4344,4347,4349,4351],{"class":383,"line":437},[381,4331,466],{"class":440},[381,4333,469],{"class":426},[381,4335,448],{"class":472},[381,4337,475],{"class":426},[381,4339,448],{"class":472},[381,4341,480],{"class":426},[381,4343,448],{"class":472},[381,4345,4346],{"class":426},"Placeholder",[381,4348,448],{"class":472},[381,4350,4281],{"class":426},[381,4352,455],{"class":454},[381,4354,4355],{"class":383,"line":458},[381,4356,434],{"emptyLinePlaceholder":433},[381,4358,4359,4361,4363,4365],{"class":383,"line":463},[381,4360,520],{"class":519},[381,4362,523],{"class":387},[381,4364,526],{"class":519},[381,4366,529],{"class":387},[381,4368,4369],{"class":383,"line":489},[381,4370,535],{"class":454},[381,4372,4373,4375,4377,4381,4383,4386,4389,4392,4394,4397],{"class":383,"line":511},[381,4374,541],{"class":519},[381,4376,544],{"class":519},[381,4378,4380],{"class":4379},"s3Ny6"," __construct",[381,4382,551],{"class":454},[381,4384,4385],{"class":519},"private",[381,4387,4388],{"class":519}," readonly",[381,4390,4391],{"class":554}," HtmlContentPlaceholder",[381,4393,557],{"class":454},[381,4395,4396],{"class":560},"placeholder",[381,4398,1232],{"class":454},[381,4400,4401],{"class":383,"line":516},[381,4402,576],{"class":454},[381,4404,4405],{"class":383,"line":532},[381,4406,695],{"class":454},[381,4408,4409],{"class":383,"line":538},[381,4410,434],{"emptyLinePlaceholder":433},[381,4412,4413,4415,4417,4419,4421,4423,4425,4427,4429,4431],{"class":383,"line":573},[381,4414,541],{"class":519},[381,4416,544],{"class":519},[381,4418,548],{"class":547},[381,4420,551],{"class":454},[381,4422,506],{"class":554},[381,4424,557],{"class":454},[381,4426,561],{"class":560},[381,4428,564],{"class":454},[381,4430,567],{"class":422},[381,4432,570],{"class":440},[381,4434,4435],{"class":383,"line":579},[381,4436,576],{"class":454},[381,4438,4439,4441,4444,4446,4448,4451],{"class":383,"line":618},[381,4440,582],{"class":454},[381,4442,4443],{"class":560},"content ",[381,4445,977],{"class":422},[381,4447,2025],{"class":440},[381,4449,4450],{"class":554}," HtmlContent",[381,4452,689],{"class":454},[381,4454,4455,4457,4459,4461,4464,4466,4469,4471,4473,4475,4478],{"class":383,"line":677},[381,4456,582],{"class":454},[381,4458,2615],{"class":560},[381,4460,587],{"class":422},[381,4462,4463],{"class":560},"html ",[381,4465,977],{"class":422},[381,4467,4468],{"class":472}," $this",[381,4470,587],{"class":422},[381,4472,4396],{"class":560},[381,4474,587],{"class":422},[381,4476,4477],{"class":547},"generate",[381,4479,4480],{"class":454},"([\n",[381,4482,4483,4486,4489,4491,4494,4498],{"class":383,"line":692},[381,4484,4485],{"class":595},"            '",[381,4487,4488],{"class":391},"paragraphs",[381,4490,596],{"class":595},[381,4492,4493],{"class":422},"      =>",[381,4495,4497],{"class":4496},"scSvc"," 4",[381,4499,942],{"class":454},[381,4501,4502,4504,4507,4509,4512,4514,4516,4519],{"class":383,"line":698},[381,4503,4485],{"class":595},[381,4505,4506],{"class":391},"paragraphLength",[381,4508,596],{"class":595},[381,4510,4511],{"class":422}," =>",[381,4513,4391],{"class":554},[381,4515,2634],{"class":422},[381,4517,4518],{"class":426},"LENGTH_MEDIUM",[381,4520,942],{"class":454},[381,4522,4523,4525,4528,4530,4532,4534],{"class":383,"line":3355},[381,4524,4485],{"class":595},[381,4526,4527],{"class":391},"includeHeadings",[381,4529,596],{"class":595},[381,4531,4511],{"class":422},[381,4533,1983],{"class":472},[381,4535,942],{"class":454},[381,4537,4538,4540,4543,4545,4548,4550],{"class":383,"line":3398},[381,4539,4485],{"class":595},[381,4541,4542],{"class":391},"includeLists",[381,4544,596],{"class":595},[381,4546,4547],{"class":422},"    =>",[381,4549,1983],{"class":472},[381,4551,942],{"class":454},[381,4553,4554,4556,4559,4561,4564,4566],{"class":383,"line":3403},[381,4555,4485],{"class":595},[381,4557,4558],{"class":391},"includeQuotes",[381,4560,596],{"class":595},[381,4562,4563],{"class":422},"   =>",[381,4565,1014],{"class":472},[381,4567,942],{"class":454},[381,4569,4570,4572,4575,4577,4580,4582],{"class":383,"line":3409},[381,4571,4485],{"class":595},[381,4573,4574],{"class":391},"includeCode",[381,4576,596],{"class":595},[381,4578,4579],{"class":422},"     =>",[381,4581,1014],{"class":472},[381,4583,942],{"class":454},[381,4585,4586,4588,4591,4593,4595,4597],{"class":383,"line":3426},[381,4587,4485],{"class":595},[381,4589,4590],{"class":391},"includeLinks",[381,4592,596],{"class":595},[381,4594,4547],{"class":422},[381,4596,1983],{"class":472},[381,4598,942],{"class":454},[381,4600,4601,4603,4606,4608,4611,4613,4615,4618],{"class":383,"line":3449},[381,4602,4485],{"class":595},[381,4604,4605],{"class":391},"format",[381,4607,596],{"class":595},[381,4609,4610],{"class":422},"          =>",[381,4612,4391],{"class":554},[381,4614,2634],{"class":422},[381,4616,4617],{"class":426},"FORMAT_HTML",[381,4619,942],{"class":454},[381,4621,4622],{"class":383,"line":3454},[381,4623,4624],{"class":454},"        ]);\n",[381,4626,4627],{"class":383,"line":3519},[381,4628,434],{"emptyLinePlaceholder":433},[381,4630,4631,4633,4635,4637,4639,4641,4643],{"class":383,"line":3536},[381,4632,582],{"class":454},[381,4634,561],{"class":560},[381,4636,587],{"class":422},[381,4638,1523],{"class":547},[381,4640,1258],{"class":454},[381,4642,2615],{"class":560},[381,4644,615],{"class":454},[381,4646,4647],{"class":383,"line":3563},[381,4648,695],{"class":454},[381,4650,4651],{"class":383,"line":3580},[381,4652,701],{"class":454},[351,4654,4221,4655,4657,4658,4661],{},[355,4656,737],{}," entry needed — the bundle registers it automatically as ",[355,4659,4660],{},"silverback.api_components.fixture.html_content_placeholder",".",[815,4663,4665],{"id":4664},"options","Options",[3047,4667,4668,4684],{},[3050,4669,4670],{},[3053,4671,4672,4675,4678,4681],{},[3056,4673,4674],{},"Option",[3056,4676,4677],{},"Type",[3056,4679,4680],{},"Default",[3056,4682,4683],{},"Description",[3063,4685,4686,4703,4721,4744,4767,4786,4806,4828],{},[3053,4687,4688,4692,4696,4700],{},[3068,4689,4690],{},[355,4691,4488],{},[3068,4693,4694],{},[355,4695,2463],{},[3068,4697,4698],{},[355,4699,3099],{},[3068,4701,4702],{},"Number of paragraphs to generate",[3053,4704,4705,4709,4713,4718],{},[3068,4706,4707],{},[355,4708,4506],{},[3068,4710,4711],{},[355,4712,840],{},[3068,4714,4715],{},[355,4716,4717],{},"'medium'",[3068,4719,4720],{},"Sentence density per paragraph",[3053,4722,4723,4727,4732,4737],{},[3068,4724,4725],{},[355,4726,4527],{},[3068,4728,4729],{},[355,4730,4731],{},"bool",[3068,4733,4734],{},[355,4735,4736],{},"false",[3068,4738,4739,4740,4743],{},"Inject ",[355,4741,4742],{},"\u003Ch2>"," elements between paragraphs",[3053,4745,4746,4750,4754,4758],{},[3068,4747,4748],{},[355,4749,4542],{},[3068,4751,4752],{},[355,4753,4731],{},[3068,4755,4756],{},[355,4757,4736],{},[3068,4759,4739,4760,670,4763,4766],{},[355,4761,4762],{},"\u003Cul>",[355,4764,4765],{},"\u003Col>"," elements",[3053,4768,4769,4773,4777,4781],{},[3068,4770,4771],{},[355,4772,4558],{},[3068,4774,4775],{},[355,4776,4731],{},[3068,4778,4779],{},[355,4780,4736],{},[3068,4782,4739,4783,4766],{},[355,4784,4785],{},"\u003Cblockquote>",[3053,4787,4788,4792,4796,4800],{},[3068,4789,4790],{},[355,4791,4574],{},[3068,4793,4794],{},[355,4795,4731],{},[3068,4797,4798],{},[355,4799,4736],{},[3068,4801,4739,4802,4805],{},[355,4803,4804],{},"\u003Cpre>\u003Ccode>"," blocks",[3053,4807,4808,4812,4816,4821],{},[3068,4809,4810],{},[355,4811,4590],{},[3068,4813,4814],{},[355,4815,4731],{},[3068,4817,4818],{},[355,4819,4820],{},"true",[3068,4822,4823,4824,4827],{},"Insert ",[355,4825,4826],{},"\u003Ca>"," tags inside paragraph text",[3053,4829,4830,4834,4838,4843],{},[3068,4831,4832],{},[355,4833,4605],{},[3068,4835,4836],{},[355,4837,840],{},[3068,4839,4840],{},[355,4841,4842],{},"'html'",[3068,4844,4845,4847,4848],{},[355,4846,4842],{}," or ",[355,4849,4850],{},"'plaintext'",[815,4852,4854],{"id":4853},"constants","Constants",[372,4856,4858],{"className":413,"code":4857,"language":415,"meta":377,"style":377},"HtmlContentPlaceholder::LENGTH_SHORT    \u002F\u002F 1–2 sentences per paragraph\nHtmlContentPlaceholder::LENGTH_MEDIUM   \u002F\u002F 3–4 sentences (default)\nHtmlContentPlaceholder::LENGTH_LONG     \u002F\u002F 5–7 sentences\n\nHtmlContentPlaceholder::FORMAT_HTML      \u002F\u002F returns HTML tags\nHtmlContentPlaceholder::FORMAT_PLAINTEXT \u002F\u002F returns plain text\n",[355,4859,4860,4872,4883,4895,4899,4910],{"__ignoreMap":377},[381,4861,4862,4864,4866,4869],{"class":383,"line":384},[381,4863,4281],{"class":554},[381,4865,2634],{"class":422},[381,4867,4868],{"class":426},"LENGTH_SHORT",[381,4870,4871],{"class":754},"    \u002F\u002F 1–2 sentences per paragraph\n",[381,4873,4874,4876,4878,4880],{"class":383,"line":430},[381,4875,4281],{"class":554},[381,4877,2634],{"class":422},[381,4879,4518],{"class":426},[381,4881,4882],{"class":754},"   \u002F\u002F 3–4 sentences (default)\n",[381,4884,4885,4887,4889,4892],{"class":383,"line":437},[381,4886,4281],{"class":554},[381,4888,2634],{"class":422},[381,4890,4891],{"class":426},"LENGTH_LONG",[381,4893,4894],{"class":754},"     \u002F\u002F 5–7 sentences\n",[381,4896,4897],{"class":383,"line":458},[381,4898,434],{"emptyLinePlaceholder":433},[381,4900,4901,4903,4905,4907],{"class":383,"line":463},[381,4902,4281],{"class":554},[381,4904,2634],{"class":422},[381,4906,4617],{"class":426},[381,4908,4909],{"class":754},"      \u002F\u002F returns HTML tags\n",[381,4911,4912,4914,4916,4919],{"class":383,"line":489},[381,4913,4281],{"class":554},[381,4915,2634],{"class":422},[381,4917,4918],{"class":426},"FORMAT_PLAINTEXT",[381,4920,4921],{"class":754}," \u002F\u002F returns plain text\n",[351,4923,4924,4925,4928],{},"The class uses ",[355,4926,4927],{},"protected"," properties and methods so you can extend it to swap in your own paragraph templates, headings, or link phrases.",[351,4930,4931,4932,4935,4936,4939],{},"You can also call ",[355,4933,4934],{},"setOptions()"," to set defaults for all subsequent ",[355,4937,4938],{},"generate()"," calls on the same instance:",[372,4941,4943],{"className":413,"code":4942,"language":415,"meta":377,"style":377},"$this->placeholder->setOptions(['paragraphLength' => HtmlContentPlaceholder::LENGTH_SHORT]);\n$shortHtml  = $this->placeholder->generate();\n$shortHtml2 = $this->placeholder->generate(); \u002F\u002F same defaults apply\n",[355,4944,4945,4979,5000],{"__ignoreMap":377},[381,4946,4947,4950,4952,4954,4956,4959,4962,4964,4966,4968,4970,4972,4974,4976],{"class":383,"line":384},[381,4948,4949],{"class":472},"$this",[381,4951,587],{"class":422},[381,4953,4396],{"class":560},[381,4955,587],{"class":422},[381,4957,4958],{"class":547},"setOptions",[381,4960,4961],{"class":454},"([",[381,4963,596],{"class":595},[381,4965,4506],{"class":391},[381,4967,596],{"class":595},[381,4969,4511],{"class":422},[381,4971,4391],{"class":554},[381,4973,2634],{"class":422},[381,4975,4868],{"class":426},[381,4977,4978],{"class":454},"]);\n",[381,4980,4981,4983,4986,4988,4990,4992,4994,4996,4998],{"class":383,"line":430},[381,4982,829],{"class":454},[381,4984,4985],{"class":560},"shortHtml  ",[381,4987,977],{"class":422},[381,4989,4468],{"class":472},[381,4991,587],{"class":422},[381,4993,4396],{"class":560},[381,4995,587],{"class":422},[381,4997,4477],{"class":547},[381,4999,689],{"class":454},[381,5001,5002,5004,5007,5009,5011,5013,5015,5017,5019,5022],{"class":383,"line":437},[381,5003,829],{"class":454},[381,5005,5006],{"class":560},"shortHtml2 ",[381,5008,977],{"class":422},[381,5010,4468],{"class":472},[381,5012,587],{"class":422},[381,5014,4396],{"class":560},[381,5016,587],{"class":422},[381,5018,4477],{"class":547},[381,5020,5021],{"class":454},"();",[381,5023,5024],{"class":754}," \u002F\u002F same defaults apply\n",[360,5026,5028],{"id":5027},"working-with-iris","Working with IRIs",[351,5030,5031,5032,4847,5035,5038,5039,5041,5042,5045,5046,5049],{},"API Platform identifies every resource by its IRI (Internationalized Resource Identifier) — the URL path the API exposes it at, e.g. ",[355,5033,5034],{},"\u002F_\u002Froutes\u002F018e4b…",[355,5036,5037],{},"\u002F_\u002Fpages\u002F018e4c…",". ",[355,5040,506],{}," uses IRIs internally for ",[355,5043,5044],{},"ComponentGroup.location"," and ",[355,5047,5048],{},"ComponentGroup.allowedComponents",", but you may need them directly in your own fixture code when a custom entity stores an IRI string field pointing to another API Platform resource.",[351,5051,5052,5053,5059],{},"See the ",[1682,5054,5058],{"href":5055,"rel":5056},"https:\u002F\u002Fapi-platform.com\u002Fdocs\u002Fcore\u002Firi\u002F",[5057],"nofollow","API Platform IRI documentation"," for the full reference on how IRIs are generated and resolved.",[351,5061,4739,5062,5065],{},[355,5063,5064],{},"ApiPlatform\\Metadata\\IriConverterInterface"," into your fixture class alongside the builder:",[372,5067,5069],{"className":413,"code":5068,"language":415,"meta":377,"style":377},"use ApiPlatform\\Metadata\\IriConverterInterface;\nuse Silverback\\ApiComponentsBundle\\Fixture\\AbstractCwaScaffold;\nuse Silverback\\ApiComponentsBundle\\Fixture\\CwaFixtureBuilder;\n\nclass AppFixtures extends AbstractCwaScaffold\n{\n    public function __construct(private readonly IriConverterInterface $iriConverter)\n    {\n    }\n\n    public function build(CwaFixtureBuilder $cwa): void\n    {\n        \u002F\u002F ...\n    }\n}\n",[355,5070,5071,5090,5110,5130,5134,5144,5148,5172,5176,5180,5184,5206,5210,5215,5219],{"__ignoreMap":377},[381,5072,5073,5075,5078,5080,5083,5085,5088],{"class":383,"line":384},[381,5074,466],{"class":440},[381,5076,5077],{"class":426}," ApiPlatform",[381,5079,448],{"class":472},[381,5081,5082],{"class":426},"Metadata",[381,5084,448],{"class":472},[381,5086,5087],{"class":426},"IriConverterInterface",[381,5089,455],{"class":454},[381,5091,5092,5094,5096,5098,5100,5102,5104,5106,5108],{"class":383,"line":430},[381,5093,466],{"class":440},[381,5095,469],{"class":426},[381,5097,448],{"class":472},[381,5099,475],{"class":426},[381,5101,448],{"class":472},[381,5103,480],{"class":426},[381,5105,448],{"class":472},[381,5107,405],{"class":426},[381,5109,455],{"class":454},[381,5111,5112,5114,5116,5118,5120,5122,5124,5126,5128],{"class":383,"line":437},[381,5113,466],{"class":440},[381,5115,469],{"class":426},[381,5117,448],{"class":472},[381,5119,475],{"class":426},[381,5121,448],{"class":472},[381,5123,480],{"class":426},[381,5125,448],{"class":472},[381,5127,506],{"class":426},[381,5129,455],{"class":454},[381,5131,5132],{"class":383,"line":458},[381,5133,434],{"emptyLinePlaceholder":433},[381,5135,5136,5138,5140,5142],{"class":383,"line":463},[381,5137,520],{"class":519},[381,5139,523],{"class":387},[381,5141,526],{"class":519},[381,5143,529],{"class":387},[381,5145,5146],{"class":383,"line":489},[381,5147,535],{"class":454},[381,5149,5150,5152,5154,5156,5158,5160,5162,5165,5167,5170],{"class":383,"line":511},[381,5151,541],{"class":519},[381,5153,544],{"class":519},[381,5155,4380],{"class":4379},[381,5157,551],{"class":454},[381,5159,4385],{"class":519},[381,5161,4388],{"class":519},[381,5163,5164],{"class":554}," IriConverterInterface",[381,5166,557],{"class":454},[381,5168,5169],{"class":560},"iriConverter",[381,5171,1232],{"class":454},[381,5173,5174],{"class":383,"line":516},[381,5175,576],{"class":454},[381,5177,5178],{"class":383,"line":532},[381,5179,695],{"class":454},[381,5181,5182],{"class":383,"line":538},[381,5183,434],{"emptyLinePlaceholder":433},[381,5185,5186,5188,5190,5192,5194,5196,5198,5200,5202,5204],{"class":383,"line":573},[381,5187,541],{"class":519},[381,5189,544],{"class":519},[381,5191,548],{"class":547},[381,5193,551],{"class":454},[381,5195,506],{"class":554},[381,5197,557],{"class":454},[381,5199,561],{"class":560},[381,5201,564],{"class":454},[381,5203,567],{"class":422},[381,5205,570],{"class":440},[381,5207,5208],{"class":383,"line":579},[381,5209,576],{"class":454},[381,5211,5212],{"class":383,"line":618},[381,5213,5214],{"class":754},"        \u002F\u002F ...\n",[381,5216,5217],{"class":383,"line":677},[381,5218,695],{"class":454},[381,5220,5221],{"class":383,"line":692},[381,5222,701],{"class":454},[815,5224,5226],{"id":5225},"getting-the-iri-of-a-persisted-entity","Getting the IRI of a persisted entity",[372,5228,5230],{"className":413,"code":5229,"language":415,"meta":377,"style":377},"$page = $cwa->page('home', 'PrimaryPageTemplate', layout: 'main', route: '\u002F');\n$cwa->flush();\n\n\u002F\u002F After flush() the page entity has a database ID and a resolvable IRI\n$pageIri = $this->iriConverter->getIriFromResource($page->getEntity());\n\u002F\u002F e.g. \"\u002F_\u002Fpages\u002F018e4b9a-…\"\n",[355,5231,5232,5291,5303,5307,5312,5343],{"__ignoreMap":377},[381,5233,5234,5236,5239,5241,5243,5245,5247,5249,5251,5253,5255,5257,5259,5261,5263,5265,5267,5269,5271,5273,5275,5277,5279,5281,5283,5285,5287,5289],{"class":383,"line":384},[381,5235,829],{"class":454},[381,5237,5238],{"class":560},"page ",[381,5240,977],{"class":422},[381,5242,557],{"class":454},[381,5244,561],{"class":560},[381,5246,587],{"class":422},[381,5248,627],{"class":547},[381,5250,551],{"class":454},[381,5252,596],{"class":595},[381,5254,634],{"class":391},[381,5256,596],{"class":595},[381,5258,604],{"class":454},[381,5260,607],{"class":595},[381,5262,643],{"class":391},[381,5264,596],{"class":595},[381,5266,604],{"class":454},[381,5268,650],{"class":387},[381,5270,567],{"class":454},[381,5272,607],{"class":595},[381,5274,599],{"class":391},[381,5276,596],{"class":595},[381,5278,604],{"class":454},[381,5280,663],{"class":387},[381,5282,567],{"class":454},[381,5284,607],{"class":595},[381,5286,670],{"class":391},[381,5288,596],{"class":595},[381,5290,615],{"class":454},[381,5292,5293,5295,5297,5299,5301],{"class":383,"line":430},[381,5294,829],{"class":454},[381,5296,561],{"class":560},[381,5298,587],{"class":422},[381,5300,686],{"class":547},[381,5302,689],{"class":454},[381,5304,5305],{"class":383,"line":437},[381,5306,434],{"emptyLinePlaceholder":433},[381,5308,5309],{"class":383,"line":458},[381,5310,5311],{"class":754},"\u002F\u002F After flush() the page entity has a database ID and a resolvable IRI\n",[381,5313,5314,5316,5319,5321,5323,5325,5327,5329,5332,5334,5336,5338,5341],{"class":383,"line":463},[381,5315,829],{"class":454},[381,5317,5318],{"class":560},"pageIri ",[381,5320,977],{"class":422},[381,5322,4468],{"class":472},[381,5324,587],{"class":422},[381,5326,5169],{"class":560},[381,5328,587],{"class":422},[381,5330,5331],{"class":547},"getIriFromResource",[381,5333,1258],{"class":454},[381,5335,627],{"class":560},[381,5337,587],{"class":422},[381,5339,5340],{"class":547},"getEntity",[381,5342,2833],{"class":454},[381,5344,5345],{"class":383,"line":489},[381,5346,5347],{"class":754},"\u002F\u002F e.g. \"\u002F_\u002Fpages\u002F018e4b9a-…\"\n",[815,5349,5351],{"id":5350},"getting-the-iri-of-a-class-collection-endpoint","Getting the IRI of a class (collection endpoint)",[351,5353,5354,5355,5358,5359,5362],{},"If you need the collection endpoint IRI for a resource class — for example to populate a custom ",[355,5356,5357],{},"$targetCollection: string"," field on a component — pass the class name and a ",[355,5360,5361],{},"GetCollection"," operation:",[372,5364,5366],{"className":413,"code":5365,"language":415,"meta":377,"style":377},"use ApiPlatform\\Metadata\\GetCollection;\nuse Symfony\\Component\\Routing\\Generator\\UrlGeneratorInterface;\n\n$collectionIri = $this->iriConverter->getIriFromResource(\n    BlogArticle::class,\n    UrlGeneratorInterface::ABS_PATH,\n    (new GetCollection())->withClass(BlogArticle::class)\n);\n\u002F\u002F e.g. \"\u002F_\u002Fblog_articles\"\n",[355,5367,5368,5384,5412,5416,5437,5448,5460,5488,5492],{"__ignoreMap":377},[381,5369,5370,5372,5374,5376,5378,5380,5382],{"class":383,"line":384},[381,5371,466],{"class":440},[381,5373,5077],{"class":426},[381,5375,448],{"class":472},[381,5377,5082],{"class":426},[381,5379,448],{"class":472},[381,5381,5361],{"class":426},[381,5383,455],{"class":454},[381,5385,5386,5388,5391,5393,5395,5397,5400,5402,5405,5407,5410],{"class":383,"line":430},[381,5387,466],{"class":440},[381,5389,5390],{"class":426}," Symfony",[381,5392,448],{"class":472},[381,5394,213],{"class":426},[381,5396,448],{"class":472},[381,5398,5399],{"class":426},"Routing",[381,5401,448],{"class":472},[381,5403,5404],{"class":426},"Generator",[381,5406,448],{"class":472},[381,5408,5409],{"class":426},"UrlGeneratorInterface",[381,5411,455],{"class":454},[381,5413,5414],{"class":383,"line":437},[381,5415,434],{"emptyLinePlaceholder":433},[381,5417,5418,5420,5423,5425,5427,5429,5431,5433,5435],{"class":383,"line":458},[381,5419,829],{"class":454},[381,5421,5422],{"class":560},"collectionIri ",[381,5424,977],{"class":422},[381,5426,4468],{"class":472},[381,5428,587],{"class":422},[381,5430,5169],{"class":560},[381,5432,587],{"class":422},[381,5434,5331],{"class":547},[381,5436,930],{"class":454},[381,5438,5439,5442,5444,5446],{"class":383,"line":463},[381,5440,5441],{"class":554},"    BlogArticle",[381,5443,2634],{"class":422},[381,5445,520],{"class":440},[381,5447,942],{"class":454},[381,5449,5450,5453,5455,5458],{"class":383,"line":489},[381,5451,5452],{"class":554},"    UrlGeneratorInterface",[381,5454,2634],{"class":422},[381,5456,5457],{"class":426},"ABS_PATH",[381,5459,942],{"class":454},[381,5461,5462,5465,5467,5470,5473,5475,5478,5480,5482,5484,5486],{"class":383,"line":511},[381,5463,5464],{"class":454},"    (",[381,5466,2253],{"class":440},[381,5468,5469],{"class":554}," GetCollection",[381,5471,5472],{"class":454},"())",[381,5474,587],{"class":422},[381,5476,5477],{"class":547},"withClass",[381,5479,551],{"class":454},[381,5481,2631],{"class":554},[381,5483,2634],{"class":422},[381,5485,520],{"class":440},[381,5487,1232],{"class":454},[381,5489,5490],{"class":383,"line":516},[381,5491,615],{"class":454},[381,5493,5494],{"class":383,"line":532},[381,5495,5496],{"class":754},"\u002F\u002F e.g. \"\u002F_\u002Fblog_articles\"\n",[815,5498,5500],{"id":5499},"practical-example-redirect-entity","Practical example — redirect entity",[372,5502,5504],{"className":413,"code":5503,"language":415,"meta":377,"style":377},"$redirect = new Redirect();\n$redirect->from = '\u002Fold-path';\n$redirect->toIri = $this->iriConverter->getIriFromResource($targetPage);\n$cwa->persist($redirect);\n$cwa->flush();\n",[355,5505,5506,5522,5545,5575,5591],{"__ignoreMap":377},[381,5507,5508,5510,5513,5515,5517,5520],{"class":383,"line":384},[381,5509,829],{"class":454},[381,5511,5512],{"class":560},"redirect ",[381,5514,977],{"class":422},[381,5516,2025],{"class":440},[381,5518,5519],{"class":554}," Redirect",[381,5521,689],{"class":454},[381,5523,5524,5526,5529,5531,5534,5536,5538,5541,5543],{"class":383,"line":430},[381,5525,829],{"class":454},[381,5527,5528],{"class":560},"redirect",[381,5530,587],{"class":422},[381,5532,5533],{"class":560},"from ",[381,5535,977],{"class":422},[381,5537,607],{"class":595},[381,5539,5540],{"class":391},"\u002Fold-path",[381,5542,596],{"class":595},[381,5544,455],{"class":454},[381,5546,5547,5549,5551,5553,5556,5558,5560,5562,5564,5566,5568,5570,5573],{"class":383,"line":437},[381,5548,829],{"class":454},[381,5550,5528],{"class":560},[381,5552,587],{"class":422},[381,5554,5555],{"class":560},"toIri ",[381,5557,977],{"class":422},[381,5559,4468],{"class":472},[381,5561,587],{"class":422},[381,5563,5169],{"class":560},[381,5565,587],{"class":422},[381,5567,5331],{"class":547},[381,5569,1258],{"class":454},[381,5571,5572],{"class":560},"targetPage",[381,5574,615],{"class":454},[381,5576,5577,5579,5581,5583,5585,5587,5589],{"class":383,"line":458},[381,5578,829],{"class":454},[381,5580,561],{"class":560},[381,5582,587],{"class":422},[381,5584,1565],{"class":547},[381,5586,1258],{"class":454},[381,5588,5528],{"class":560},[381,5590,615],{"class":454},[381,5592,5593,5595,5597,5599,5601],{"class":383,"line":463},[381,5594,829],{"class":454},[381,5596,561],{"class":560},[381,5598,587],{"class":422},[381,5600,686],{"class":547},[381,5602,689],{"class":454},[5604,5605,5606],"blockquote",{},[351,5607,5608,5611,5612,5615,5616,5619,5620,5623,5624,5626],{},[3071,5609,5610],{},"Note:"," ",[355,5613,5614],{},"IriConverterInterface::getIriFromResource()"," requires the entity to already have a persisted ID. Call ",[355,5617,5618],{},"$cwa->flush()"," (or ",[355,5621,5622],{},"$manager->flush()"," inside an ",[355,5625,1689],{}," callback) before converting an entity that was just created.",[808,5628],{},[360,5630,5632],{"id":5631},"tips","Tips",[866,5634,5635,5644,5655,5660],{},[869,5636,5637,5638,4847,5641,5643],{},"You don't need to call ",[355,5639,5640],{},"$manager->persist()",[355,5642,5622],{}," yourself — the builder handles it",[869,5645,5646,5647,5650,5651,5654],{},"Timestamps (",[355,5648,5649],{},"createdAt",", ",[355,5652,5653],{},"modifiedAt",") are populated automatically",[869,5656,3102,5657,5659],{},[355,5658,357],{}," again any time you register new entities or positions after a previous call — all phases are idempotent and only process new work",[869,5661,5662,5664,5665,5667],{},[355,5663,2841],{}," is the correct way to share a group between two layouts — don't try to manually link the same ",[355,5666,1799],{}," to two owners",[5669,5670,5671],"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 .szhYu, html code.shiki .szhYu{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#C3E88D}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 .sVlFx, html code.shiki .sVlFx{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#89DDFF}html pre.shiki code .sc2zw, html code.shiki .sc2zw{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#BABED8}html pre.shiki code .stmX-, html code.shiki .stmX-{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F78C6C}html pre.shiki code .sn4go, html code.shiki .sn4go{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#89DDFF}html pre.shiki code .sOvfz, html code.shiki .sOvfz{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#89DDFF}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 .sKpYG, html code.shiki .sKpYG{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#82AAFF}html pre.shiki code .sbW4m, html code.shiki .sbW4m{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#FFCB6B}html pre.shiki code .sPB8G, html code.shiki .sPB8G{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#BABED8}html pre.shiki code .seSrl, html code.shiki .seSrl{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#89DDFF}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 .s-h7I, html code.shiki .s-h7I{--shiki-light:#22863A;--shiki-default:#85E89D;--shiki-dark:#F07178}html pre.shiki code .sm4w6, html code.shiki .sm4w6{--shiki-light:#D73A49;--shiki-light-font-style:inherit;--shiki-default:#F97583;--shiki-default-font-style:inherit;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s3Ny6, html code.shiki .s3Ny6{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#82AAFF}html pre.shiki code .scSvc, html code.shiki .scSvc{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#F78C6C}",{"title":377,"searchDepth":430,"depth":430,"links":5673},[5674,5675,5684,5696,5698,5699,5700,5701,5705,5710],{"id":362,"depth":430,"text":363},{"id":812,"depth":430,"text":813,"children":5676},[5677,5678,5679,5680,5681,5682,5683],{"id":590,"depth":437,"text":819},{"id":627,"depth":437,"text":877},{"id":1377,"depth":437,"text":1380},{"id":1523,"depth":437,"text":1526},{"id":1565,"depth":437,"text":1568},{"id":1604,"depth":437,"text":1082},{"id":686,"depth":437,"text":357},{"id":1702,"depth":430,"text":1703,"children":5685},[5686,5688,5690,5692,5694],{"id":1706,"depth":437,"text":5687},"LayoutBuilder — from $cwa->layout()",{"id":1807,"depth":437,"text":5689},"PageBuilder — from $cwa->page()",{"id":2103,"depth":437,"text":5691},"PageDataBuilder — from $cwa->pageData()",{"id":2429,"depth":437,"text":5693},"GroupBuilder — from any ->group() call",{"id":2682,"depth":437,"text":5695},"ComponentBuilder — from $cwa->component()",{"id":2838,"depth":430,"text":5697},"locationReference — Shared Groups",{"id":3038,"depth":430,"text":3039},{"id":3143,"depth":430,"text":3144},{"id":4165,"depth":430,"text":4166},{"id":4270,"depth":430,"text":4271,"children":5702},[5703,5704],{"id":4664,"depth":437,"text":4665},{"id":4853,"depth":437,"text":4854},{"id":5027,"depth":430,"text":5028,"children":5706},[5707,5708,5709],{"id":5225,"depth":437,"text":5226},{"id":5350,"depth":437,"text":5351},{"id":5499,"depth":437,"text":5500},{"id":5631,"depth":430,"text":5632},"Use AbstractCwaScaffold and CwaFixtureBuilder to seed your database with layouts, pages, routes, components, and page data in a fluent API.","md",null,{},{"title":125,"description":5711},"l_5ZGUvYaR4m2e5ZFPd4_5POemao-hV3XN503NFzWcA",[5718,5720],{"title":121,"path":122,"stem":123,"description":5719,"children":-1},"JWT cookie authentication, the AbstractUser entity, email verification, password reset, and Symfony security configuration.",{"title":129,"path":130,"stem":131,"description":5721,"children":-1},"Complete reference for all silverback_api_components bundle configuration options.",1782241280343]