[{"data":1,"prerenderedAt":1201},["ShallowReactive",2],{"navigation":3,"\u002Fconcepts\u002Flayers":193,"\u002Fconcepts\u002Flayers-surround":1196},[4,27,49,99,149,169,183],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":26},"Getting Started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,14,18,22],{"title":11,"path":12,"stem":13},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction",{"title":15,"path":16,"stem":17},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation",{"title":19,"path":20,"stem":21},"Quick Start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start",{"title":23,"path":24,"stem":25},"Existing Application","\u002Fgetting-started\u002Fexisting-application","1.getting-started\u002F4.existing-application",false,{"title":28,"icon":29,"path":30,"stem":31,"children":32,"page":26},"Concepts","i-lucide-layers","\u002Fconcepts","2.concepts",[33,37,41,45],{"title":34,"path":35,"stem":36},"Layers","\u002Fconcepts\u002Flayers","2.concepts\u002F1.layers",{"title":38,"path":39,"stem":40},"Buckets","\u002Fconcepts\u002Fbuckets","2.concepts\u002F2.buckets",{"title":42,"path":43,"stem":44},"Boundaries","\u002Fconcepts\u002Fboundaries","2.concepts\u002F3.boundaries",{"title":46,"path":47,"stem":48},"Service Providers","\u002Fconcepts\u002Fservice-providers","2.concepts\u002F4.service-providers",{"title":50,"icon":51,"path":52,"stem":53,"children":54,"page":26},"Guides","i-lucide-book-marked","\u002Fguides","3.guides",[55,59,63,67,71,75,79,83,87,91,95],{"title":56,"path":57,"stem":58},"Add a Domain","\u002Fguides\u002Fadd-a-domain","3.guides\u002F01.add-a-domain",{"title":60,"path":61,"stem":62},"Share Code Between Layers","\u002Fguides\u002Fshare-code-between-layers","3.guides\u002F02.share-code-between-layers",{"title":64,"path":65,"stem":66},"Routes","\u002Fguides\u002Froutes","3.guides\u002F03.routes",{"title":68,"path":69,"stem":70},"Views and Components","\u002Fguides\u002Fviews-and-components","3.guides\u002F04.views-and-components",{"title":72,"path":73,"stem":74},"Seeders","\u002Fguides\u002Fseeders","3.guides\u002F05.seeders",{"title":76,"path":77,"stem":78},"Configuration","\u002Fguides\u002Fconfiguration","3.guides\u002F06.configuration",{"title":80,"path":81,"stem":82},"Events","\u002Fguides\u002Fevents","3.guides\u002F07.events",{"title":84,"path":85,"stem":86},"Tests and CI","\u002Fguides\u002Ftesting-and-ci","3.guides\u002F08.testing-and-ci",{"title":88,"path":89,"stem":90},"Production","\u002Fguides\u002Fproduction","3.guides\u002F09.production",{"title":92,"path":93,"stem":94},"Remove a Layer","\u002Fguides\u002Fremoving-a-layer","3.guides\u002F10.removing-a-layer",{"title":96,"path":97,"stem":98},"Multi-tenancy","\u002Fguides\u002Fmulti-tenancy","3.guides\u002F11.multi-tenancy",{"title":100,"icon":101,"path":102,"stem":103,"children":104,"page":26},"Commands","i-lucide-terminal","\u002Fcommands","4.commands",[105,109,113,117,121,125,129,133,137,141,145],{"title":106,"path":107,"stem":108},"Overview","\u002Fcommands\u002Foverview","4.commands\u002F01.overview",{"title":110,"path":111,"stem":112},"osdd:start","\u002Fcommands\u002Fosdd-start","4.commands\u002F02.osdd-start",{"title":114,"path":115,"stem":116},"osdd:layer","\u002Fcommands\u002Fosdd-layer","4.commands\u002F03.osdd-layer",{"title":118,"path":119,"stem":120},"osdd:list","\u002Fcommands\u002Fosdd-list","4.commands\u002F04.osdd-list",{"title":122,"path":123,"stem":124},"osdd:check","\u002Fcommands\u002Fosdd-check","4.commands\u002F05.osdd-check",{"title":126,"path":127,"stem":128},"osdd:graph","\u002Fcommands\u002Fosdd-graph","4.commands\u002F06.osdd-graph",{"title":130,"path":131,"stem":132},"osdd:seed","\u002Fcommands\u002Fosdd-seed","4.commands\u002F07.osdd-seed",{"title":134,"path":135,"stem":136},"osdd:phpunit","\u002Fcommands\u002Fosdd-phpunit","4.commands\u002F08.osdd-phpunit",{"title":138,"path":139,"stem":140},"osdd:remove","\u002Fcommands\u002Fosdd-remove","4.commands\u002F09.osdd-remove",{"title":142,"path":143,"stem":144},"osdd:cache","\u002Fcommands\u002Fosdd-cache","4.commands\u002F10.osdd-cache",{"title":146,"path":147,"stem":148},"Generators","\u002Fcommands\u002Fmake-commands","4.commands\u002F11.make-commands",{"title":150,"icon":151,"path":152,"stem":153,"children":154,"page":26},"API Reference","i-lucide-book-open","\u002Fapi-reference","5.api-reference",[155,159,162,166],{"title":156,"path":157,"stem":158},"LayerServiceProvider","\u002Fapi-reference\u002Flayer-service-provider","5.api-reference\u002F1.layer-service-provider",{"title":34,"path":160,"stem":161},"\u002Fapi-reference\u002Flayers","5.api-reference\u002F2.layers",{"title":163,"path":164,"stem":165},"SeederRegistry","\u002Fapi-reference\u002Fseeder-registry","5.api-reference\u002F3.seeder-registry",{"title":76,"path":167,"stem":168},"\u002Fapi-reference\u002Fconfiguration","5.api-reference\u002F4.configuration",{"title":170,"icon":171,"path":172,"stem":173,"children":174,"page":26},"Integrations","i-lucide-puzzle","\u002Fintegrations","6.integrations",[175,179],{"title":176,"path":177,"stem":178},"Laravel Boost","\u002Fintegrations\u002Flaravel-boost","6.integrations\u002F1.laravel-boost",{"title":180,"path":181,"stem":182},"Tinker and IDE Helper","\u002Fintegrations\u002Ftinker-and-ide-helper","6.integrations\u002F2.tinker-and-ide-helper",{"title":184,"icon":185,"path":186,"stem":187,"children":188,"page":26},"Upgrade","i-lucide-arrow-up-circle","\u002Fupgrade","7.upgrade",[189],{"title":190,"path":191,"stem":192},"Upgrade from 2.x","\u002Fupgrade\u002Ffrom-2x","7.upgrade\u002F1.from-2x",{"id":194,"title":34,"body":195,"description":1188,"extension":1189,"links":1190,"meta":1191,"navigation":1192,"path":35,"seo":1193,"sitemap":1194,"stem":36,"__hash__":1195},"docs\u002F2.concepts\u002F1.layers.md",{"type":196,"value":197,"toc":1181},"minimark",[198,220,225,235,241,245,258,670,698,701,757,771,775,796,802,805,894,906,910,916,947,966,972,976,985,1147,1161,1177],[199,200,201,202,206,207,211,212,215,216,219],"p",{},"A layer is a Composer package that lives in your repository, in one of the ",[203,204,205],"a",{"href":39},"buckets",": ",[208,209,210],"code",{},"functional\u002F"," and ",[208,213,214],{},"technical\u002F"," by default. Its ",[208,217,218],{},"composer.json"," is its contract: its name, its namespace, the layers it requires and its service provider.",[221,222,224],"h2",{"id":223},"anatomy-of-a-layer","Anatomy of a layer",[226,227,232],"pre",{"className":228,"code":230,"language":231},[229],"language-text","functional\u002Forders\u002F\n├── composer.json                 ← \"type\": \"layer\"\n├── config\u002F\n│   └── orders.php\n├── src\u002F\n│   ├── Models\u002FOrder.php\n│   ├── Http\u002FControllers\u002FOrderController.php\n│   ├── Listeners\u002FSendOrderConfirmation.php\n│   ├── Policies\u002FOrderPolicy.php\n│   ├── View\u002FComponents\u002FAlert.php\n│   └── Providers\u002FOrdersServiceProvider.php\n├── database\u002F\n│   ├── migrations\u002F\n│   ├── factories\u002FOrderFactory.php\n│   └── seeders\u002FOrdersSeeder.php\n├── lang\u002F\n│   └── en\u002Fmessages.php\n├── resources\u002F\n│   └── views\u002F\n├── routes\u002F\n│   ├── web.php\n│   ├── api.php\n│   ├── console.php\n│   └── channels.php\n└── tests\u002F\n    ├── Feature\u002F\n    └── Unit\u002F\n","text",[208,233,230],{"__ignoreMap":234},"",[199,236,237,238,240],{},"Only ",[208,239,218],{}," is required. The generators create the other folders when you first need them.",[221,242,244],{"id":243},"the-layers-composerjson","The layer's composer.json",[199,246,247,248,250,251,254,255,257],{},"OSDD treats a folder as a layer when its ",[208,249,218],{}," has ",[208,252,253],{},"\"type\": \"layer\"",". ",[208,256,114],{}," writes this one:",[226,259,264],{"className":260,"code":261,"filename":262,"language":263,"meta":234,"style":234},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n    \"name\": \"functional\u002Forders\",\n    \"description\": \"\",\n    \"type\": \"layer\",\n    \"version\": \"1.0.0\",\n    \"require\": {\n        \"lomkit\u002Flaravel-osdd\": \"*\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"Functional\\\\Orders\\\\\": \"src\u002F\",\n            \"Functional\\\\Orders\\\\Database\\\\Seeders\\\\\": \"database\u002Fseeders\u002F\",\n            \"Functional\\\\Orders\\\\Database\\\\Factories\\\\\": \"database\u002Ffactories\u002F\"\n        }\n    },\n    \"minimum-stability\": \"stable\",\n    \"prefer-stable\": true,\n    \"extra\": {\n        \"laravel\": {\n            \"providers\": [\n                \"Functional\\\\Orders\\\\Providers\\\\OrdersServiceProvider\"\n            ]\n        }\n    }\n}\n","functional\u002Forders\u002Fcomposer.json","json",[208,265,266,275,303,320,341,362,377,399,405,419,433,465,500,533,539,544,565,580,594,608,623,647,653,658,664],{"__ignoreMap":234},[267,268,271],"span",{"class":269,"line":270},"line",1,[267,272,274],{"class":273},"sMK4o","{\n",[267,276,278,281,285,288,291,294,298,300],{"class":269,"line":277},2,[267,279,280],{"class":273},"    \"",[267,282,284],{"class":283},"spNyl","name",[267,286,287],{"class":273},"\"",[267,289,290],{"class":273},":",[267,292,293],{"class":273}," \"",[267,295,297],{"class":296},"sfazB","functional\u002Forders",[267,299,287],{"class":273},[267,301,302],{"class":273},",\n",[267,304,306,308,311,313,315,318],{"class":269,"line":305},3,[267,307,280],{"class":273},[267,309,310],{"class":283},"description",[267,312,287],{"class":273},[267,314,290],{"class":273},[267,316,317],{"class":273}," \"\"",[267,319,302],{"class":273},[267,321,323,325,328,330,332,334,337,339],{"class":269,"line":322},4,[267,324,280],{"class":273},[267,326,327],{"class":283},"type",[267,329,287],{"class":273},[267,331,290],{"class":273},[267,333,293],{"class":273},[267,335,336],{"class":296},"layer",[267,338,287],{"class":273},[267,340,302],{"class":273},[267,342,344,346,349,351,353,355,358,360],{"class":269,"line":343},5,[267,345,280],{"class":273},[267,347,348],{"class":283},"version",[267,350,287],{"class":273},[267,352,290],{"class":273},[267,354,293],{"class":273},[267,356,357],{"class":296},"1.0.0",[267,359,287],{"class":273},[267,361,302],{"class":273},[267,363,365,367,370,372,374],{"class":269,"line":364},6,[267,366,280],{"class":273},[267,368,369],{"class":283},"require",[267,371,287],{"class":273},[267,373,290],{"class":273},[267,375,376],{"class":273}," {\n",[267,378,380,383,387,389,391,393,396],{"class":269,"line":379},7,[267,381,382],{"class":273},"        \"",[267,384,386],{"class":385},"sBMFI","lomkit\u002Flaravel-osdd",[267,388,287],{"class":273},[267,390,290],{"class":273},[267,392,293],{"class":273},[267,394,395],{"class":296},"*",[267,397,398],{"class":273},"\"\n",[267,400,402],{"class":269,"line":401},8,[267,403,404],{"class":273},"    },\n",[267,406,408,410,413,415,417],{"class":269,"line":407},9,[267,409,280],{"class":273},[267,411,412],{"class":283},"autoload",[267,414,287],{"class":273},[267,416,290],{"class":273},[267,418,376],{"class":273},[267,420,422,424,427,429,431],{"class":269,"line":421},10,[267,423,382],{"class":273},[267,425,426],{"class":385},"psr-4",[267,428,287],{"class":273},[267,430,290],{"class":273},[267,432,376],{"class":273},[267,434,436,439,443,447,450,452,454,456,458,461,463],{"class":269,"line":435},11,[267,437,438],{"class":273},"            \"",[267,440,442],{"class":441},"sbssI","Functional",[267,444,446],{"class":445},"sTEyZ","\\\\",[267,448,449],{"class":441},"Orders",[267,451,446],{"class":445},[267,453,287],{"class":273},[267,455,290],{"class":273},[267,457,293],{"class":273},[267,459,460],{"class":296},"src\u002F",[267,462,287],{"class":273},[267,464,302],{"class":273},[267,466,468,470,472,474,476,478,481,483,485,487,489,491,493,496,498],{"class":269,"line":467},12,[267,469,438],{"class":273},[267,471,442],{"class":441},[267,473,446],{"class":445},[267,475,449],{"class":441},[267,477,446],{"class":445},[267,479,480],{"class":441},"Database",[267,482,446],{"class":445},[267,484,72],{"class":441},[267,486,446],{"class":445},[267,488,287],{"class":273},[267,490,290],{"class":273},[267,492,293],{"class":273},[267,494,495],{"class":296},"database\u002Fseeders\u002F",[267,497,287],{"class":273},[267,499,302],{"class":273},[267,501,503,505,507,509,511,513,515,517,520,522,524,526,528,531],{"class":269,"line":502},13,[267,504,438],{"class":273},[267,506,442],{"class":441},[267,508,446],{"class":445},[267,510,449],{"class":441},[267,512,446],{"class":445},[267,514,480],{"class":441},[267,516,446],{"class":445},[267,518,519],{"class":441},"Factories",[267,521,446],{"class":445},[267,523,287],{"class":273},[267,525,290],{"class":273},[267,527,293],{"class":273},[267,529,530],{"class":296},"database\u002Ffactories\u002F",[267,532,398],{"class":273},[267,534,536],{"class":269,"line":535},14,[267,537,538],{"class":273},"        }\n",[267,540,542],{"class":269,"line":541},15,[267,543,404],{"class":273},[267,545,547,549,552,554,556,558,561,563],{"class":269,"line":546},16,[267,548,280],{"class":273},[267,550,551],{"class":283},"minimum-stability",[267,553,287],{"class":273},[267,555,290],{"class":273},[267,557,293],{"class":273},[267,559,560],{"class":296},"stable",[267,562,287],{"class":273},[267,564,302],{"class":273},[267,566,568,570,573,575,577],{"class":269,"line":567},17,[267,569,280],{"class":273},[267,571,572],{"class":283},"prefer-stable",[267,574,287],{"class":273},[267,576,290],{"class":273},[267,578,579],{"class":273}," true,\n",[267,581,583,585,588,590,592],{"class":269,"line":582},18,[267,584,280],{"class":273},[267,586,587],{"class":283},"extra",[267,589,287],{"class":273},[267,591,290],{"class":273},[267,593,376],{"class":273},[267,595,597,599,602,604,606],{"class":269,"line":596},19,[267,598,382],{"class":273},[267,600,601],{"class":385},"laravel",[267,603,287],{"class":273},[267,605,290],{"class":273},[267,607,376],{"class":273},[267,609,611,613,616,618,620],{"class":269,"line":610},20,[267,612,438],{"class":273},[267,614,615],{"class":441},"providers",[267,617,287],{"class":273},[267,619,290],{"class":273},[267,621,622],{"class":273}," [\n",[267,624,626,629,631,633,635,637,640,642,645],{"class":269,"line":625},21,[267,627,628],{"class":273},"                \"",[267,630,442],{"class":296},[267,632,446],{"class":445},[267,634,449],{"class":296},[267,636,446],{"class":445},[267,638,639],{"class":296},"Providers",[267,641,446],{"class":445},[267,643,644],{"class":296},"OrdersServiceProvider",[267,646,398],{"class":273},[267,648,650],{"class":269,"line":649},22,[267,651,652],{"class":273},"            ]\n",[267,654,656],{"class":269,"line":655},23,[267,657,538],{"class":273},[267,659,661],{"class":269,"line":660},24,[267,662,663],{"class":273},"    }\n",[267,665,667],{"class":269,"line":666},25,[267,668,669],{"class":273},"}\n",[671,672,673,686,692],"ul",{},[674,675,676,678,679,682,683,685],"li",{},[208,677,284],{}," is the layer's identifier: the ",[208,680,681],{},"--layer"," option of every generator takes it, and ",[208,684,134],{}," names the layer's test suite after it.",[674,687,688,689,691],{},"The shortest ",[208,690,426],{}," prefix is the layer's root namespace, and its directory the layer's source directory. Generators write classes under it.",[674,693,694,697],{},[208,695,696],{},"extra.laravel.providers"," lets Laravel discover the layer's service provider, like any package.",[199,699,700],{},"A layer that depends on another one requires it:",[226,702,705],{"className":260,"code":703,"filename":704,"language":263,"meta":234,"style":234},"\"require\": {\n    \"lomkit\u002Flaravel-osdd\": \"*\",\n    \"functional\u002Forders\": \"*\"\n}\n","functional\u002Fbilling\u002Fcomposer.json",[208,706,707,719,737,753],{"__ignoreMap":234},[267,708,709,711,713,715,717],{"class":269,"line":270},[267,710,287],{"class":273},[267,712,369],{"class":296},[267,714,287],{"class":273},[267,716,206],{"class":445},[267,718,274],{"class":273},[267,720,721,723,725,727,729,731,733,735],{"class":269,"line":277},[267,722,280],{"class":273},[267,724,386],{"class":283},[267,726,287],{"class":273},[267,728,290],{"class":273},[267,730,293],{"class":273},[267,732,395],{"class":296},[267,734,287],{"class":273},[267,736,302],{"class":273},[267,738,739,741,743,745,747,749,751],{"class":269,"line":305},[267,740,280],{"class":273},[267,742,297],{"class":283},[267,744,287],{"class":273},[267,746,290],{"class":273},[267,748,293],{"class":273},[267,750,395],{"class":296},[267,752,398],{"class":273},[267,754,755],{"class":269,"line":322},[267,756,669],{"class":273},[199,758,759,760,254,763,767,768,770],{},"Create a layer with its requirements with ",[208,761,762],{},"php artisan osdd:layer functional\u002Fbilling --requires=functional\u002Forders",[203,764,765],{"href":123},[208,766,122],{}," then makes sure the code only uses the layers it requires: see ",[203,769,42],{"href":43},".",[221,772,774],{"id":773},"naming","Naming",[199,776,777,778,781,782,785,786,789,790,792,793,795],{},"A layer name is a Composer package name: ",[208,779,780],{},"vendor\u002Fpackage",", in lowercase letters and digits, with words separated by ",[208,783,784],{},"-",", ",[208,787,788],{},"_"," or ",[208,791,770],{},". Each part starts with a letter, so that it maps to a PHP namespace. ",[208,794,114],{}," refuses any other name and writes nothing:",[226,797,800],{"className":798,"code":799,"language":231},[229],"Invalid layer name [functional\u002FMy_Orders]. Use a Composer package name: vendor\u002Fpackage, in lowercase letters and digits, words separated by '-', '_' or '.' (functional\u002Forders).\n",[208,801,799],{"__ignoreMap":234},[199,803,804],{},"The name gives the namespace: each part is converted to PascalCase.",[806,807,808,824],"table",{},[809,810,811],"thead",{},[812,813,814,818,821],"tr",{},[815,816,817],"th",{},"Layer",[815,819,820],{},"Namespace",[815,822,823],{},"Service provider",[825,826,827,843,860,877],"tbody",{},[812,828,829,834,839],{},[830,831,832],"td",{},[208,833,297],{},[830,835,836],{},[208,837,838],{},"Functional\\Orders",[830,840,841],{},[208,842,644],{},[812,844,845,850,855],{},[830,846,847],{},[208,848,849],{},"functional\u002Fexternal-accounts",[830,851,852],{},[208,853,854],{},"Functional\\ExternalAccounts",[830,856,857],{},[208,858,859],{},"ExternalAccountsServiceProvider",[812,861,862,867,872],{},[830,863,864],{},[208,865,866],{},"functional\u002Fsales.orders",[830,868,869],{},[208,870,871],{},"Functional\\SalesOrders",[830,873,874],{},[208,875,876],{},"SalesOrdersServiceProvider",[812,878,879,884,889],{},[830,880,881],{},[208,882,883],{},"technical\u002Ffeature-flags",[830,885,886],{},[208,887,888],{},"Technical\\FeatureFlags",[830,890,891],{},[208,892,893],{},"FeatureFlagsServiceProvider",[199,895,896,897,900,901,903,904,770],{},"The vendor picks the bucket: ",[208,898,899],{},"osdd:layer functional\u002Forders"," creates the layer in ",[208,902,210],{},". See ",[203,905,38],{"href":39},[221,907,909],{"id":908},"invalid-composerjson-files","Invalid composer.json files",[199,911,912,913,915],{},"A layer ",[208,914,218],{}," that OSDD cannot read is reported instead of breaking every command:",[671,917,918,921,927,942],{},[674,919,920],{},"invalid JSON, or a JSON value that is not an object;",[674,922,923,924,926],{},"a missing or invalid ",[208,925,284],{},";",[674,928,929,930,785,933,785,936,789,938,941],{},"an ",[208,931,932],{},"autoload.psr-4",[208,934,935],{},"autoload-dev.psr-4",[208,937,369],{},[208,939,940],{},"require-dev"," that is not a map;",[674,943,929,944,946],{},[208,945,696],{}," that is not a list of strings.",[199,948,949,953,954,785,957,785,959,785,961,211,963,965],{},[203,950,951],{"href":119},[208,952,118],{}," shows the file with its error and keeps listing the valid layers. The generators, ",[208,955,956],{},"osdd:seed --layer",[208,958,122],{},[208,960,126],{},[208,962,134],{},[208,964,142],{}," stop with exit code 1 and name the file:",[226,967,970],{"className":968,"code":969,"language":231},[229],"Invalid layer manifest [functional\u002Forders\u002Fcomposer.json]: it has no \"name\".\n",[208,971,969],{"__ignoreMap":234},[221,973,975],{"id":974},"registration","Registration",[199,977,978,211,980,982,983,290],{},[208,979,110],{},[208,981,114],{}," register each layer in the root ",[208,984,218],{},[226,986,988],{"className":260,"code":987,"filename":218,"language":263,"meta":234,"style":234},"{\n    \"require\": {\n        \"functional\u002Forders\": \"*\",\n        \"technical\u002Fosdd\": \"*\"\n    },\n    \"repositories\": [\n        { \"type\": \"path\", \"url\": \".\u002Ffunctional\u002F*\" },\n        { \"type\": \"path\", \"url\": \".\u002Ftechnical\u002F*\" }\n    ]\n}\n",[208,989,990,994,1006,1024,1041,1045,1058,1100,1138,1143],{"__ignoreMap":234},[267,991,992],{"class":269,"line":270},[267,993,274],{"class":273},[267,995,996,998,1000,1002,1004],{"class":269,"line":277},[267,997,280],{"class":273},[267,999,369],{"class":283},[267,1001,287],{"class":273},[267,1003,290],{"class":273},[267,1005,376],{"class":273},[267,1007,1008,1010,1012,1014,1016,1018,1020,1022],{"class":269,"line":305},[267,1009,382],{"class":273},[267,1011,297],{"class":385},[267,1013,287],{"class":273},[267,1015,290],{"class":273},[267,1017,293],{"class":273},[267,1019,395],{"class":296},[267,1021,287],{"class":273},[267,1023,302],{"class":273},[267,1025,1026,1028,1031,1033,1035,1037,1039],{"class":269,"line":322},[267,1027,382],{"class":273},[267,1029,1030],{"class":385},"technical\u002Fosdd",[267,1032,287],{"class":273},[267,1034,290],{"class":273},[267,1036,293],{"class":273},[267,1038,395],{"class":296},[267,1040,398],{"class":273},[267,1042,1043],{"class":269,"line":343},[267,1044,404],{"class":273},[267,1046,1047,1049,1052,1054,1056],{"class":269,"line":364},[267,1048,280],{"class":273},[267,1050,1051],{"class":283},"repositories",[267,1053,287],{"class":273},[267,1055,290],{"class":273},[267,1057,622],{"class":273},[267,1059,1060,1063,1065,1067,1069,1071,1073,1076,1078,1081,1083,1086,1088,1090,1092,1095,1097],{"class":269,"line":379},[267,1061,1062],{"class":273},"        {",[267,1064,293],{"class":273},[267,1066,327],{"class":385},[267,1068,287],{"class":273},[267,1070,290],{"class":273},[267,1072,293],{"class":273},[267,1074,1075],{"class":296},"path",[267,1077,287],{"class":273},[267,1079,1080],{"class":273},",",[267,1082,293],{"class":273},[267,1084,1085],{"class":385},"url",[267,1087,287],{"class":273},[267,1089,290],{"class":273},[267,1091,293],{"class":273},[267,1093,1094],{"class":296},".\u002Ffunctional\u002F*",[267,1096,287],{"class":273},[267,1098,1099],{"class":273}," },\n",[267,1101,1102,1104,1106,1108,1110,1112,1114,1116,1118,1120,1122,1124,1126,1128,1130,1133,1135],{"class":269,"line":401},[267,1103,1062],{"class":273},[267,1105,293],{"class":273},[267,1107,327],{"class":385},[267,1109,287],{"class":273},[267,1111,290],{"class":273},[267,1113,293],{"class":273},[267,1115,1075],{"class":296},[267,1117,287],{"class":273},[267,1119,1080],{"class":273},[267,1121,293],{"class":273},[267,1123,1085],{"class":385},[267,1125,287],{"class":273},[267,1127,290],{"class":273},[267,1129,293],{"class":273},[267,1131,1132],{"class":296},".\u002Ftechnical\u002F*",[267,1134,287],{"class":273},[267,1136,1137],{"class":273}," }\n",[267,1139,1140],{"class":269,"line":407},[267,1141,1142],{"class":273},"    ]\n",[267,1144,1145],{"class":269,"line":421},[267,1146,669],{"class":273},[199,1148,1149,1150,1153,1154,1157,1158,770],{},"One path repository per folder covers every layer inside it. After ",[208,1151,1152],{},"composer update functional\u002Forders",", Composer symlinks the layer into ",[208,1155,1156],{},"vendor\u002F"," and Laravel discovers its service provider. Do not list layer providers in ",[208,1159,1160],{},"bootstrap\u002Fproviders.php",[199,1162,1163,1167,1168,1170,1171,1173,1174,770],{},[203,1164,1165],{"href":119},[208,1166,118],{}," shows each layer with its health: required in the root ",[208,1169,218],{},", covered by a path repository, installed, provider extending ",[208,1172,156],{},", test suite in ",[208,1175,1176],{},"phpunit.xml",[1178,1179,1180],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":234,"searchDepth":270,"depth":277,"links":1182},[1183,1184,1185,1186,1187],{"id":223,"depth":277,"text":224},{"id":243,"depth":277,"text":244},{"id":773,"depth":277,"text":774},{"id":908,"depth":277,"text":909},{"id":974,"depth":277,"text":975},"What a layer is, what its composer.json declares, and how it gets installed.","md",null,{},true,{"title":34,"description":1188},{"loc":35},"yFPbGjOK2neNHh1rKX7jCfb7MRFPCX-1CdMlnSmHnbM",[1197,1199],{"title":23,"path":24,"stem":25,"description":1198,"children":-1},"Add layers to an application that keeps its app\u002F folder, and move domains into them one at a time.",{"title":38,"path":39,"stem":40,"description":1200,"children":-1},"The folders that hold the layers, what goes in each one, and how OSDD finds the layers inside them.",1794437210447]