[{"data":1,"prerenderedAt":1080},["ShallowReactive",2],{"navigation":3,"\u002Fapi\u002Fbundle-setup":342,"\u002Fapi\u002Fbundle-setup-surround":1075},[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":75,"badge":344,"body":347,"description":1069,"extension":1070,"links":1071,"meta":1072,"navigation":810,"path":76,"seo":1073,"stem":77,"__hash__":1074},"docs\u002F4.api\u002F1.bundle-setup.md",{"label":345,"color":346},"Draft","amber",{"type":348,"value":349,"toc":1059},"minimark",[350,385,390,405,408,434,437,472,476,479,547,559,570,576,591,595,601,748,752,755,775,778,782,791,870,874,884,895,910,917,929,933,936,1048,1055],[351,352,353,354,362,363,368,369,368,374,368,379,384],"p",{},"The API Components Bundle is the ",[355,356,361],"a",{"href":357,"rel":358,"target":360},"https:\u002F\u002Fsymfony.com",[359],"nofollow","_blank","Symfony"," backend of CWA. It wires together ",[355,364,367],{"href":365,"rel":366,"target":360},"https:\u002F\u002Fapi-platform.com",[359],"API Platform",", ",[355,370,373],{"href":371,"rel":372,"target":360},"https:\u002F\u002Fwww.doctrine-project.org\u002Fprojects\u002Form.html",[359],"Doctrine ORM",[355,375,378],{"href":376,"rel":377,"target":360},"https:\u002F\u002Fgithub.com\u002Flexik\u002FLexikJWTAuthenticationBundle",[359],"LexikJWTAuthenticationBundle",[355,380,383],{"href":381,"rel":382,"target":360},"https:\u002F\u002Fmercure.rocks",[359],"Mercure",", and a suite of content management abstractions so you spend your time building your app rather than infrastructure.",[386,387,389],"h2",{"id":388},"prerequisites","Prerequisites",[391,392,393,397,400,402],"ul",{},[394,395,396],"li",{},"PHP 8.2+",[394,398,399],{},"Symfony 7.4+",[394,401,373],{},[394,403,404],{},"API Platform 4.x",[386,406,11],{"id":407},"installation",[409,410,415],"pre",{"className":411,"code":412,"language":413,"meta":414,"style":414},"language-bash shiki shiki-themes github-light github-dark material-theme-palenight","composer require silverback\u002Fapi-components-bundle\n","bash","",[416,417,418],"code",{"__ignoreMap":414},[419,420,423,427,431],"span",{"class":421,"line":422},"line",1,[419,424,426],{"class":425},"sRCss","composer",[419,428,430],{"class":429},"sLL54"," require",[419,432,433],{"class":429}," silverback\u002Fapi-components-bundle\n",[351,435,436],{},"The Flex recipe runs automatically and creates:",[391,438,439,448,454,460,466],{},[394,440,441,444,445],{},[416,442,443],{},"src\u002FEntity\u002FUser.php"," — your user entity extending ",[416,446,447],{},"AbstractUser",[394,449,450,453],{},[416,451,452],{},"src\u002FEntity\u002FRefreshToken.php"," — the refresh token entity",[394,455,456,459],{},[416,457,458],{},"config\u002Fpackages\u002Fsilverback_api_components.yaml"," — the bundle configuration",[394,461,462,465],{},[416,463,464],{},"config\u002Fpackages\u002Fsecurity.yaml"," — a pre-wired security configuration",[394,467,468,471],{},[416,469,470],{},"config\u002Fjwt\u002F"," — directory for JWT keys (generated in the next step)",[386,473,475],{"id":474},"generate-jwt-keys","Generate JWT Keys",[351,477,478],{},"The bundle uses cookie-based JWT tokens for authentication. Generate a key pair once per environment:",[409,480,482],{"className":411,"code":481,"language":413,"meta":414,"style":414},"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",[416,483,484,496,526],{"__ignoreMap":414},[419,485,486,489,493],{"class":421,"line":422},[419,487,488],{"class":425},"mkdir",[419,490,492],{"class":491},"szhYu"," -p",[419,494,495],{"class":429}," config\u002Fjwt\n",[419,497,499,502,505,508,511,514,517,520,523],{"class":421,"line":498},2,[419,500,501],{"class":425},"openssl",[419,503,504],{"class":429}," genpkey",[419,506,507],{"class":491}," -out",[419,509,510],{"class":429}," config\u002Fjwt\u002Fprivate.pem",[419,512,513],{"class":491}," -aes256",[419,515,516],{"class":491}," -algorithm",[419,518,519],{"class":429}," rsa",[419,521,522],{"class":491}," -pkeyopt",[419,524,525],{"class":429}," rsa_keygen_bits:4096\n",[419,527,529,531,534,537,539,541,544],{"class":421,"line":528},3,[419,530,501],{"class":425},[419,532,533],{"class":429}," pkey",[419,535,536],{"class":491}," -in",[419,538,510],{"class":429},[419,540,507],{"class":491},[419,542,543],{"class":429}," config\u002Fjwt\u002Fpublic.pem",[419,545,546],{"class":491}," -pubout\n",[351,548,549,550,553,554,558],{},"Add the passphrase to ",[416,551,552],{},".env.local"," — ",[555,556,557],"strong",{},"never commit this file",":",[409,560,564],{"className":561,"code":562,"language":563,"meta":414,"style":414},"language-ini shiki shiki-themes github-light github-dark material-theme-palenight","JWT_PASSPHRASE=your_secure_passphrase\n","ini",[416,565,566],{"__ignoreMap":414},[419,567,568],{"class":421,"line":422},[419,569,562],{},[351,571,572,573,558],{},"Add the key paths to ",[416,574,575],{},".env",[409,577,579],{"className":561,"code":578,"language":563,"meta":414,"style":414},"JWT_SECRET_KEY=%kernel.project_dir%\u002Fconfig\u002Fjwt\u002Fprivate.pem\nJWT_PUBLIC_KEY=%kernel.project_dir%\u002Fconfig\u002Fjwt\u002Fpublic.pem\n",[416,580,581,586],{"__ignoreMap":414},[419,582,583],{"class":421,"line":422},[419,584,585],{},"JWT_SECRET_KEY=%kernel.project_dir%\u002Fconfig\u002Fjwt\u002Fprivate.pem\n",[419,587,588],{"class":421,"line":498},[419,589,590],{},"JWT_PUBLIC_KEY=%kernel.project_dir%\u002Fconfig\u002Fjwt\u002Fpublic.pem\n",[386,592,594],{"id":593},"minimum-configuration","Minimum Configuration",[351,596,597,598,600],{},"Open ",[416,599,458],{},". At minimum you need:",[409,602,606],{"className":603,"code":604,"language":605,"meta":414,"style":414},"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",[416,607,608,618,628,635,646,654,672,680,691,699,710,721,737],{"__ignoreMap":414},[419,609,610,614],{"class":421,"line":422},[419,611,613],{"class":612},"s-h7I","silverback_api_components",[419,615,617],{"class":616},"sOvfz",":\n",[419,619,620,623,625],{"class":421,"line":498},[419,621,622],{"class":612},"    website_name",[419,624,558],{"class":616},[419,626,627],{"class":429}," My CWA App\n",[419,629,630,633],{"class":421,"line":528},[419,631,632],{"class":612},"    user",[419,634,617],{"class":616},[419,636,638,641,643],{"class":421,"line":637},4,[419,639,640],{"class":612},"        class_name",[419,642,558],{"class":616},[419,644,645],{"class":429}," App\\Entity\\User\n",[419,647,649,652],{"class":421,"line":648},5,[419,650,651],{"class":612},"    publishable",[419,653,617],{"class":616},[419,655,657,660,662,666,669],{"class":421,"line":656},6,[419,658,659],{"class":612},"        permission",[419,661,558],{"class":616},[419,663,665],{"class":664},"seSrl"," \"",[419,667,668],{"class":429},"is_granted('ROLE_ADMIN')",[419,670,671],{"class":664},"\"\n",[419,673,675,678],{"class":421,"line":674},7,[419,676,677],{"class":612},"    refresh_token",[419,679,617],{"class":616},[419,681,683,686,688],{"class":421,"line":682},8,[419,684,685],{"class":612},"        handler_id",[419,687,558],{"class":616},[419,689,690],{"class":429}," silverback.api_components.refresh_token.storage.doctrine\n",[419,692,694,697],{"class":421,"line":693},9,[419,695,696],{"class":612},"        options",[419,698,617],{"class":616},[419,700,702,705,707],{"class":421,"line":701},10,[419,703,704],{"class":612},"            class",[419,706,558],{"class":616},[419,708,709],{"class":429}," App\\Entity\\RefreshToken\n",[419,711,713,716,718],{"class":421,"line":712},11,[419,714,715],{"class":612},"        cookie_name",[419,717,558],{"class":616},[419,719,720],{"class":429}," api_components\n",[419,722,724,727,729,733],{"class":421,"line":723},12,[419,725,726],{"class":612},"        ttl",[419,728,558],{"class":616},[419,730,732],{"class":731},"scSvc"," 604800",[419,734,736],{"class":735},"sTBSN","  # 1 week in seconds\n",[419,738,740,743,745],{"class":421,"line":739},13,[419,741,742],{"class":612},"        database_user_provider",[419,744,558],{"class":616},[419,746,747],{"class":429}," database\n",[386,749,751],{"id":750},"database-setup","Database Setup",[351,753,754],{},"The bundle adds tables for layouts, pages, routes, component groups, component positions, media objects, refresh tokens, and your user and component entities.",[409,756,758],{"className":411,"code":757,"language":413,"meta":414,"style":414},"bin\u002Fconsole doctrine:migrations:diff\nbin\u002Fconsole doctrine:migrations:migrate\n",[416,759,760,768],{"__ignoreMap":414},[419,761,762,765],{"class":421,"line":422},[419,763,764],{"class":425},"bin\u002Fconsole",[419,766,767],{"class":429}," doctrine:migrations:diff\n",[419,769,770,772],{"class":421,"line":498},[419,771,764],{"class":425},[419,773,774],{"class":429}," doctrine:migrations:migrate\n",[351,776,777],{},"Review the generated migration before running it — the initial migration is sizeable.",[386,779,781],{"id":780},"environment-variables","Environment Variables",[351,783,784,785,787,788,790],{},"Set these in ",[416,786,575],{}," (public) and ",[416,789,552],{}," (secrets):",[409,792,794],{"className":561,"code":793,"language":563,"meta":414,"style":414},"# 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",[416,795,796,801,806,812,817,821,825,830,834,839,844,849,854,858,864],{"__ignoreMap":414},[419,797,798],{"class":421,"line":422},[419,799,800],{},"# Database\n",[419,802,803],{"class":421,"line":498},[419,804,805],{},"DATABASE_URL=\"postgresql:\u002F\u002Fuser:pass@localhost:5432\u002Fapp?serverVersion=16&charset=utf8\"\n",[419,807,808],{"class":421,"line":528},[419,809,811],{"emptyLinePlaceholder":810},true,"\n",[419,813,814],{"class":421,"line":637},[419,815,816],{},"# JWT auth\n",[419,818,819],{"class":421,"line":648},[419,820,585],{},[419,822,823],{"class":421,"line":656},[419,824,590],{},[419,826,827],{"class":421,"line":674},[419,828,829],{},"JWT_PASSPHRASE=your_passphrase\n",[419,831,832],{"class":421,"line":682},[419,833,811],{"emptyLinePlaceholder":810},[419,835,836],{"class":421,"line":693},[419,837,838],{},"# Mercure (real-time updates)\n",[419,840,841],{"class":421,"line":701},[419,842,843],{},"MERCURE_URL=http:\u002F\u002Flocalhost:3000\u002F.well-known\u002Fmercure\n",[419,845,846],{"class":421,"line":712},[419,847,848],{},"MERCURE_PUBLIC_URL=https:\u002F\u002Fyourdomain.com\u002F.well-known\u002Fmercure\n",[419,850,851],{"class":421,"line":723},[419,852,853],{},"MERCURE_JWT_SECRET=your_mercure_secret\n",[419,855,856],{"class":421,"line":739},[419,857,811],{"emptyLinePlaceholder":810},[419,859,861],{"class":421,"line":860},14,[419,862,863],{},"# Email\n",[419,865,867],{"class":421,"line":866},15,[419,868,869],{},"MAILER_DSN=smtp:\u002F\u002Flocalhost:1025\n",[386,871,873],{"id":872},"verifying-the-install","Verifying the Install",[351,875,876,877,879,880,883],{},"Start your Symfony server and visit ",[416,878,71],{}," — you should see the API Platform documentation UI listing all available resources. The entrypoint at ",[416,881,882],{},"\u002F_\u002Fentrypoint"," returns IRIs for every resource collection.",[351,885,886,887,890,891,894],{},"Create your first admin user — pass ",[416,888,889],{},"--admin"," so the account has ",[416,892,893],{},"ROLE_ADMIN"," access:",[409,896,898],{"className":411,"code":897,"language":413,"meta":414,"style":414},"bin\u002Fconsole silverback:api-components:user:create --admin\n",[416,899,900],{"__ignoreMap":414},[419,901,902,904,907],{"class":421,"line":422},[419,903,764],{"class":425},[419,905,906],{"class":429}," silverback:api-components:user:create",[419,908,909],{"class":491}," --admin\n",[351,911,912,913,916],{},"Follow the prompts to set username, email, and password. Without the flag the account is created with ",[416,914,915],{},"ROLE_USER"," only and cannot access the admin panel. Then load any fixtures you've defined:",[409,918,920],{"className":411,"code":919,"language":413,"meta":414,"style":414},"bin\u002Fconsole doctrine:fixtures:load\n",[416,921,922],{"__ignoreMap":414},[419,923,924,926],{"class":421,"line":422},[419,925,764],{"class":425},[419,927,928],{"class":429}," doctrine:fixtures:load\n",[386,930,932],{"id":931},"what-gets-auto-registered","What Gets Auto-Registered",[351,934,935],{},"You don't need to register these — the bundle provides them out of the box:",[937,938,939,954],"table",{},[940,941,942],"thead",{},[943,944,945,948,951],"tr",{},[946,947,218],"th",{},[946,949,950],{},"Endpoint prefix",[946,952,953],{},"Purpose",[955,956,957,971,984,997,1010,1023,1036],"tbody",{},[943,958,959,963,968],{},[960,961,962],"td",{},"Layout",[960,964,965],{},[416,966,967],{},"\u002Flayouts",[960,969,970],{},"Outer page shell (header\u002Ffooter)",[943,972,973,976,981],{},[960,974,975],{},"Page",[960,977,978],{},[416,979,980],{},"\u002Fpages",[960,982,983],{},"Individual pages with component groups",[943,985,986,989,994],{},[960,987,988],{},"Route",[960,990,991],{},[416,992,993],{},"\u002Froutes",[960,995,996],{},"URL → page\u002Fpage data mapping",[943,998,999,1002,1007],{},[960,1000,1001],{},"ComponentGroup",[960,1003,1004],{},[416,1005,1006],{},"\u002Fcomponent_groups",[960,1008,1009],{},"Named regions within a layout or page",[943,1011,1012,1015,1020],{},[960,1013,1014],{},"ComponentPosition",[960,1016,1017],{},[416,1018,1019],{},"\u002Fcomponent_positions",[960,1021,1022],{},"Ordered slot assignments",[943,1024,1025,1028,1033],{},[960,1026,1027],{},"Collection",[960,1029,1030],{},[416,1031,1032],{},"\u002Fcomponent\u002Fcollections",[960,1034,1035],{},"Proxy to paginated resource lists",[943,1037,1038,1040,1045],{},[960,1039,230],{},[960,1041,1042],{},[416,1043,1044],{},"\u002Fcomponent\u002Fforms",[960,1046,1047],{},"Symfony form types via API",[351,1049,1050,1051,1054],{},"Your custom components are registered when you create entity classes extending ",[416,1052,1053],{},"AbstractComponent",".",[1056,1057,1058],"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":414,"searchDepth":498,"depth":498,"links":1060},[1061,1062,1063,1064,1065,1066,1067,1068],{"id":388,"depth":498,"text":389},{"id":407,"depth":498,"text":11},{"id":474,"depth":498,"text":475},{"id":593,"depth":498,"text":594},{"id":750,"depth":498,"text":751},{"id":780,"depth":498,"text":781},{"id":872,"depth":498,"text":873},{"id":931,"depth":498,"text":932},"Installing and configuring the Silverback API Components Bundle in a Symfony application.","md",null,{},{"title":75,"description":1069},"o6s7wvoPlyVQ_PYElnkpniiV49Zg1GQo3BVucxn2fsQ",[1076,1078],{"title":66,"path":67,"stem":68,"description":1077,"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":1079,"children":-1},"How to define a custom content resource by extending AbstractComponent, adding API Platform metadata, and running migrations.",1782241279728]