[{"data":1,"prerenderedAt":1095},["ShallowReactive",2],{"navigation":3,"\u002Fapi\u002Fbundle-setup":358,"\u002Fapi\u002Fbundle-setup-surround":1090},[4,14,36,69,140,341],{"title":5,"path":6,"stem":7,"children":8},"Introduction","\u002Fgetting-started","1.getting-started\u002F1.index",[9,10],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation",{"title":15,"path":16,"stem":17,"children":18,"page":35},"Guides","\u002Fguides","2.guides",[19,23,27,31],{"title":20,"path":21,"stem":22},"Your First Layout","\u002Fguides\u002Fyour-first-layout","2.guides\u002F1.your-first-layout",{"title":24,"path":25,"stem":26},"Your First Page Template","\u002Fguides\u002Fyour-first-page-template","2.guides\u002F2.your-first-page-template",{"title":28,"path":29,"stem":30},"Your First Component","\u002Fguides\u002Fyour-first-component","2.guides\u002F3.your-first-component",{"title":32,"path":33,"stem":34},"Alternative UI Variants","\u002Fguides\u002Falternative-ui-variants","2.guides\u002F4.alternative-ui-variants",false,{"title":37,"path":38,"stem":39,"children":40,"page":35},"Core Concepts","\u002Fcore-concepts","3.core-concepts",[41,45,49,53,57,61,65],{"title":42,"path":43,"stem":44},"How It All Works","\u002Fcore-concepts\u002Farchitecture","3.core-concepts\u002F1.architecture",{"title":46,"path":47,"stem":48},"The Data Model","\u002Fcore-concepts\u002Fthe-data-model","3.core-concepts\u002F2.the-data-model",{"title":50,"path":51,"stem":52},"Layouts & Pages","\u002Fcore-concepts\u002Flayouts-and-pages","3.core-concepts\u002F3.layouts-and-pages",{"title":54,"path":55,"stem":56},"Dynamic Pages","\u002Fcore-concepts\u002Fdynamic-pages","3.core-concepts\u002F4.dynamic-pages",{"title":58,"path":59,"stem":60},"Components","\u002Fcore-concepts\u002Fcomponents","3.core-concepts\u002F5.components",{"title":62,"path":63,"stem":64},"Draft & Publish Workflow","\u002Fcore-concepts\u002Fdraft-and-publish","3.core-concepts\u002F6.draft-and-publish",{"title":66,"path":67,"stem":68},"The Admin Panel","\u002Fcore-concepts\u002Fadmin-panel","3.core-concepts\u002F7.admin-panel",{"title":70,"path":71,"stem":72,"children":73,"page":35},"Api","\u002Fapi","4.api",[74,78,116,120,124,128,132,136],{"title":75,"path":76,"stem":77},"Bundle Setup","\u002Fapi\u002Fbundle-setup","4.api\u002F1.bundle-setup",{"title":58,"path":79,"stem":80,"children":81,"page":35},"\u002Fapi\u002Fcomponents","4.api\u002F2.components",[82,86,103],{"title":83,"path":84,"stem":85},"Creating Components","\u002Fapi\u002Fcomponents\u002Fcreating-components","4.api\u002F2.components\u002F1.creating-components",{"title":87,"path":88,"stem":89,"children":90,"page":35},"Annotations","\u002Fapi\u002Fcomponents\u002Fannotations","4.api\u002F2.components\u002F2.annotations",[91,95,99],{"title":92,"path":93,"stem":94},"Publishable","\u002Fapi\u002Fcomponents\u002Fannotations\u002Fpublishable","4.api\u002F2.components\u002F2.annotations\u002F1.publishable",{"title":96,"path":97,"stem":98},"Uploadable","\u002Fapi\u002Fcomponents\u002Fannotations\u002Fuploadable","4.api\u002F2.components\u002F2.annotations\u002F2.uploadable",{"title":100,"path":101,"stem":102},"Timestamped","\u002Fapi\u002Fcomponents\u002Fannotations\u002Ftimestamped","4.api\u002F2.components\u002F2.annotations\u002F3.timestamped",{"title":104,"path":105,"stem":106,"children":107,"page":35},"Built Ins","\u002Fapi\u002Fcomponents\u002Fbuilt-ins","4.api\u002F2.components\u002F3.built-ins",[108,112],{"title":109,"path":110,"stem":111},"Collection Component","\u002Fapi\u002Fcomponents\u002Fbuilt-ins\u002Fcollection-component","4.api\u002F2.components\u002F3.built-ins\u002F1.collection-component",{"title":113,"path":114,"stem":115},"Form Component","\u002Fapi\u002Fcomponents\u002Fbuilt-ins\u002Fform-component","4.api\u002F2.components\u002F3.built-ins\u002F2.form-component",{"title":117,"path":118,"stem":119},"Dynamic & Nested Pages","\u002Fapi\u002Fdynamic-pages","4.api\u002F3.dynamic-pages",{"title":121,"path":122,"stem":123},"Users & Security","\u002Fapi\u002Fusers-and-security","4.api\u002F4.users-and-security",{"title":125,"path":126,"stem":127},"Data Fixtures","\u002Fapi\u002Fdata-fixtures","4.api\u002F5.data-fixtures",{"title":129,"path":130,"stem":131},"Configuration Reference","\u002Fapi\u002Fconfiguration","4.api\u002F6.configuration",{"title":133,"path":134,"stem":135},"Console Commands","\u002Fapi\u002Fconsole-commands","4.api\u002F7.console-commands",{"title":137,"path":138,"stem":139},"Debugging & Profiler","\u002Fapi\u002Fdebugging","4.api\u002F8.debugging",{"title":141,"path":142,"stem":143,"children":144,"page":35},"Nuxt Module","\u002Fnuxt-module","5.nuxt-module",[145,149,162,182,207,211,295,320,324],{"title":146,"path":147,"stem":148},"Module Setup","\u002Fnuxt-module\u002Fmodule-setup","5.nuxt-module\u002F1.module-setup",{"title":150,"path":151,"stem":152,"children":153,"page":35},"Configuration","\u002Fnuxt-module\u002Fconfiguration","5.nuxt-module\u002F2.configuration",[154,158],{"title":155,"path":156,"stem":157},"Nuxt Config","\u002Fnuxt-module\u002Fconfiguration\u002Fnuxt-config","5.nuxt-module\u002F2.configuration\u002F1.nuxt-config",{"title":159,"path":160,"stem":161},"Site Config & SEO","\u002Fnuxt-module\u002Fconfiguration\u002Fsite-config-and-seo","5.nuxt-module\u002F2.configuration\u002F2.site-config-and-seo",{"title":163,"path":164,"stem":165,"children":166,"page":35},"Building Your Ui","\u002Fnuxt-module\u002Fbuilding-your-ui","5.nuxt-module\u002F3.building-your-ui",[167,171,175,178],{"title":168,"path":169,"stem":170},"Layouts","\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcreating-layouts","5.nuxt-module\u002F3.building-your-ui\u002F1.creating-layouts",{"title":172,"path":173,"stem":174},"Page Templates","\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcreating-page-templates","5.nuxt-module\u002F3.building-your-ui\u002F2.creating-page-templates",{"title":83,"path":176,"stem":177},"\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcreating-components","5.nuxt-module\u002F3.building-your-ui\u002F3.creating-components",{"title":179,"path":180,"stem":181},"CLI Generator","\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcwa-cli","5.nuxt-module\u002F3.building-your-ui\u002F4.cwa-cli",{"title":183,"path":184,"stem":185,"children":186,"page":35},"Cwa Components","\u002Fnuxt-module\u002Fcwa-components","5.nuxt-module\u002F4.cwa-components",[187,191,195,199,203],{"title":188,"path":189,"stem":190},"\u003CCwaComponentGroup \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-component-group","5.nuxt-module\u002F4.cwa-components\u002F1.cwa-component-group",{"title":192,"path":193,"stem":194},"\u003CCwaPage \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-page","5.nuxt-module\u002F4.cwa-components\u002F2.cwa-page",{"title":196,"path":197,"stem":198},"\u003CCwaLink \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-link","5.nuxt-module\u002F4.cwa-components\u002F3.cwa-link",{"title":200,"path":201,"stem":202},"\u003CCwaImage \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-image","5.nuxt-module\u002F4.cwa-components\u002F4.cwa-image",{"title":204,"path":205,"stem":206},"\u003CCwaDefaultLayout \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-default-layout","5.nuxt-module\u002F4.cwa-components\u002F5.cwa-default-layout",{"title":208,"path":209,"stem":210},"The useCwa() API","\u002Fnuxt-module\u002Fcwa-api","5.nuxt-module\u002F5.cwa-api",{"title":212,"path":213,"stem":214,"children":215,"page":35},"Composables","\u002Fnuxt-module\u002Fcomposables","5.nuxt-module\u002F6.composables",[216,224,261,278],{"title":217,"path":218,"stem":219,"children":220,"page":35},"Layout","\u002Fnuxt-module\u002Fcomposables\u002Flayout","5.nuxt-module\u002F6.composables\u002F0.layout",[221],{"title":217,"path":222,"stem":223},"\u002Fnuxt-module\u002Fcomposables\u002Flayout\u002Fuse-cwa-layout","5.nuxt-module\u002F6.composables\u002F0.layout\u002F1.use-cwa-layout",{"title":225,"path":226,"stem":227,"children":228,"page":35},"Component","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent","5.nuxt-module\u002F6.composables\u002F1.component",[229,233,237,241,245,249,253,257],{"title":230,"path":231,"stem":232},"Component (recommended)","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-component","5.nuxt-module\u002F6.composables\u002F1.component\u002F0.use-cwa-component",{"title":234,"path":235,"stem":236},"Resource","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-resource","5.nuxt-module\u002F6.composables\u002F1.component\u002F1.use-cwa-resource",{"title":238,"path":239,"stem":240},"Collection Resource","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-collection-resource","5.nuxt-module\u002F6.composables\u002F1.component\u002F2.use-cwa-collection-resource",{"title":242,"path":243,"stem":244},"Image Resource","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-image-resource","5.nuxt-module\u002F6.composables\u002F1.component\u002F3.use-cwa-image-resource",{"title":246,"path":247,"stem":248},"Form","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-form","5.nuxt-module\u002F6.composables\u002F1.component\u002F4.use-cwa-form",{"title":250,"path":251,"stem":252},"Form Input","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-form-input","5.nuxt-module\u002F6.composables\u002F1.component\u002F5.use-cwa-form-input",{"title":254,"path":255,"stem":256},"Form Repeated","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-form-repeated","5.nuxt-module\u002F6.composables\u002F1.component\u002F6.use-cwa-form-repeated",{"title":258,"path":259,"stem":260},"Form Collection","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-form-collection","5.nuxt-module\u002F6.composables\u002F1.component\u002F7.use-cwa-form-collection",{"title":262,"path":263,"stem":264,"children":265,"page":35},"Admin Manager","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager","5.nuxt-module\u002F6.composables\u002F2.admin-manager",[266,270,274],{"title":267,"path":268,"stem":269},"Manager Tab","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager\u002Fuse-cwa-resource-manager-tab","5.nuxt-module\u002F6.composables\u002F2.admin-manager\u002F1.use-cwa-resource-manager-tab",{"title":271,"path":272,"stem":273},"Resource Model","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager\u002Fuse-cwa-resource-model","5.nuxt-module\u002F6.composables\u002F2.admin-manager\u002F2.use-cwa-resource-model",{"title":275,"path":276,"stem":277},"Resource Upload","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager\u002Fuse-cwa-resource-upload","5.nuxt-module\u002F6.composables\u002F2.admin-manager\u002F3.use-cwa-resource-upload",{"title":279,"path":280,"stem":281,"children":282,"page":35},"Utilities","\u002Fnuxt-module\u002Fcomposables\u002Futilities","5.nuxt-module\u002F6.composables\u002F3.utilities",[283,287,291],{"title":284,"path":285,"stem":286},"Resource Endpoint","\u002Fnuxt-module\u002Fcomposables\u002Futilities\u002Fuse-cwa-resource-endpoint","5.nuxt-module\u002F6.composables\u002F3.utilities\u002F1.use-cwa-resource-endpoint",{"title":288,"path":289,"stem":290},"Query Model","\u002Fnuxt-module\u002Fcomposables\u002Futilities\u002Fuse-query-bound-model","5.nuxt-module\u002F6.composables\u002F3.utilities\u002F2.use-query-bound-model",{"title":292,"path":293,"stem":294},"Resource Route","\u002Fnuxt-module\u002Fcomposables\u002Futilities\u002Fuse-cwa-resource-route","5.nuxt-module\u002F6.composables\u002F3.utilities\u002F3.use-cwa-resource-route",{"title":296,"path":297,"stem":298,"children":299,"page":35},"Component Helpers","\u002Fnuxt-module\u002Fcomponent-helpers","5.nuxt-module\u002F7.component-helpers",[300,304,308,312,316],{"title":301,"path":302,"stem":303},"Images & Media","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fimages-and-uploads","5.nuxt-module\u002F7.component-helpers\u002F1.images-and-uploads",{"title":305,"path":306,"stem":307},"Collections & Pagination","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fcollections-and-pagination","5.nuxt-module\u002F7.component-helpers\u002F2.collections-and-pagination",{"title":309,"path":310,"stem":311},"HTML Content","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fhtml-content","5.nuxt-module\u002F7.component-helpers\u002F3.html-content",{"title":313,"path":314,"stem":315},"Real-Time Updates","\u002Fnuxt-module\u002Fcomponent-helpers\u002Freal-time-updates","5.nuxt-module\u002F7.component-helpers\u002F4.real-time-updates",{"title":317,"path":318,"stem":319},"Forms","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fforms","5.nuxt-module\u002F7.component-helpers\u002F5.forms",{"title":321,"path":322,"stem":323},"Authentication","\u002Fnuxt-module\u002Fauthentication","5.nuxt-module\u002F8.authentication",{"title":325,"path":326,"stem":327,"children":328,"page":35},"Cwa Layer","\u002Fnuxt-module\u002Fcwa-layer","5.nuxt-module\u002F9.cwa-layer",[329,333,337],{"title":330,"path":331,"stem":332},"Overview","\u002Fnuxt-module\u002Fcwa-layer\u002Foverview","5.nuxt-module\u002F9.cwa-layer\u002F1.overview",{"title":334,"path":335,"stem":336},"Auth Pages","\u002Fnuxt-module\u002Fcwa-layer\u002Fauth-pages","5.nuxt-module\u002F9.cwa-layer\u002F2.auth-pages",{"title":338,"path":339,"stem":340},"Admin Panel","\u002Fnuxt-module\u002Fcwa-layer\u002Fadmin-panel","5.nuxt-module\u002F9.cwa-layer\u002F3.admin-panel",{"title":342,"path":343,"stem":344,"children":345,"page":35},"Deployment","\u002Fdeployment","6.deployment",[346,350,354],{"title":347,"path":348,"stem":349},"Docker","\u002Fdeployment\u002Fdocker","6.deployment\u002F1.docker",{"title":351,"path":352,"stem":353},"Kubernetes & Helm","\u002Fdeployment\u002Fkubernetes","6.deployment\u002F2.kubernetes",{"title":355,"path":356,"stem":357},"CI\u002FCD","\u002Fdeployment\u002Fci-cd","6.deployment\u002F3.ci-cd",{"id":359,"title":75,"badge":360,"body":363,"description":1084,"extension":1085,"links":1086,"meta":1087,"navigation":826,"path":76,"seo":1088,"stem":77,"__hash__":1089},"docs\u002F4.api\u002F1.bundle-setup.md",{"label":361,"color":362},"Draft","amber",{"type":364,"value":365,"toc":1074},"minimark",[366,401,406,421,424,450,453,488,492,495,563,575,586,592,607,611,617,764,768,771,791,794,798,807,886,890,900,911,926,933,945,949,952,1063,1070],[367,368,369,370,378,379,384,385,384,390,384,395,400],"p",{},"The API Components Bundle is the ",[371,372,377],"a",{"href":373,"rel":374,"target":376},"https:\u002F\u002Fsymfony.com",[375],"nofollow","_blank","Symfony"," backend of CWA. It wires together ",[371,380,383],{"href":381,"rel":382,"target":376},"https:\u002F\u002Fapi-platform.com",[375],"API Platform",", ",[371,386,389],{"href":387,"rel":388,"target":376},"https:\u002F\u002Fwww.doctrine-project.org\u002Fprojects\u002Form.html",[375],"Doctrine ORM",[371,391,394],{"href":392,"rel":393,"target":376},"https:\u002F\u002Fgithub.com\u002Flexik\u002FLexikJWTAuthenticationBundle",[375],"LexikJWTAuthenticationBundle",[371,396,399],{"href":397,"rel":398,"target":376},"https:\u002F\u002Fmercure.rocks",[375],"Mercure",", and a suite of content management abstractions so you spend your time building your app rather than infrastructure.",[402,403,405],"h2",{"id":404},"prerequisites","Prerequisites",[407,408,409,413,416,418],"ul",{},[410,411,412],"li",{},"PHP 8.2+",[410,414,415],{},"Symfony 7.4+",[410,417,389],{},[410,419,420],{},"API Platform 4.x",[402,422,11],{"id":423},"installation",[425,426,431],"pre",{"className":427,"code":428,"language":429,"meta":430,"style":430},"language-bash shiki shiki-themes github-light github-dark material-theme-palenight","composer require silverback\u002Fapi-components-bundle\n","bash","",[432,433,434],"code",{"__ignoreMap":430},[435,436,439,443,447],"span",{"class":437,"line":438},"line",1,[435,440,442],{"class":441},"sRCss","composer",[435,444,446],{"class":445},"sLL54"," require",[435,448,449],{"class":445}," silverback\u002Fapi-components-bundle\n",[367,451,452],{},"The Flex recipe runs automatically and creates:",[407,454,455,464,470,476,482],{},[410,456,457,460,461],{},[432,458,459],{},"src\u002FEntity\u002FUser.php"," — your user entity extending ",[432,462,463],{},"AbstractUser",[410,465,466,469],{},[432,467,468],{},"src\u002FEntity\u002FRefreshToken.php"," — the refresh token entity",[410,471,472,475],{},[432,473,474],{},"config\u002Fpackages\u002Fsilverback_api_components.yaml"," — the bundle configuration",[410,477,478,481],{},[432,479,480],{},"config\u002Fpackages\u002Fsecurity.yaml"," — a pre-wired security configuration",[410,483,484,487],{},[432,485,486],{},"config\u002Fjwt\u002F"," — directory for JWT keys (generated in the next step)",[402,489,491],{"id":490},"generate-jwt-keys","Generate JWT Keys",[367,493,494],{},"The bundle uses cookie-based JWT tokens for authentication. Generate a key pair once per environment:",[425,496,498],{"className":427,"code":497,"language":429,"meta":430,"style":430},"mkdir -p config\u002Fjwt\nopenssl genpkey -out config\u002Fjwt\u002Fprivate.pem -aes256 -algorithm rsa -pkeyopt rsa_keygen_bits:4096\nopenssl pkey -in config\u002Fjwt\u002Fprivate.pem -out config\u002Fjwt\u002Fpublic.pem -pubout\n",[432,499,500,512,542],{"__ignoreMap":430},[435,501,502,505,509],{"class":437,"line":438},[435,503,504],{"class":441},"mkdir",[435,506,508],{"class":507},"szhYu"," -p",[435,510,511],{"class":445}," config\u002Fjwt\n",[435,513,515,518,521,524,527,530,533,536,539],{"class":437,"line":514},2,[435,516,517],{"class":441},"openssl",[435,519,520],{"class":445}," genpkey",[435,522,523],{"class":507}," -out",[435,525,526],{"class":445}," config\u002Fjwt\u002Fprivate.pem",[435,528,529],{"class":507}," -aes256",[435,531,532],{"class":507}," -algorithm",[435,534,535],{"class":445}," rsa",[435,537,538],{"class":507}," -pkeyopt",[435,540,541],{"class":445}," rsa_keygen_bits:4096\n",[435,543,545,547,550,553,555,557,560],{"class":437,"line":544},3,[435,546,517],{"class":441},[435,548,549],{"class":445}," pkey",[435,551,552],{"class":507}," -in",[435,554,526],{"class":445},[435,556,523],{"class":507},[435,558,559],{"class":445}," config\u002Fjwt\u002Fpublic.pem",[435,561,562],{"class":507}," -pubout\n",[367,564,565,566,569,570,574],{},"Add the passphrase to ",[432,567,568],{},".env.local"," — ",[571,572,573],"strong",{},"never commit this file",":",[425,576,580],{"className":577,"code":578,"language":579,"meta":430,"style":430},"language-ini shiki shiki-themes github-light github-dark material-theme-palenight","JWT_PASSPHRASE=your_secure_passphrase\n","ini",[432,581,582],{"__ignoreMap":430},[435,583,584],{"class":437,"line":438},[435,585,578],{},[367,587,588,589,574],{},"Add the key paths to ",[432,590,591],{},".env",[425,593,595],{"className":577,"code":594,"language":579,"meta":430,"style":430},"JWT_SECRET_KEY=%kernel.project_dir%\u002Fconfig\u002Fjwt\u002Fprivate.pem\nJWT_PUBLIC_KEY=%kernel.project_dir%\u002Fconfig\u002Fjwt\u002Fpublic.pem\n",[432,596,597,602],{"__ignoreMap":430},[435,598,599],{"class":437,"line":438},[435,600,601],{},"JWT_SECRET_KEY=%kernel.project_dir%\u002Fconfig\u002Fjwt\u002Fprivate.pem\n",[435,603,604],{"class":437,"line":514},[435,605,606],{},"JWT_PUBLIC_KEY=%kernel.project_dir%\u002Fconfig\u002Fjwt\u002Fpublic.pem\n",[402,608,610],{"id":609},"minimum-configuration","Minimum Configuration",[367,612,613,614,616],{},"Open ",[432,615,474],{},". At minimum you need:",[425,618,622],{"className":619,"code":620,"language":621,"meta":430,"style":430},"language-yaml shiki shiki-themes github-light github-dark material-theme-palenight","silverback_api_components:\n    website_name: My CWA App\n    user:\n        class_name: App\\Entity\\User\n    publishable:\n        permission: \"is_granted('ROLE_ADMIN')\"\n    refresh_token:\n        handler_id: silverback.api_components.refresh_token.storage.doctrine\n        options:\n            class: App\\Entity\\RefreshToken\n        cookie_name: api_components\n        ttl: 604800  # 1 week in seconds\n        database_user_provider: database\n","yaml",[432,623,624,634,644,651,662,670,688,696,707,715,726,737,753],{"__ignoreMap":430},[435,625,626,630],{"class":437,"line":438},[435,627,629],{"class":628},"s-h7I","silverback_api_components",[435,631,633],{"class":632},"sOvfz",":\n",[435,635,636,639,641],{"class":437,"line":514},[435,637,638],{"class":628},"    website_name",[435,640,574],{"class":632},[435,642,643],{"class":445}," My CWA App\n",[435,645,646,649],{"class":437,"line":544},[435,647,648],{"class":628},"    user",[435,650,633],{"class":632},[435,652,654,657,659],{"class":437,"line":653},4,[435,655,656],{"class":628},"        class_name",[435,658,574],{"class":632},[435,660,661],{"class":445}," App\\Entity\\User\n",[435,663,665,668],{"class":437,"line":664},5,[435,666,667],{"class":628},"    publishable",[435,669,633],{"class":632},[435,671,673,676,678,682,685],{"class":437,"line":672},6,[435,674,675],{"class":628},"        permission",[435,677,574],{"class":632},[435,679,681],{"class":680},"seSrl"," \"",[435,683,684],{"class":445},"is_granted('ROLE_ADMIN')",[435,686,687],{"class":680},"\"\n",[435,689,691,694],{"class":437,"line":690},7,[435,692,693],{"class":628},"    refresh_token",[435,695,633],{"class":632},[435,697,699,702,704],{"class":437,"line":698},8,[435,700,701],{"class":628},"        handler_id",[435,703,574],{"class":632},[435,705,706],{"class":445}," silverback.api_components.refresh_token.storage.doctrine\n",[435,708,710,713],{"class":437,"line":709},9,[435,711,712],{"class":628},"        options",[435,714,633],{"class":632},[435,716,718,721,723],{"class":437,"line":717},10,[435,719,720],{"class":628},"            class",[435,722,574],{"class":632},[435,724,725],{"class":445}," App\\Entity\\RefreshToken\n",[435,727,729,732,734],{"class":437,"line":728},11,[435,730,731],{"class":628},"        cookie_name",[435,733,574],{"class":632},[435,735,736],{"class":445}," api_components\n",[435,738,740,743,745,749],{"class":437,"line":739},12,[435,741,742],{"class":628},"        ttl",[435,744,574],{"class":632},[435,746,748],{"class":747},"scSvc"," 604800",[435,750,752],{"class":751},"sTBSN","  # 1 week in seconds\n",[435,754,756,759,761],{"class":437,"line":755},13,[435,757,758],{"class":628},"        database_user_provider",[435,760,574],{"class":632},[435,762,763],{"class":445}," database\n",[402,765,767],{"id":766},"database-setup","Database Setup",[367,769,770],{},"The bundle adds tables for layouts, pages, routes, component groups, component positions, media objects, refresh tokens, and your user and component entities.",[425,772,774],{"className":427,"code":773,"language":429,"meta":430,"style":430},"bin\u002Fconsole doctrine:migrations:diff\nbin\u002Fconsole doctrine:migrations:migrate\n",[432,775,776,784],{"__ignoreMap":430},[435,777,778,781],{"class":437,"line":438},[435,779,780],{"class":441},"bin\u002Fconsole",[435,782,783],{"class":445}," doctrine:migrations:diff\n",[435,785,786,788],{"class":437,"line":514},[435,787,780],{"class":441},[435,789,790],{"class":445}," doctrine:migrations:migrate\n",[367,792,793],{},"Review the generated migration before running it — the initial migration is sizeable.",[402,795,797],{"id":796},"environment-variables","Environment Variables",[367,799,800,801,803,804,806],{},"Set these in ",[432,802,591],{}," (public) and ",[432,805,568],{}," (secrets):",[425,808,810],{"className":577,"code":809,"language":579,"meta":430,"style":430},"# Database\nDATABASE_URL=\"postgresql:\u002F\u002Fuser:pass@localhost:5432\u002Fapp?serverVersion=16&charset=utf8\"\n\n# JWT auth\nJWT_SECRET_KEY=%kernel.project_dir%\u002Fconfig\u002Fjwt\u002Fprivate.pem\nJWT_PUBLIC_KEY=%kernel.project_dir%\u002Fconfig\u002Fjwt\u002Fpublic.pem\nJWT_PASSPHRASE=your_passphrase\n\n# Mercure (real-time updates)\nMERCURE_URL=http:\u002F\u002Flocalhost:3000\u002F.well-known\u002Fmercure\nMERCURE_PUBLIC_URL=https:\u002F\u002Fyourdomain.com\u002F.well-known\u002Fmercure\nMERCURE_JWT_SECRET=your_mercure_secret\n\n# Email\nMAILER_DSN=smtp:\u002F\u002Flocalhost:1025\n",[432,811,812,817,822,828,833,837,841,846,850,855,860,865,870,874,880],{"__ignoreMap":430},[435,813,814],{"class":437,"line":438},[435,815,816],{},"# Database\n",[435,818,819],{"class":437,"line":514},[435,820,821],{},"DATABASE_URL=\"postgresql:\u002F\u002Fuser:pass@localhost:5432\u002Fapp?serverVersion=16&charset=utf8\"\n",[435,823,824],{"class":437,"line":544},[435,825,827],{"emptyLinePlaceholder":826},true,"\n",[435,829,830],{"class":437,"line":653},[435,831,832],{},"# JWT auth\n",[435,834,835],{"class":437,"line":664},[435,836,601],{},[435,838,839],{"class":437,"line":672},[435,840,606],{},[435,842,843],{"class":437,"line":690},[435,844,845],{},"JWT_PASSPHRASE=your_passphrase\n",[435,847,848],{"class":437,"line":698},[435,849,827],{"emptyLinePlaceholder":826},[435,851,852],{"class":437,"line":709},[435,853,854],{},"# Mercure (real-time updates)\n",[435,856,857],{"class":437,"line":717},[435,858,859],{},"MERCURE_URL=http:\u002F\u002Flocalhost:3000\u002F.well-known\u002Fmercure\n",[435,861,862],{"class":437,"line":728},[435,863,864],{},"MERCURE_PUBLIC_URL=https:\u002F\u002Fyourdomain.com\u002F.well-known\u002Fmercure\n",[435,866,867],{"class":437,"line":739},[435,868,869],{},"MERCURE_JWT_SECRET=your_mercure_secret\n",[435,871,872],{"class":437,"line":755},[435,873,827],{"emptyLinePlaceholder":826},[435,875,877],{"class":437,"line":876},14,[435,878,879],{},"# Email\n",[435,881,883],{"class":437,"line":882},15,[435,884,885],{},"MAILER_DSN=smtp:\u002F\u002Flocalhost:1025\n",[402,887,889],{"id":888},"verifying-the-install","Verifying the Install",[367,891,892,893,895,896,899],{},"Start your Symfony server and visit ",[432,894,71],{}," — you should see the API Platform documentation UI listing all available resources. The entrypoint at ",[432,897,898],{},"\u002F_\u002Fentrypoint"," returns IRIs for every resource collection.",[367,901,902,903,906,907,910],{},"Create your first admin user — pass ",[432,904,905],{},"--admin"," so the account has ",[432,908,909],{},"ROLE_ADMIN"," access:",[425,912,914],{"className":427,"code":913,"language":429,"meta":430,"style":430},"bin\u002Fconsole silverback:api-components:user:create --admin\n",[432,915,916],{"__ignoreMap":430},[435,917,918,920,923],{"class":437,"line":438},[435,919,780],{"class":441},[435,921,922],{"class":445}," silverback:api-components:user:create",[435,924,925],{"class":507}," --admin\n",[367,927,928,929,932],{},"Follow the prompts to set username, email, and password. Without the flag the account is created with ",[432,930,931],{},"ROLE_USER"," only and cannot access the admin panel. Then load any fixtures you've defined:",[425,934,936],{"className":427,"code":935,"language":429,"meta":430,"style":430},"bin\u002Fconsole doctrine:fixtures:load\n",[432,937,938],{"__ignoreMap":430},[435,939,940,942],{"class":437,"line":438},[435,941,780],{"class":441},[435,943,944],{"class":445}," doctrine:fixtures:load\n",[402,946,948],{"id":947},"what-gets-auto-registered","What Gets Auto-Registered",[367,950,951],{},"You don't need to register these — the bundle provides them out of the box:",[953,954,955,970],"table",{},[956,957,958],"thead",{},[959,960,961,964,967],"tr",{},[962,963,234],"th",{},[962,965,966],{},"Endpoint prefix",[962,968,969],{},"Purpose",[971,972,973,986,999,1012,1025,1038,1051],"tbody",{},[959,974,975,978,983],{},[976,977,217],"td",{},[976,979,980],{},[432,981,982],{},"\u002Flayouts",[976,984,985],{},"Outer page shell (header\u002Ffooter)",[959,987,988,991,996],{},[976,989,990],{},"Page",[976,992,993],{},[432,994,995],{},"\u002Fpages",[976,997,998],{},"Individual pages with component groups",[959,1000,1001,1004,1009],{},[976,1002,1003],{},"Route",[976,1005,1006],{},[432,1007,1008],{},"\u002Froutes",[976,1010,1011],{},"URL → page\u002Fpage data mapping",[959,1013,1014,1017,1022],{},[976,1015,1016],{},"ComponentGroup",[976,1018,1019],{},[432,1020,1021],{},"\u002Fcomponent_groups",[976,1023,1024],{},"Named regions within a layout or page",[959,1026,1027,1030,1035],{},[976,1028,1029],{},"ComponentPosition",[976,1031,1032],{},[432,1033,1034],{},"\u002Fcomponent_positions",[976,1036,1037],{},"Ordered slot assignments",[959,1039,1040,1043,1048],{},[976,1041,1042],{},"Collection",[976,1044,1045],{},[432,1046,1047],{},"\u002Fcomponent\u002Fcollections",[976,1049,1050],{},"Proxy to paginated resource lists",[959,1052,1053,1055,1060],{},[976,1054,246],{},[976,1056,1057],{},[432,1058,1059],{},"\u002Fcomponent\u002Fforms",[976,1061,1062],{},"Symfony form types via API",[367,1064,1065,1066,1069],{},"Your custom components are registered when you create entity classes extending ",[432,1067,1068],{},"AbstractComponent",".",[1071,1072,1073],"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 .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szhYu, html code.shiki .szhYu{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#C3E88D}html pre.shiki code .s-h7I, html code.shiki .s-h7I{--shiki-light:#22863A;--shiki-default:#85E89D;--shiki-dark:#F07178}html pre.shiki code .sOvfz, html code.shiki .sOvfz{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#89DDFF}html pre.shiki code .seSrl, html code.shiki .seSrl{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#89DDFF}html pre.shiki code .scSvc, html code.shiki .scSvc{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#F78C6C}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}",{"title":430,"searchDepth":514,"depth":514,"links":1075},[1076,1077,1078,1079,1080,1081,1082,1083],{"id":404,"depth":514,"text":405},{"id":423,"depth":514,"text":11},{"id":490,"depth":514,"text":491},{"id":609,"depth":514,"text":610},{"id":766,"depth":514,"text":767},{"id":796,"depth":514,"text":797},{"id":888,"depth":514,"text":889},{"id":947,"depth":514,"text":948},"Installing and configuring the Silverback API Components Bundle in a Symfony application.","md",null,{},{"title":75,"description":1084},"o6s7wvoPlyVQ_PYElnkpniiV49Zg1GQo3BVucxn2fsQ",[1091,1093],{"title":66,"path":67,"stem":68,"description":1092,"children":-1},"An overview of the built-in inline CMS — how admins manage layouts, pages, components and site settings without leaving the website.",{"title":83,"path":84,"stem":85,"description":1094,"children":-1},"How to define a custom content resource by extending AbstractComponent, adding API Platform metadata, and running migrations.",1782512896730]