[{"data":1,"prerenderedAt":1178},["ShallowReactive",2],{"navigation":3,"\u002Fcommands\u002Fosdd-layer":193,"\u002Fcommands\u002Fosdd-layer-surround":1173},[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":114,"body":195,"description":1165,"extension":1166,"links":1167,"meta":1168,"navigation":1169,"path":115,"seo":1170,"sitemap":1171,"stem":116,"__hash__":1172},"docs\u002F4.commands\u002F03.osdd-layer.md",{"type":196,"value":197,"toc":1150},"minimark",[198,209,214,239,242,300,308,312,335,444,461,466,473,510,514,517,546,555,558,564,728,743,768,813,827,831,838,874,967,979,983,988,1027,1041,1045,1052,1058,1085,1089,1093,1123,1127,1146],[199,200,201,204,205,208],"p",{},[202,203,114],"code",{}," creates a layer, runs the generators you pick and registers the layer in the root ",[202,206,207],{},"composer.json",".",[210,211,213],"h2",{"id":212},"interactive","Interactive",[215,216,221],"pre",{"className":217,"code":218,"language":219,"meta":220,"style":220},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","php artisan osdd:layer\n","bash","",[202,222,223],{"__ignoreMap":220},[224,225,228,232,236],"span",{"class":226,"line":227},"line",1,[224,229,231],{"class":230},"sBMFI","php",[224,233,235],{"class":234},"sfazB"," artisan",[224,237,238],{"class":234}," osdd:layer\n",[199,240,241],{},"The command asks:",[243,244,245,265,280,290],"ol",{},[246,247,248,252,253,256,257,260,261,264],"li",{},[249,250,251],"strong",{},"Where to create the layer",", among the keys of ",[202,254,255],{},"osdd.layers.paths"," (",[202,258,259],{},"functional"," or ",[202,262,263],{},"technical","). With a single path, it skips the question. The key becomes the vendor of the package.",[246,266,267,270,271,274,275,208],{},[249,268,269],{},"The layer name",", such as ",[202,272,273],{},"orders",". See ",[276,277,279],"a",{"href":278},"\u002Fconcepts\u002Flayers#naming","Naming",[246,281,282,285,286,208],{},[249,283,284],{},"Which generators to run."," See ",[276,287,289],{"href":288},"#generators","the list below",[246,291,292,295,296,299],{},[249,293,294],{},"Whether to run"," ",[202,297,298],{},"composer update functional\u002Forders"," (default: yes).",[215,301,306],{"className":302,"code":304,"language":305},[303],"language-text","┌ Where should the layer be created? ──────────────────────────┐\n│ › ● functional                                               │\n│   ○ technical                                                │\n└──────────────────────────────────────────────────────────────┘\n\n┌ Layer name ──────────────────────────────────────────────────┐\n│ orders                                                       │\n└──────────────────────────────────────────────────────────────┘\n\n┌ Which generators should be run? ─────────────────────────────┐\n│ › ◼ migration                                                │\n│   ◼ model                                                    │\n│   ◼ factory                                                  │\n│   ◻ seeder                                                   │\n│   ◼ provider                                                 │\n│   ◼ test                                                     │\n│   ◻ controller                                               │\n│   ◻ policy                                                   │\n│   ◻ routes                                                   │\n└──────────────────────────────────────────────────────────────┘\n","text",[202,307,304],{"__ignoreMap":220},[210,309,311],{"id":310},"with-arguments","With arguments",[215,313,315],{"className":217,"code":314,"language":219,"meta":220,"style":220},"php artisan osdd:layer functional\u002Forders --generators=migration,model,factory,provider,test --composer-update\n",[202,316,317],{"__ignoreMap":220},[224,318,319,321,323,326,329,332],{"class":226,"line":227},[224,320,231],{"class":230},[224,322,235],{"class":234},[224,324,325],{"class":234}," osdd:layer",[224,327,328],{"class":234}," functional\u002Forders",[224,330,331],{"class":234}," --generators=migration,model,factory,provider,test",[224,333,334],{"class":234}," --composer-update\n",[336,337,338,351],"table",{},[339,340,341],"thead",{},[342,343,344,348],"tr",{},[345,346,347],"th",{},"Argument \u002F Option",[345,349,350],{},"Description",[352,353,354,378,396,406,416,426],"tbody",{},[342,355,356,362],{},[357,358,359],"td",{},[202,360,361],{},"name",[357,363,364,365,368,369,372,373,375,376,208],{},"Name of the layer, ",[202,366,367],{},"vendor\u002Fpackage",". The vendor picks the folder: ",[202,370,371],{},"functional\u002Forders"," goes to the ",[202,374,259],{}," path of ",[202,377,255],{},[342,379,380,385],{},[357,381,382],{},[202,383,384],{},"--generators",[357,386,387,388,391,392,395],{},"Generators to run, comma-separated (",[202,389,390],{},"--generators=model,policy",") or repeated (",[202,393,394],{},"--generators=model --generators=policy",").",[342,397,398,403],{},[357,399,400],{},[202,401,402],{},"--requires",[357,404,405],{},"Layers the new layer requires, comma-separated or repeated. Full name, or package name when it is unique.",[342,407,408,413],{},[357,409,410],{},[202,411,412],{},"--target-path",[357,414,415],{},"Absolute path of the folder to create the layer in, instead of the path named after the vendor.",[342,417,418,423],{},[357,419,420],{},[202,421,422],{},"--force",[357,424,425],{},"Run the generators again on an existing layer.",[342,427,428,437],{},[357,429,430,433,434],{},[202,431,432],{},"--composer-update"," \u002F ",[202,435,436],{},"--no-composer-update",[357,438,439,440,443],{},"Run or skip ",[202,441,442],{},"composer update vendor\u002Fpackage"," without asking.",[199,445,446,447,450,451,453,454,457,458,208],{},"The layer is created in ",[202,448,449],{},"\u003Cpath>\u002F\u003Cpackage>",", and its namespace comes from the name: ",[202,452,371],{}," gives ",[202,455,456],{},"Functional\\Orders",". The command ends with ",[202,459,460],{},"Layer functional\u002Forders created at functional\u002Forders.",[462,463,465],"h3",{"id":464},"without-a-terminal","Without a terminal",[199,467,468,469,472],{},"Under ",[202,470,471],{},"-n",", in CI, in a script or when a coding agent runs it, the command asks nothing:",[474,475,476,479,492,498],"ul",{},[246,477,478],{},"the name argument is required;",[246,480,481,482,484,485,487,488,491],{},"the vendor must match a key of ",[202,483,255],{},", or you pass ",[202,486,412],{},". Otherwise the command fails: ",[202,489,490],{},"The vendor [acme] matches no key of osdd.layers.paths (functional, technical). Name the layer after one of them, or pass --target-path.",";",[246,493,494,495,497],{},"without ",[202,496,384],{},", the default generators run;",[246,499,500,503,504,506,507,208],{},[202,501,502],{},"composer update"," is skipped unless you pass ",[202,505,432],{},". The command prints ",[202,508,509],{},"Run composer update functional\u002Forders to install the new layers.",[462,511,513],{"id":512},"errors","Errors",[199,515,516],{},"The command fails with exit code 1 and writes nothing when:",[474,518,519,525,531,537],{},[246,520,521,522,491],{},"the name is not a valid ",[276,523,524],{"href":278},"layer name",[246,526,527,528,491],{},"a generator is unknown: ",[202,529,530],{},"Unknown generator [modle]. Valid generators: migration, model, factory, seeder, provider, test, controller, policy, routes.",[246,532,533,534,536],{},"a ",[202,535,402],{}," layer is unknown, ambiguous, or the new layer itself;",[246,538,539,540,542,543,208],{},"the layer directory exists and is not empty, without ",[202,541,422],{},": ",[202,544,545],{},"The layer directory [...] already exists. Pass --force to overwrite the files osdd:layer writes.",[199,547,548,549,551,552,554],{},"When ",[202,550,502],{}," runs and fails, the command exits with 1 and keeps the layer: run ",[202,553,298],{}," once the error is fixed.",[210,556,146],{"id":557},"generators",[199,559,560,561,563],{},"For a layer named ",[202,562,371],{},":",[336,565,566,580],{},[339,567,568],{},[342,569,570,573,577],{},[345,571,572],{},"Generator",[345,574,576],{"align":575},"center","Default",[345,578,579],{},"Creates",[352,581,582,597,611,625,639,653,668,682,704],{},[342,583,584,589,592],{},[357,585,586],{},[202,587,588],{},"migration",[357,590,591],{"align":575},"✓",[357,593,594],{},[202,595,596],{},"database\u002Fmigrations\u002F\u003Ctimestamp>_create_orders_table.php",[342,598,599,604,606],{},[357,600,601],{},[202,602,603],{},"model",[357,605,591],{"align":575},[357,607,608],{},[202,609,610],{},"src\u002FModels\u002FOrder.php",[342,612,613,618,620],{},[357,614,615],{},[202,616,617],{},"factory",[357,619,591],{"align":575},[357,621,622],{},[202,623,624],{},"database\u002Ffactories\u002FOrderFactory.php",[342,626,627,632,634],{},[357,628,629],{},[202,630,631],{},"provider",[357,633,591],{"align":575},[357,635,636],{},[202,637,638],{},"src\u002FProviders\u002FOrdersServiceProvider.php",[342,640,641,646,648],{},[357,642,643],{},[202,644,645],{},"test",[357,647,591],{"align":575},[357,649,650],{},[202,651,652],{},"tests\u002FFeature\u002FOrdersTest.php",[342,654,655,660,662],{},[357,656,657],{},[202,658,659],{},"seeder",[357,661],{"align":575},[357,663,664,667],{},[202,665,666],{},"database\u002Fseeders\u002FOrdersSeeder.php",", registered in the provider",[342,669,670,675,677],{},[357,671,672],{},[202,673,674],{},"controller",[357,676],{"align":575},[357,678,679],{},[202,680,681],{},"src\u002FHttp\u002FControllers\u002FOrdersController.php",[342,683,684,689,691],{},[357,685,686],{},[202,687,688],{},"policy",[357,690],{"align":575},[357,692,693,696,697,700,701,703],{},[202,694,695],{},"src\u002FPolicies\u002FOrdersPolicy.php",", bound to the ",[202,698,699],{},"Order"," model when ",[202,702,603],{}," runs too",[342,705,706,711,713],{},[357,707,708],{},[202,709,710],{},"routes",[357,712],{"align":575},[357,714,715,718,719,718,722,718,725],{},[202,716,717],{},"routes\u002Fweb.php",", ",[202,720,721],{},"routes\u002Fapi.php",[202,723,724],{},"routes\u002Fconsole.php",[202,726,727],{},"routes\u002Fchannels.php",[199,729,730,731,734,735,738,739,742],{},"The model takes the singular of the layer name and the table its plural: ",[202,732,733],{},"external-accounts"," gives the ",[202,736,737],{},"ExternalAccount"," model and the ",[202,740,741],{},"external_accounts"," table.",[199,744,745,746,748,749,751,752,754,755,757,758,751,760,762,763,751,765,767],{},"The generators run in a fixed dependency order: ",[202,747,631],{}," first, so that ",[202,750,588],{}," and ",[202,753,659],{}," can register themselves in it; ",[202,756,603],{}," before ",[202,759,617],{},[202,761,688],{},". With both ",[202,764,603],{},[202,766,617],{},", the model is generated with its factory. The others run in the order you give.",[199,769,770,771,773,774,777,778,780,781,786,787,751,792,795,796,751,799,802,803,805,806,808,809,812],{},"The ",[202,772,631],{}," generator also lists the provider under ",[202,775,776],{},"extra.laravel.providers"," in the layer's ",[202,779,207],{},". The generated provider loads the layer's migrations, calls ",[276,782,783],{"href":65},[202,784,785],{},"withRouting()"," with the four route files, and ",[276,788,789],{"href":69},[202,790,791],{},"withViews()",[202,793,794],{},"withTranslations()"," with the layer's ",[202,797,798],{},"resources\u002Fviews",[202,800,801],{},"lang"," folders. Missing files and folders are skipped, so the calls are safe without the ",[202,804,710],{}," generator. It registers no seeder: the ",[202,807,659],{}," generator adds the ",[202,810,811],{},"loadSeeders()"," call.",[199,814,815,816,819,820,822,823,826],{},"When another layer already has the same package name (",[202,817,818],{},"technical\u002Forders"," next to ",[202,821,371],{},"), the provider passes ",[202,824,825],{},"'functional-orders'"," as the views and translations namespace, so the two layers do not collide.",[210,828,830],{"id":829},"requirements","Requirements",[199,832,833,835,836,563],{},[202,834,402],{}," adds the layers the new one depends on to its ",[202,837,207],{},[215,839,841],{"className":217,"code":840,"language":219,"meta":220,"style":220},"php artisan osdd:layer functional\u002Finvoices --requires=functional\u002Forders --requires=technical\u002Fcore\nphp artisan osdd:layer functional\u002Finvoices --requires=orders,core\n",[202,842,843,860],{"__ignoreMap":220},[224,844,845,847,849,851,854,857],{"class":226,"line":227},[224,846,231],{"class":230},[224,848,235],{"class":234},[224,850,325],{"class":234},[224,852,853],{"class":234}," functional\u002Finvoices",[224,855,856],{"class":234}," --requires=functional\u002Forders",[224,858,859],{"class":234}," --requires=technical\u002Fcore\n",[224,861,863,865,867,869,871],{"class":226,"line":862},2,[224,864,231],{"class":230},[224,866,235],{"class":234},[224,868,325],{"class":234},[224,870,853],{"class":234},[224,872,873],{"class":234}," --requires=orders,core\n",[215,875,880],{"className":876,"code":877,"filename":878,"language":879,"meta":220,"style":220},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\"require\": {\n    \"lomkit\u002Flaravel-osdd\": \"*\",\n    \"functional\u002Forders\": \"*\",\n    \"technical\u002Fcore\": \"*\"\n}\n","functional\u002Finvoices\u002Fcomposer.json","json",[202,881,882,899,923,942,961],{"__ignoreMap":220},[224,883,884,888,891,893,896],{"class":226,"line":227},[224,885,887],{"class":886},"sMK4o","\"",[224,889,890],{"class":234},"require",[224,892,887],{"class":886},[224,894,542],{"class":895},"sTEyZ",[224,897,898],{"class":886},"{\n",[224,900,901,904,908,910,912,915,918,920],{"class":226,"line":862},[224,902,903],{"class":886},"    \"",[224,905,907],{"class":906},"spNyl","lomkit\u002Flaravel-osdd",[224,909,887],{"class":886},[224,911,563],{"class":886},[224,913,914],{"class":886}," \"",[224,916,917],{"class":234},"*",[224,919,887],{"class":886},[224,921,922],{"class":886},",\n",[224,924,926,928,930,932,934,936,938,940],{"class":226,"line":925},3,[224,927,903],{"class":886},[224,929,371],{"class":906},[224,931,887],{"class":886},[224,933,563],{"class":886},[224,935,914],{"class":886},[224,937,917],{"class":234},[224,939,887],{"class":886},[224,941,922],{"class":886},[224,943,945,947,950,952,954,956,958],{"class":226,"line":944},4,[224,946,903],{"class":886},[224,948,949],{"class":906},"technical\u002Fcore",[224,951,887],{"class":886},[224,953,563],{"class":886},[224,955,914],{"class":886},[224,957,917],{"class":234},[224,959,960],{"class":886},"\"\n",[224,962,964],{"class":226,"line":963},5,[224,965,966],{"class":886},"}\n",[199,968,969,970,973,974,976,977,208],{},"Names resolve like the generators' ",[202,971,972],{},"--layer",". With ",[202,975,422],{}," on an existing layer, the requirements are added to the ones it has. See ",[276,978,42],{"href":43},[210,980,982],{"id":981},"what-gets-registered","What gets registered",[199,984,985,986,563],{},"Whatever the generators, ",[202,987,114],{},[243,989,990,1000,1013],{},[246,991,992,993,995,996,999],{},"Writes the layer's ",[202,994,207],{}," with ",[202,997,998],{},"\"type\": \"layer\""," and its PSR-4 namespaces.",[246,1001,1002,1003,270,1005,1008,1009,1012],{},"Adds a path repository for the layer's folder to the root ",[202,1004,207],{},[202,1006,1007],{},".\u002Ffunctional\u002F*",", once per folder, or a ",[202,1010,1011],{},"..\u002F"," URL for a folder outside the project.",[246,1014,1015,1016,1019,1020,1022,1023,1026],{},"Requires ",[202,1017,1018],{},"\"functional\u002Forders\": \"*\""," in the root ",[202,1021,207],{},", sorted when ",[202,1024,1025],{},"config.sort-packages"," is on.",[199,1028,1029,1030,1033,1034,1036,1037,1040],{},"Empty objects such as ",[202,1031,1032],{},"\"require-dev\": {}"," stay objects, and the indentation of the file is kept. After ",[202,1035,298],{},", Laravel discovers the layer's provider. An existing ",[276,1038,1039],{"href":143},"layer cache"," is refreshed.",[210,1042,1044],{"id":1043},"existing-layers","Existing layers",[199,1046,1047,1049,1050,208],{},[202,1048,114],{}," refuses a layer directory that already exists and is not empty. To add files to an existing layer, use the ",[276,1051,557],{"href":147},[199,1053,1054,1055,1057],{},"With ",[202,1056,422],{},", it runs the generators again:",[474,1059,1060,1063,1066,1073],{},[246,1061,1062],{},"the provider and the route files are rewritten;",[246,1064,1065],{},"the model and the controller are overwritten;",[246,1067,1068,1069,1072],{},"the other generated files are kept, and no second ",[202,1070,1071],{},"create_*_table"," migration is added;",[246,1074,1075,1076,1078,1079,1081,1082,1084],{},"the layer's ",[202,1077,207],{}," is kept: it only gains the keys of a new layer that it lacks, so its ",[202,1080,890],{},", its ",[202,1083,776],{}," and your own keys stay.",[210,1086,1088],{"id":1087},"examples","Examples",[462,1090,1092],{"id":1091},"an-api-layer","An API layer",[215,1094,1096],{"className":217,"code":1095,"language":219,"meta":220,"style":220},"php artisan osdd:layer functional\u002Finvoices \\\n    --generators=migration,model,factory,controller,provider,routes \\\n    --requires=functional\u002Forders\n",[202,1097,1098,1111,1118],{"__ignoreMap":220},[224,1099,1100,1102,1104,1106,1108],{"class":226,"line":227},[224,1101,231],{"class":230},[224,1103,235],{"class":234},[224,1105,325],{"class":234},[224,1107,853],{"class":234},[224,1109,1110],{"class":895}," \\\n",[224,1112,1113,1116],{"class":226,"line":862},[224,1114,1115],{"class":234},"    --generators=migration,model,factory,controller,provider,routes",[224,1117,1110],{"class":895},[224,1119,1120],{"class":226,"line":925},[224,1121,1122],{"class":234},"    --requires=functional\u002Forders\n",[462,1124,1126],{"id":1125},"an-infrastructure-layer","An infrastructure layer",[215,1128,1130],{"className":217,"code":1129,"language":219,"meta":220,"style":220},"php artisan osdd:layer technical\u002Ffeature-flags --generators=provider\n",[202,1131,1132],{"__ignoreMap":220},[224,1133,1134,1136,1138,1140,1143],{"class":226,"line":227},[224,1135,231],{"class":230},[224,1137,235],{"class":234},[224,1139,325],{"class":234},[224,1141,1142],{"class":234}," technical\u002Ffeature-flags",[224,1144,1145],{"class":234}," --generators=provider\n",[1147,1148,1149],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":220,"searchDepth":227,"depth":862,"links":1151},[1152,1153,1157,1158,1159,1160,1161],{"id":212,"depth":862,"text":213},{"id":310,"depth":862,"text":311,"children":1154},[1155,1156],{"id":464,"depth":925,"text":465},{"id":512,"depth":925,"text":513},{"id":557,"depth":862,"text":146},{"id":829,"depth":862,"text":830},{"id":981,"depth":862,"text":982},{"id":1043,"depth":862,"text":1044},{"id":1087,"depth":862,"text":1088,"children":1162},[1163,1164],{"id":1091,"depth":925,"text":1092},{"id":1125,"depth":925,"text":1126},"Create a layer, generate its first files and register it in Composer.","md",null,{},true,{"title":114,"description":1165},{"loc":115},"N1cw9ZFQO8brR4a2eCesLc7twXpUJgHcDZUwD3Sl5ho",[1174,1176],{"title":110,"path":111,"stem":112,"description":1175,"children":-1},"Convert a fresh Laravel project to layers.",{"title":118,"path":119,"stem":120,"description":1177,"children":-1},"List the layers with their providers, requirements, file counts and health.",1794437211792]