[{"data":1,"prerenderedAt":2334},["ShallowReactive",2],{"navigation":3,"\u002Fupgrade\u002Ffrom-2x":193,"\u002Fupgrade\u002Ffrom-2x-surround":2331},[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":190,"body":195,"description":2323,"extension":2324,"links":2325,"meta":2326,"navigation":2327,"path":191,"seo":2328,"sitemap":2329,"stem":192,"__hash__":2330},"docs\u002F7.upgrade\u002F1.from-2x.md",{"type":196,"value":197,"toc":2310},"minimark",[198,203,220,230,235,248,252,281,336,342,389,392,417,435,439,446,478,484,511,528,536,540,543,579,585,595,617,620,631,660,676,682,689,696,739,743,749,755,768,787,797,810,969,1003,1007,1050,1056,1078,1082,1089,1117,1152,1171,1178,1204,1230,1242,1246,1252,1259,1278,1284,1290,1341,1344,1389,1403,1414,1436,1442,1469,1475,1499,1503,1531,1537,1572,1575,1626,1656,1664,1716,1728,1761,1826,1842,1849,1885,1893,1913,1919,1942,1964,1979,1983,1986,2172,2180,2206,2212,2246,2256,2267,2295,2306],[199,200,202],"h2",{"id":201},"upgrading-to-30-from-2x","Upgrading to 3.0 from 2.x",[204,205,206,207,211,212,215,216,219],"p",{},"Version 3.0 moves the package from Xefi to Lomkit. The package is now ",[208,209,210],"code",{},"lomkit\u002Flaravel-osdd",", its namespace is ",[208,213,214],{},"Lomkit\\Osdd"," and its service provider is ",[208,217,218],{},"Lomkit\\Osdd\\OsddServiceProvider",".",[221,222,223],"warning",{},[204,224,225,226,229],{},"Follow the steps in order. Composer boots the application (",[208,227,228],{},"php artisan package:discover",") right after it installs the new package, so your code must already use the new namespace when you run the update.",[231,232,234],"h3",{"id":233},"requirements","Requirements",[236,237,238,242],"ul",{},[239,240,241],"li",{},"PHP 8.3 or later.",[239,243,244,245,219],{},"Laravel 13 or later. Applications on Laravel 12 stay on 2.x, or update Laravel first: ",[208,246,247],{},"composer update laravel\u002Fframework",[231,249,251],{"id":250},"_1-namespace","1. Namespace",[204,253,254,255,258,259,262,263,266,267,270,271,262,274,262,277,280],{},"Replace the old names across the whole project, in every folder except ",[208,256,257],{},"vendor\u002F",": the layers (",[208,260,261],{},"functional\u002F",", ",[208,264,265],{},"technical\u002F"," and any other path listed in ",[208,268,269],{},"osdd.layers.paths","), ",[208,272,273],{},"bootstrap\u002F",[208,275,276],{},"routes\u002F",[208,278,279],{},"tests\u002F",", a PHPStan baseline, IDE configuration files.",[282,283,284,297],"table",{},[285,286,287],"thead",{},[288,289,290,294],"tr",{},[291,292,293],"th",{},"Search",[291,295,296],{},"Replace with",[298,299,300,312,324],"tbody",{},[288,301,302,308],{},[303,304,305],"td",{},[208,306,307],{},"Xefi\\LaravelOSDD",[303,309,310],{},[208,311,214],{},[288,313,314,319],{},[303,315,316],{},[208,317,318],{},"Xefi\\\\LaravelOSDD",[303,320,321],{},[208,322,323],{},"Lomkit\\\\Osdd",[288,325,326,331],{},[303,327,328],{},[208,329,330],{},"LaravelOSDDServiceProvider",[303,332,333],{},[208,334,335],{},"OsddServiceProvider",[204,337,338,339,341],{},"The ",[208,340,318],{}," form appears in PHP strings and JSON files. To list the files that still mention the old names:",[343,344,349],"pre",{"className":345,"code":346,"language":347,"meta":348,"style":348},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","git grep -l -F LaravelOSDD -- . ':!vendor'\n","bash","",[208,350,351],{"__ignoreMap":348},[352,353,356,360,364,367,370,373,376,379,383,386],"span",{"class":354,"line":355},"line",1,[352,357,359],{"class":358},"sBMFI","git",[352,361,363],{"class":362},"sfazB"," grep",[352,365,366],{"class":362}," -l",[352,368,369],{"class":362}," -F",[352,371,372],{"class":362}," LaravelOSDD",[352,374,375],{"class":362}," --",[352,377,378],{"class":362}," .",[352,380,382],{"class":381},"sMK4o"," '",[352,384,385],{"class":362},":!vendor",[352,387,388],{"class":381},"'\n",[204,390,391],{},"Every layer service provider extends the package's base class:",[343,393,397],{"className":394,"code":395,"language":396,"meta":348,"style":348},"language-diff shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","-use Xefi\\LaravelOSDD\\LayerServiceProvider;\n+use Lomkit\\Osdd\\LayerServiceProvider;\n","diff",[208,398,399,408],{"__ignoreMap":348},[352,400,401,404],{"class":354,"line":355},[352,402,403],{"class":381},"-",[352,405,407],{"class":406},"swJcz","use Xefi\\LaravelOSDD\\LayerServiceProvider;\n",[352,409,411,414],{"class":354,"line":410},2,[352,412,413],{"class":381},"+",[352,415,416],{"class":362},"use Lomkit\\Osdd\\LayerServiceProvider;\n",[204,418,419,420,423,424,426,427,430,431,434],{},"The package's service provider ",[208,421,422],{},"Xefi\\LaravelOSDD\\LaravelOSDDServiceProvider"," is now ",[208,425,218],{},". Laravel discovers it, so only an application that registers it by hand sees this name. The ",[208,428,429],{},"technical\u002Fosdd"," layer has its own provider, ",[208,432,433],{},"Technical\\Osdd\\Providers\\OsddServiceProvider",", unrelated to the package's one: keep its name.",[231,436,438],{"id":437},"_2-package-name","2. Package name",[204,440,441,442,445],{},"Every layer requires the package in its own ",[208,443,444],{},"composer.json",". Replace the requirement in each layer, wherever it lives:",[343,447,449],{"className":394,"code":448,"language":396,"meta":348,"style":348}," \"require\": {\n-    \"xefi\u002Flaravel-osdd\": \"*\"\n+    \"lomkit\u002Flaravel-osdd\": \"*\"\n }\n",[208,450,451,457,464,472],{"__ignoreMap":348},[352,452,453],{"class":354,"line":355},[352,454,456],{"class":455},"sTEyZ"," \"require\": {\n",[352,458,459,461],{"class":354,"line":410},[352,460,403],{"class":381},[352,462,463],{"class":406},"    \"xefi\u002Flaravel-osdd\": \"*\"\n",[352,465,467,469],{"class":354,"line":466},3,[352,468,413],{"class":381},[352,470,471],{"class":362},"    \"lomkit\u002Flaravel-osdd\": \"*\"\n",[352,473,475],{"class":354,"line":474},4,[352,476,477],{"class":455}," }\n",[204,479,480,481,483],{},"Then replace it in the root ",[208,482,444],{},":",[343,485,487],{"className":394,"code":486,"language":396,"meta":348,"style":348}," \"require\": {\n-    \"xefi\u002Flaravel-osdd\": \"^2.0\"\n+    \"lomkit\u002Flaravel-osdd\": \"^3.0\"\n }\n",[208,488,489,493,500,507],{"__ignoreMap":348},[352,490,491],{"class":354,"line":355},[352,492,456],{"class":455},[352,494,495,497],{"class":354,"line":410},[352,496,403],{"class":381},[352,498,499],{"class":406},"    \"xefi\u002Flaravel-osdd\": \"^2.0\"\n",[352,501,502,504],{"class":354,"line":466},[352,503,413],{"class":381},[352,505,506],{"class":362},"    \"lomkit\u002Flaravel-osdd\": \"^3.0\"\n",[352,508,509],{"class":354,"line":474},[352,510,477],{"class":455},[204,512,513,514,516,517,520,521,524,525,527],{},"If the root ",[208,515,444],{}," lists ",[208,518,519],{},"xefi\u002Flaravel-osdd"," under ",[208,522,523],{},"extra.laravel.dont-discover",", replace it with ",[208,526,210],{},": this list holds package names, not class names.",[204,529,530,532,533,535],{},[208,531,210],{}," conflicts with ",[208,534,519],{},". If a layer still requires the old package, Composer refuses the update and names the layer.",[231,537,539],{"id":538},"_3-update","3. Update",[204,541,542],{},"Update the package and the layers only:",[343,544,546],{"className":345,"code":545,"language":347,"meta":348,"style":348},"composer update lomkit\u002Flaravel-osdd xefi\u002Flaravel-osdd \"functional\u002F*\" \"technical\u002F*\"\n",[208,547,548],{"__ignoreMap":348},[352,549,550,553,556,559,562,565,568,571,573,576],{"class":354,"line":355},[352,551,552],{"class":358},"composer",[352,554,555],{"class":362}," update",[352,557,558],{"class":362}," lomkit\u002Flaravel-osdd",[352,560,561],{"class":362}," xefi\u002Flaravel-osdd",[352,563,564],{"class":381}," \"",[352,566,567],{"class":362},"functional\u002F*",[352,569,570],{"class":381},"\"",[352,572,564],{"class":381},[352,574,575],{"class":362},"technical\u002F*",[352,577,578],{"class":381},"\"\n",[204,580,581,582,219],{},"Add your other layer folders the same way, such as ",[208,583,584],{},"\"support\u002F*\"",[204,586,587,588,590,591,594],{},"While Composer removes ",[208,589,519],{},", Laravel prints ",[208,592,593],{},"There was an error dispatching or handling the [...] event. Continuing with package removal...",". This is expected: the old package is already gone when Laravel handles its removal.",[204,596,597,598,601,602,605,606,609,610,613,614,219],{},"If you deploy with ",[208,599,600],{},"composer install --no-scripts",", delete ",[208,603,604],{},"bootstrap\u002Fcache\u002Fpackages.php"," and ",[208,607,608],{},"bootstrap\u002Fcache\u002Fservices.php"," once on each server or image. Without the Composer scripts, these files keep the old provider and every ",[208,611,612],{},"artisan"," command fails with ",[208,615,616],{},"Class \"Xefi\\LaravelOSDD\\LaravelOSDDServiceProvider\" not found",[231,618,176],{"id":619},"laravel-boost",[204,621,622,623,626,627,630],{},"Boost records the packages of your project by name in ",[208,624,625],{},"boost.json",". Replace the entry under ",[208,628,629],{},"packages",", then refresh the skill:",[343,632,634],{"className":394,"code":633,"language":396,"meta":348,"style":348}," \"packages\": [\n-    \"xefi\u002Flaravel-osdd\"\n+    \"lomkit\u002Flaravel-osdd\"\n ]\n",[208,635,636,641,648,655],{"__ignoreMap":348},[352,637,638],{"class":354,"line":355},[352,639,640],{"class":455}," \"packages\": [\n",[352,642,643,645],{"class":354,"line":410},[352,644,403],{"class":381},[352,646,647],{"class":406},"    \"xefi\u002Flaravel-osdd\"\n",[352,649,650,652],{"class":354,"line":466},[352,651,413],{"class":381},[352,653,654],{"class":362},"    \"lomkit\u002Flaravel-osdd\"\n",[352,656,657],{"class":354,"line":474},[352,658,659],{"class":455}," ]\n",[343,661,663],{"className":345,"code":662,"language":347,"meta":348,"style":348},"php artisan boost:update\n",[208,664,665],{"__ignoreMap":348},[352,666,667,670,673],{"class":354,"line":355},[352,668,669],{"class":358},"php",[352,671,672],{"class":362}," artisan",[352,674,675],{"class":362}," boost:update\n",[204,677,678,679,681],{},"Without this change, Boost no longer finds ",[208,680,519],{}," and removes the skill from your project at its next update.",[231,683,685,686],{"id":684},"dependency-bots-and-composer-audit","Dependency bots and ",[208,687,688],{},"composer audit",[204,690,691,693,694,219],{},[208,692,519],{}," is abandoned in favour of ",[208,695,210],{},[236,697,698,714],{},[239,699,700,701,703,704,707,708,710,711,713],{},"Renovate or Dependabot may offer to bump ",[208,702,519],{}," to ",[208,705,706],{},"^3.0",". Do not accept it: that version expects the ",[208,709,214],{}," namespace and breaks every layer that still uses ",[208,712,307],{},". Follow this guide instead.",[239,715,716,718,719,721,722,724,725,703,728,731,732,734,735,738],{},[208,717,688],{}," reports ",[208,720,519],{}," as abandoned and fails by default. Switching to ",[208,723,210],{}," with this guide fixes it. A project that cannot switch yet can report abandoned packages without failing by setting ",[208,726,727],{},"config.audit.abandoned",[208,729,730],{},"\"report\""," in its root ",[208,733,444],{}," (",[208,736,737],{},"config.policy.abandoned.audit"," on Composer 2.11 and later).",[231,740,742],{"id":741},"renamed-and-moved-classes","Renamed and moved classes",[204,744,745,746,748],{},"Most applications only use ",[208,747,156],{}," and the seeders, which keep their names. Code that uses the classes below must follow them.",[750,751,753],"h4",{"id":752},"seederregistry",[208,754,163],{},[204,756,757,423,760,763,764,767],{},[208,758,759],{},"Lomkit\\Osdd\\SeederRegistry",[208,761,762],{},"Lomkit\\Osdd\\Seeders\\SeederRegistry",", next to ",[208,765,766],{},"LayersSeeder",". Replace the import wherever you resolve the registry, in a seeder, a test or tinker:",[343,769,771],{"className":394,"code":770,"language":396,"meta":348,"style":348},"-use Lomkit\\Osdd\\SeederRegistry;\n+use Lomkit\\Osdd\\Seeders\\SeederRegistry;\n",[208,772,773,780],{"__ignoreMap":348},[352,774,775,777],{"class":354,"line":355},[352,776,403],{"class":381},[352,778,779],{"class":406},"use Lomkit\\Osdd\\SeederRegistry;\n",[352,781,782,784],{"class":354,"line":410},[352,783,413],{"class":381},[352,785,786],{"class":362},"use Lomkit\\Osdd\\Seeders\\SeederRegistry;\n",[750,788,790,793,794,796],{"id":789},"layerscollection-is-replaced-by-the-layers-service",[208,791,792],{},"LayersCollection"," is replaced by the ",[208,795,34],{}," service",[204,798,799,802,803,806,807,219],{},[208,800,801],{},"Lomkit\\Osdd\\Layers\\LayersCollection"," is gone. The layers are now discovered once per process and resolved from the container as ",[208,804,805],{},"Lomkit\\Osdd\\Layers\\Layers",", which is no longer a Laravel collection: use its methods, or iterate it with ",[208,808,809],{},"foreach",[282,811,812,822],{},[285,813,814],{},[288,815,816,819],{},[291,817,818],{},"2.x",[291,820,821],{},"3.0",[298,823,824,839,851,868,895,907,927,945,957],{},[288,825,826,831],{},[303,827,828],{},[208,829,830],{},"LayersCollection::fromConfig()",[303,832,833,836,837],{},[208,834,835],{},"app(Layers::class)",", or inject ",[208,838,34],{},[288,840,841,846],{},[303,842,843],{},[208,844,845],{},"LayersCollection::discover($path)",[303,847,848],{},[208,849,850],{},"(new LayerDiscovery(new LayerBuckets(['functional' => $path]), new Filesystem))->discover()",[288,852,853,858],{},[303,854,855],{},[208,856,857],{},"$layers->first(fn ($layer) => $layer->manifest->name() === $name)",[303,859,860,863,864,867],{},[208,861,862],{},"$layers->find($name)",", which throws ",[208,865,866],{},"Lomkit\\Osdd\\Layers\\LayerNotFoundException"," when no layer has that name",[288,869,870,873],{},[303,871,872],{},"Other collection methods",[303,874,875,878,879,882,883,885,886,262,889,262,892],{},[208,876,877],{},"$layers->map(...)"," returns an array, ",[208,880,881],{},"$layers->filter(...)"," returns ",[208,884,34],{},"; ",[208,887,888],{},"names()",[208,890,891],{},"count()",[208,893,894],{},"isEmpty()",[288,896,897,902],{},[303,898,899],{},[208,900,901],{},"$layer->path",[303,903,904],{},[208,905,906],{},"$layer->directory->root",[288,908,909,914],{},[303,910,911],{},[208,912,913],{},"$layer->manifest->name()",[303,915,916,734,919,922,923,926],{},[208,917,918],{},"$layer->name->toString()",[208,920,921],{},"$layer->name"," is a ",[208,924,925],{},"LayerName",")",[288,928,929,937],{},[303,930,931,262,934],{},[208,932,933],{},"$layer->manifest->vendor()",[208,935,936],{},"package()",[303,938,939,262,942],{},[208,940,941],{},"$layer->name->vendor",[208,943,944],{},"$layer->name->package",[288,946,947,952],{},[303,948,949],{},[208,950,951],{},"$layer->manifest->rootNamespace()",[303,953,954],{},[208,955,956],{},"$layer->rootNamespace",[288,958,959,964],{},[303,960,961],{},[208,962,963],{},"$layer->manifest->srcPath($layer->path)",[303,965,966],{},[208,967,968],{},"$layer->sourceDirectory",[204,970,971,262,974,262,977,980,981,984,985,988,989,991,992,995,996,999,1000,219],{},[208,972,973],{},"Layer::fromDirectory()",[208,975,976],{},"Layer::isValidLayerDirectory()",[208,978,979],{},"LayerManifest::fromPath()"," and the ",[208,982,983],{},"LayerManifest"," accessors are removed. ",[208,986,987],{},"Lomkit\\Osdd\\Layers\\LayerManifest::parse($json, $directory)"," now reads a ",[208,990,444],{}," into a ",[208,993,994],{},"Layer",", or returns ",[208,997,998],{},"null"," when its type is not ",[208,1001,1002],{},"layer",[750,1004,1006],{"id":1005},"the-generator-classes-are-final","The generator classes are final",[204,1008,338,1009,1012,1013,1016,1017,1020,1021,1024,1025,605,1028,1031,1032,1024,1035,1038,1039,1042,1043,1046,1047,219],{},[208,1010,1011],{},"osdd:*"," generator classes in ",[208,1014,1015],{},"Lomkit\\Osdd\\Console\\Commands\\Make"," are now ",[208,1018,1019],{},"final",", and the traits they used are gone: ",[208,1022,1023],{},"ChoosesOsddLayer"," (with ",[208,1026,1027],{},"resolveLayer()",[208,1029,1030],{},"$resolvedLayer",") and ",[208,1033,1034],{},"RegistersInLayerProvider",[208,1036,1037],{},"registerInLayerProvider()","). The generators now share ",[208,1040,1041],{},"Lomkit\\Osdd\\Generation\\GeneratesInLayer",", which is internal. If you extended a generator, write your own command that extends the Laravel ",[208,1044,1045],{},"make:*"," command instead, or call the osdd generator with ",[208,1048,1049],{},"$this->call(\\Lomkit\\Osdd\\Console\\Commands\\Make\\ModelMakeCommand::class, [..., '--layer' => 'functional\u002Forders'])",[750,1051,1053],{"id":1052},"registerslayerincomposer",[208,1054,1055],{},"RegistersLayerInComposer",[204,1057,338,1058,1061,1062,605,1064,1066,1067,1070,1071,1074,1075,1077],{},[208,1059,1060],{},"Lomkit\\Osdd\\Console\\Concerns\\RegistersLayerInComposer"," trait is removed. ",[208,1063,114],{},[208,1065,110],{}," now create layers through ",[208,1068,1069],{},"Lomkit\\Osdd\\Scaffolding\\LayerScaffolder",", and the classes of ",[208,1072,1073],{},"Lomkit\\Osdd\\Composer"," read and write the ",[208,1076,444],{}," files.",[231,1079,1081],{"id":1080},"changed-behaviour","Changed behaviour",[750,1083,1085,1088],{"id":1084},"php-artisan-optimize-caches-the-layers",[208,1086,1087],{},"php artisan optimize"," caches the layers",[204,1090,1091,1093,1094,1096,1097,885,1100,1103,1104,1107,1108,1110,1111,1113,1114,219],{},[208,1092,1087],{}," now also runs the new ",[208,1095,142],{}," command, which writes the discovered layers to ",[208,1098,1099],{},"bootstrap\u002Fcache\u002Fosdd.php",[208,1101,1102],{},"optimize:clear"," runs ",[208,1105,1106],{},"osdd:clear",", which deletes the file. While the cache exists, every process reads the layers from it instead of scanning the ",[208,1109,269],{}," folders. Add ",[208,1112,142],{}," to your deployment only if you run the cache commands one by one instead of ",[208,1115,1116],{},"optimize",[204,1118,1119,262,1121,262,1123,1126,1127,1129,1130,1133,1134,1137,1138,1140,1141,1144,1145,1148,1149,219],{},[208,1120,114],{},[208,1122,110],{},[208,1124,1125],{},"osdd:provider"," and Composer (through ",[208,1128,228],{},", which runs after every ",[208,1131,1132],{},"composer install"," or ",[208,1135,1136],{},"update",") rewrite an existing cache, and a cache built for other ",[208,1139,269],{}," is ignored. A layer copied into the project by hand, without running Composer, stays invisible until you run ",[208,1142,1143],{},"php artisan osdd:cache"," again or ",[208,1146,1147],{},"php artisan optimize:clear",", as with ",[208,1150,1151],{},"event:cache",[204,1153,1154,1156,1157,1159,1160,1162,1163,1166,1167,1170],{},[208,1155,142],{}," fails and writes nothing while a layer ",[208,1158,444],{}," is invalid, so ",[208,1161,1116],{}," reports the ",[208,1164,1165],{},"osdd"," task as failed: run ",[208,1168,1169],{},"php artisan osdd:list"," to see the error.",[750,1172,1174,1175,1177],{"id":1173},"invalid-layer-composerjson-files","Invalid layer ",[208,1176,444],{}," files",[204,1179,1180,1181,520,1183,1185,1186,1189,1190,1193,1194,1196,1197,1200,1201],{},"A ",[208,1182,444],{},[208,1184,269],{}," that is not valid JSON, or a ",[208,1187,1188],{},"\"type\": \"layer\""," file without a ",[208,1191,1192],{},"name",", made the generators and ",[208,1195,134],{}," crash with a bare ",[208,1198,1199],{},"JsonException"," or a PHP error. They now exit with 1 and name the file: ",[208,1202,1203],{},"Invalid layer manifest [functional\u002Forders\u002Fcomposer.json]: it has no \"name\".",[204,1205,1206,1207,1209,1210,1212,1213,1216,1217,262,1220,1133,1223,1226,1227,1229],{},"The same error now covers layer files that 2.x read without complaint: a ",[208,1208,1192],{}," that is not a valid layer name (see \"",[208,1211,114],{}," validates the name\" below), an ",[208,1214,1215],{},"extra.laravel.providers"," that is not a list of class names, or an ",[208,1218,1219],{},"autoload.psr-4",[208,1221,1222],{},"require",[208,1224,1225],{},"require-dev"," that is not an object. After the update, run ",[208,1228,1169],{},": it lists each invalid file with its error, next to the valid layers.",[204,1231,1232,1233,1235,1236,1238,1239,1241],{},"The layer discovery also stops at any directory that has a ",[208,1234,444],{},": a layer nested inside another package (a directory whose ",[208,1237,444],{}," is not of type ",[208,1240,1002],{},") is no longer discovered. Move it next to that package.",[750,1243,1245],{"id":1244},"layers-are-listed-by-name","Layers are listed by name",[204,1247,1248,1249,1251],{},"The layers are now always sorted by name. ",[208,1250,134],{}," adds the test suites of new layers in that order, instead of the order of the file system.",[750,1253,1255,1258],{"id":1254},"overrideconfigfrom-replaces-lists",[208,1256,1257],{},"overrideConfigFrom()"," replaces lists",[204,1260,1261,1263,1264,1267,1268,1271,1272,1275,1276,219],{},[208,1262,1257],{}," still merges maps key by key, at every depth. A list in the layer file now replaces the loaded list as a whole, and an empty array clears the loaded value. In 2.x, lists were merged index by index: overriding ",[208,1265,1266],{},"['default', 'low']"," with ",[208,1269,1270],{},"['high']"," gave ",[208,1273,1274],{},"['high', 'low']","; it now gives ",[208,1277,1270],{},[204,1279,1280,1281,1283],{},"Check the config files your layers load with ",[208,1282,1257],{},". Where a layer relied on the old merge to keep the tail of a list, write the full list in the layer file.",[750,1285,1287,1289],{"id":1286},"osddlayer-without-a-terminal",[208,1288,114],{}," without a terminal",[204,1291,1292,1294,1295,1298,1299,734,1302,1305,1306,1309,1310,1313,1314,605,1316,1318,1319,1322,1323,1325,1326,1329,1330,1332,1333,1336,1337,1340],{},[208,1293,114],{}," no longer runs ",[208,1296,1297],{},"composer update"," when it cannot ask: under ",[208,1300,1301],{},"--no-interaction",[208,1303,1304],{},"-n","), or without a terminal (CI, scripts, tools driven by Laravel Boost). In 2.x it ran the update by default. Pass ",[208,1307,1308],{},"--composer-update"," to run it, or run ",[208,1311,1312],{},"composer update vendor\u002Fpackage"," yourself. When the update runs and fails, ",[208,1315,114],{},[208,1317,110],{}," now exit with 1; the layers they created stay in place. The update runs the file named by the ",[208,1320,1321],{},"COMPOSER_BINARY"," environment variable (Composer sets it when a Composer script calls ",[208,1324,612],{},"), else the ",[208,1327,1328],{},"composer.phar"," of the project root, both with the current PHP binary; otherwise ",[208,1331,552],{}," from the ",[208,1334,1335],{},"PATH",", as in 2.x. ",[208,1338,1339],{},"--no-composer-update"," skips the question in a terminal.",[204,1342,1343],{},"Without a terminal, the command also stops asking for the rest:",[236,1345,1346,1363,1366],{},[239,1347,1348,1349,734,1351,1354,1355,1358,1359,1362],{},"the bucket comes from the vendor of the name when it matches a key of ",[208,1350,269],{},[208,1352,1353],{},"functional\u002Forders"," goes to the ",[208,1356,1357],{},"functional"," path). Pass ",[208,1360,1361],{},"--target-path"," for any other vendor;",[239,1364,1365],{},"the name argument is required;",[239,1367,1368,1369,1372,1373,262,1376,262,1379,262,1382,262,1385,1388],{},"without ",[208,1370,1371],{},"--generators",", the default generators run (",[208,1374,1375],{},"migration",[208,1377,1378],{},"model",[208,1380,1381],{},"factory",[208,1383,1384],{},"provider",[208,1386,1387],{},"test",").",[204,1390,1391,1393,1394,1397,1398,1400,1401,219],{},[208,1392,1371],{}," accepts comma-separated lists (",[208,1395,1396],{},"--generators=model,policy",") as well as repeated options, and an unknown generator name now fails the command with the list of valid names. In 2.x, ",[208,1399,1396],{}," matched no generator and created a layer with only its ",[208,1402,444],{},[750,1404,338,1406,1409,1410,423,1412],{"id":1405},"the-service-provider-generator-of-osddlayer-is-now-provider",[208,1407,1408],{},"service-provider"," generator of ",[208,1411,114],{},[208,1413,1384],{},[204,1415,1416,1417,1419,1420,1422,1423,1267,1425,1427,1428,1431,1432,1435],{},"The generator that writes the layer provider is now named ",[208,1418,1384],{},", like the ",[208,1421,1125],{}," command. Replace ",[208,1424,1408],{},[208,1426,1384],{}," in your scripts: ",[208,1429,1430],{},"php artisan osdd:layer functional\u002Forders --generators=migration,model,factory,provider,test",". ",[208,1433,1434],{},"--generators=service-provider"," now fails with the list of valid generators.",[750,1437,1439,1441],{"id":1438},"osddlayer-refuses-an-existing-layer",[208,1440,114],{}," refuses an existing layer",[204,1443,1444,1446,1447,1449,1450,1452,1453,1456,1457,1460,1461,1463,1464,262,1466,1468],{},[208,1445,114],{}," now fails when the layer directory already exists and is not empty. In 2.x it overwrote the layer's ",[208,1448,444],{}," (dropping ",[208,1451,1215],{},") and its provider. Pass ",[208,1454,1455],{},"--force"," to run the generators again on an existing layer: the provider and the route files are rewritten, the model and the controller are overwritten, the other generated files are kept, and no second ",[208,1458,1459],{},"create_*_table"," migration is added. The layer's ",[208,1462,444],{}," is kept: it only gains the keys of a new layer that it lacks, so its ",[208,1465,1222],{},[208,1467,1215],{}," and your own keys stay.",[750,1470,1472,1474],{"id":1471},"osddlayer-validates-the-name",[208,1473,114],{}," validates the name",[204,1476,1477,1478,1481,1482,262,1484,1133,1487,1489,1490,605,1493,1496,1497,219],{},"The name must be a Composer package name: ",[208,1479,1480],{},"vendor\u002Fpackage",", lowercase letters and digits, words separated by ",[208,1483,403],{},[208,1485,1486],{},"_",[208,1488,219],{},", each part starting with a letter. ",[208,1491,1492],{},"osdd:layer orders",[208,1494,1495],{},"osdd:layer functional\u002FMy_Orders"," now fail with a message instead of crashing or writing an invalid requirement into the root ",[208,1498,444],{},[750,1500,1502],{"id":1501},"the-generated-layer-provider-no-longer-registers-a-seeder-by-default","The generated layer provider no longer registers a seeder by default",[204,1504,1505,1506,1508,1509,1512,1513,1516,1517,1519,1520,1523,1524,703,1527,1530],{},"The provider created by ",[208,1507,114],{}," used to import and register ",[208,1510,1511],{},"{Package}Seeder"," even when the ",[208,1514,1515],{},"seeder"," generator did not run. It now registers nothing; the ",[208,1518,1515],{}," generator, or ",[208,1521,1522],{},"osdd:seeder",", adds ",[208,1525,1526],{},"$this->loadSeeders([...])",[208,1528,1529],{},"boot()",". Existing layers are not changed. A seeder registered twice now runs once (the first registration and its priority win).",[750,1532,1534,1536],{"id":1533},"osddstart-asks-first-and-runs-once",[208,1535,110],{}," asks first and runs once",[204,1538,1539,1541,1542,262,1545,605,1548,1551,1552,1554,1555,1557,1558,1133,1561,1563,1564,1566,1567,1569,1570,219],{},[208,1540,110],{}," now asks for confirmation (default no) before it deletes ",[208,1543,1544],{},"app\u002F",[208,1546,1547],{},"config\u002F",[208,1549,1550],{},"database\u002F",". Scripts pass ",[208,1553,1455],{},"; without a terminal and without ",[208,1556,1455],{},", the command fails and changes nothing. It also fails when ",[208,1559,1560],{},"functional\u002Fusers",[208,1562,429],{}," already exists, so it cannot run twice on a project. Like ",[208,1565,114],{},", it only runs ",[208,1568,1297],{}," when you accept the question or pass ",[208,1571,1308],{},[204,1573,1574],{},"What it does to a fresh project also changed:",[236,1576,1577,1590,1613],{},[239,1578,1579,1582,1583,1586,1587,1589],{},[208,1580,1581],{},"database\u002Fdatabase.sqlite"," (and ",[208,1584,1585],{},"database\u002F.gitignore",") are kept, so the default SQLite connection keeps working; the rest of ",[208,1588,1550],{}," is deleted.",[239,1591,1592,1593,1596,1597,262,1599,605,1602,1605,1606,1608,1609,1612],{},"The skeleton migrations keep their names and their tables: ",[208,1594,1595],{},"0001_01_01_000000_create_users_table"," (users, password reset tokens, sessions) goes to ",[208,1598,1560],{},[208,1600,1601],{},"0001_01_01_000001_create_cache_table",[208,1603,1604],{},"0001_01_01_000002_create_jobs_table"," go to ",[208,1607,429],{},", whose provider now loads them. In 2.x only the ",[208,1610,1611],{},"users"," table was kept: the password reset tokens, sessions, cache and jobs tables were lost.",[239,1614,1615,1618,1619,1621,1622,1625],{},[208,1616,1617],{},"bootstrap\u002Fproviders.php"," loses only the providers of the deleted ",[208,1620,1544],{}," directory (",[208,1623,1624],{},"App\\Providers\\...","); the providers of installed packages listed there stay. In 2.x the file was emptied.",[204,1627,1628,1629,262,1632,605,1635,1638,1639,1642,1643,1646,1647,1650,1651,1653,1654,219],{},"Projects already converted with 2.x keep working. If yours lost the sessions, cache or jobs tables, add their migrations to a layer: ",[208,1630,1631],{},"php artisan make:session-table",[208,1633,1634],{},"make:cache-table",[208,1636,1637],{},"make:queue-table"," write them under ",[208,1640,1641],{},"database\u002Fmigrations","; move them to ",[208,1644,1645],{},"technical\u002Fosdd\u002Fdatabase\u002Fmigrations"," and call ",[208,1648,1649],{},"$this->loadMigrationsFrom(__DIR__ . '\u002F..\u002F..\u002Fdatabase\u002Fmigrations');"," in the ",[208,1652,1529],{}," method of ",[208,1655,433],{},[750,1657,1659,1103,1661,1663],{"id":1658},"osddseed-runs-layersseeder-exit-codes-and-options",[208,1660,130],{},[208,1662,766],{},", exit codes and options",[204,1665,1666,1668,1669,1672,1673,1676,1677,1679,1680,1682,1683,1686,1687,1690,1691,1693,1694,1696,1697,1699,1700,262,1702,605,1705,1708,1709,1711,1712,1715],{},[208,1667,130],{}," now runs ",[208,1670,1671],{},"db:seed"," once with the new ",[208,1674,1675],{},"Lomkit\\Osdd\\Seeders\\LayersSeeder",", which calls the seeders registered by the layers in priority order, and returns the exit code of ",[208,1678,1671],{},"; in 2.x it ran ",[208,1681,1671],{}," once per seeder, ignored the result and exited 0. In production, the confirmation is asked once instead of once per seeder, and a cancelled run seeds nothing. A seeder that throws stops the run. A seeder class registered with ",[208,1684,1685],{},"loadSeeders()"," that does not exist now fails the run before any seeder runs (",[208,1688,1689],{},"Lomkit\\Osdd\\Seeders\\SeederNotFoundException","); 2.x skipped it with a warning. In production without a terminal, ",[208,1692,1671],{}," cancels itself: pass the new ",[208,1695,1455],{}," option to ",[208,1698,130],{}," (it is forwarded to ",[208,1701,1671],{},[208,1703,1704],{},"migrate:fresh",[208,1706,1707],{},"migrate:refresh","), as you would to ",[208,1710,1671],{},". The new ",[208,1713,1714],{},"--database"," option is forwarded the same way.",[204,1717,1718,605,1721,1724,1725,1727],{},[208,1719,1720],{},"--fresh",[208,1722,1723],{},"--refresh"," together now fail; in 2.x ",[208,1726,1723],{}," was ignored.",[204,1729,1730,1732,1733,1736,1737,1740,1741,1744,1745,1748,1749,1751,1752,1755,1756,1653,1759,483],{},[208,1731,766],{}," also works with Laravel's commands and test traits: ",[208,1734,1735],{},"php artisan migrate:fresh --seed --seeder=\"Lomkit\\Osdd\\Seeders\\LayersSeeder\"",", or ",[208,1738,1739],{},"protected string $seeder = LayersSeeder::class;"," next to ",[208,1742,1743],{},"protected bool $seed = true;"," in a test using ",[208,1746,1747],{},"RefreshDatabase",". A project converted by ",[208,1750,110],{}," 3.0 binds it as the default seeder. To get the same on a project converted with 2.x, which has no ",[208,1753,1754],{},"Database\\Seeders\\DatabaseSeeder",", add this line to the ",[208,1757,1758],{},"register()",[208,1760,433],{},[343,1762,1765],{"className":1763,"code":1764,"language":669,"meta":348,"style":348},"language-php shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","$this->app->bind('DatabaseSeeder', \\Lomkit\\Osdd\\Seeders\\LayersSeeder::class);\n",[208,1766,1767],{"__ignoreMap":348},[352,1768,1769,1772,1775,1778,1782,1785,1788,1791,1793,1796,1799,1802,1805,1808,1810,1812,1814,1816,1819,1823],{"class":354,"line":355},[352,1770,1771],{"class":381},"$this->",[352,1773,1774],{"class":455},"app",[352,1776,1777],{"class":381},"->",[352,1779,1781],{"class":1780},"s2Zo4","bind",[352,1783,1784],{"class":381},"(",[352,1786,1787],{"class":381},"'",[352,1789,1790],{"class":362},"DatabaseSeeder",[352,1792,1787],{"class":381},[352,1794,1795],{"class":381},",",[352,1797,1798],{"class":381}," \\",[352,1800,1801],{"class":455},"Lomkit",[352,1803,1804],{"class":381},"\\",[352,1806,1807],{"class":455},"Osdd",[352,1809,1804],{"class":381},[352,1811,72],{"class":455},[352,1813,1804],{"class":381},[352,1815,766],{"class":358},[352,1817,1818],{"class":381},"::",[352,1820,1822],{"class":1821},"sbssI","class",[352,1824,1825],{"class":381},");\n",[204,1827,1828,262,1830,262,1833,605,1836,1267,1838,1841],{},[208,1829,1671],{},[208,1831,1832],{},"migrate --seed",[208,1834,1835],{},"migrate:fresh --seed",[208,1837,1747],{},[208,1839,1840],{},"$seed = true"," then run the layer seeders.",[750,1843,1845,1848],{"id":1844},"configosddphp-is-no-longer-published",[208,1846,1847],{},"config\u002Fosdd.php"," is no longer published",[204,1850,1851,1854,1855,1857,1858,1860,1861,1863,1864,1866,1867,1870,1871,1874,1875,1878,1879,1881,1882,1884],{},[208,1852,1853],{},"php artisan vendor:publish --provider=\"Lomkit\\Osdd\\OsddServiceProvider\""," no longer copies ",[208,1856,1847],{}," into the root ",[208,1859,1547],{}," directory, which ",[208,1862,110],{}," deletes. Override the package config from the ",[208,1865,429],{}," layer: ",[208,1868,1869],{},"technical\u002Fosdd\u002Fconfig\u002Fosdd.php",", loaded by ",[208,1872,1873],{},"$this->overrideConfigFrom(...)"," in ",[208,1876,1877],{},"Technical\\Osdd\\Providers\\OsddServiceProvider::register()",". If your project still has a root ",[208,1880,1847],{},", move its values to ",[208,1883,1869],{}," and delete it.",[750,1886,1888,1889,1892],{"id":1887},"generators-report-an-unresolved-layer-and-exit-with-1","Generators report an unresolved ",[208,1890,1891],{},"--layer"," and exit with 1",[204,1894,1895,1896,1898,1899,1901,1902,1905,1906,1909,1910,1912],{},"For an unknown ",[208,1897,1891],{},", the ",[208,1900,1011],{}," generators printed an error and then threw a ",[208,1903,1904],{},"RuntimeException"," (\"Layer 'functional\u002Forder' not found.\"). They now print one error, which lists the available layers and the closest name, and exit with code 1. Code that calls them with ",[208,1907,1908],{},"Artisan::call()"," and catches the exception must check the exit code instead. Without a terminal and without ",[208,1911,1891],{},", they now fail with \"The --layer option is required when the command is not interactive.\" instead of a bare \"Required.\".",[750,1914,1916,1918],{"id":1915},"osddphpunit-coverage-source",[208,1917,134],{}," coverage source",[204,1920,1921,1923,1924,1927,1928,1931,1932,1935,1936,1938,1939,483],{},[208,1922,134],{}," now adds each layer's source directory to ",[208,1925,1926],{},"\u003Csource>\u003Cinclude>"," and excludes the migrations per layer path (",[208,1929,1930],{},"functional\u002F*\u002Fdatabase\u002Fmigrations",") instead of ",[208,1933,1934],{},"**\u002Fdatabase\u002Fmigrations",", which walked the whole project, ",[208,1937,257],{}," included. Remove the old entry from your ",[208,1940,1941],{},"phpunit.xml",[343,1943,1945],{"className":394,"code":1944,"language":396,"meta":348,"style":348}," \u003Cexclude>\n-    \u003Cdirectory suffix=\".php\">**\u002Fdatabase\u002Fmigrations\u003C\u002Fdirectory>\n \u003C\u002Fexclude>\n",[208,1946,1947,1952,1959],{"__ignoreMap":348},[352,1948,1949],{"class":354,"line":355},[352,1950,1951],{"class":455}," \u003Cexclude>\n",[352,1953,1954,1956],{"class":354,"line":410},[352,1955,403],{"class":381},[352,1957,1958],{"class":406},"    \u003Cdirectory suffix=\".php\">**\u002Fdatabase\u002Fmigrations\u003C\u002Fdirectory>\n",[352,1960,1961],{"class":354,"line":466},[352,1962,1963],{"class":455}," \u003C\u002Fexclude>\n",[204,1965,1966,1967,1970,1971,1973,1974,1976,1977,219],{},"The new ",[208,1968,1969],{},"--prune"," option removes the test suites of layers that no longer exist and the ",[208,1972,1926],{}," directories that are gone, such as ",[208,1975,1774],{}," after ",[208,1978,110],{},[750,1980,1982],{"id":1981},"other-changes-in-the-generators-and-the-base-provider","Other changes in the generators and the base provider",[204,1984,1985],{},"These fix 2.x bugs; existing layers keep working without changes.",[236,1987,1988,2027,2047,2065,2081,2087,2110,2133,2139,2161],{},[239,1989,1990,1993,1994,1997,1998,2001,2002,2005,2006,2009,2010,605,2013,2016,2017,2020,2021,2023,2024,2026],{},[208,1991,1992],{},"osdd:model"," builds its controller like ",[208,1995,1996],{},"make:model",": ",[208,1999,2000],{},"--controller"," alone creates a plain controller, ",[208,2003,2004],{},"--resource"," a resource controller for the model, ",[208,2007,2008],{},"--api"," an API controller for the model, ",[208,2011,2012],{},"--test",[208,2014,2015],{},"--pest"," are passed on, and ",[208,2018,2019],{},"--all"," now also creates the form requests. In 2.x every ",[208,2022,1992],{}," controller was a resource controller, and ",[208,2025,2019],{}," created no form requests.",[239,2028,2029,2032,2033,605,2036,2039,2040,2042,2043,2046],{},[208,2030,2031],{},"withRouting()"," now loads the ",[208,2034,2035],{},"commands",[208,2037,2038],{},"channels"," files when routes are cached (after ",[208,2041,1087],{},"), as Laravel does. In 2.x, the ",[208,2044,2045],{},"routes\u002Fconsole.php"," commands and schedules and the broadcast channels of every layer disappeared once routes were cached. If you worked around it by loading these files yourself, remove the workaround.",[239,2048,2049,2052,2053,2055,2056,2058,2059,2061,2062,2064],{},[208,2050,2051],{},"osdd:config"," injects ",[208,2054,1257],{}," into ",[208,2057,1758],{}," instead of ",[208,2060,1529],{},". Earlier overrides stay where they are; move them to ",[208,2063,1758],{}," if another package reads that config while it boots.",[239,2066,2067,262,2070,605,2072,2074,2075,2077,2078,2080],{},[208,2068,2069],{},"osdd:migration",[208,2071,1522],{},[208,2073,2051],{}," find the method to edit by parsing the provider, take the provider from the layer's ",[208,2076,1215],{}," when it is declared there, and print the line to add when the layer has no provider or the method is missing. In 2.x they edited the method placed before ",[208,2079,1758],{},", or did nothing.",[239,2082,2083,2084,219],{},"Generators write classes under the directory of the layer's root psr-4 entry (the shortest namespace prefix), not always under ",[208,2085,2086],{},"src\u002F",[239,2088,2089,2092,2093,262,2096,262,2099,605,2102,2105,2106,2109],{},[208,2090,2091],{},"--model"," on ",[208,2094,2095],{},"osdd:policy",[208,2097,2098],{},"osdd:controller",[208,2100,2101],{},"osdd:observer",[208,2103,2104],{},"osdd:factory"," keeps a model of another layer (",[208,2107,2108],{},"--model='Functional\\Users\\Models\\User'",") instead of nesting it under the current layer.",[239,2111,2112,262,2114,605,2116,2118,2119,1874,2122,2124,2125,2128,2129,2132],{},[208,2113,114],{},[208,2115,110],{},[208,2117,1125],{}," keep empty objects such as ",[208,2120,2121],{},"\"require-dev\": {}",[208,2123,444],{},", follow ",[208,2126,2127],{},"config.sort-packages",", and write a ",[208,2130,2131],{},"..\u002F"," repository URL for a layer path outside the project.",[239,2134,2135,2136,2138],{},"A generator run twice in the same process (",[208,2137,1908],{}," from a command, a seeder or a test) writes each run into the layer given to that run. In 2.x the second run reused the layer of the first.",[239,2140,2141,2144,2145,2148,2149,2152,2153,2156,2157,2160],{},[208,2142,2143],{},"osdd:factory Order"," writes ",[208,2146,2147],{},"OrderFactory.php",", the file of the ",[208,2150,2151],{},"OrderFactory"," class it holds, as ",[208,2154,2155],{},"make:factory"," does. In 2.x it wrote ",[208,2158,2159],{},"Order.php",", which the autoloader could not find: rename such files.",[239,2162,2163,2164,2167,2168,2171],{},"The generators recognise a call the layer provider already makes whatever its layout: spacing (Pint writes ",[208,2165,2166],{},"__DIR__.'\u002F..\u002F..\u002Fdatabase\u002Fmigrations'","), line breaks, comments, a trailing comma, or the short name of an imported class (",[208,2169,2170],{},"loadSeeders([UsersSeeder::class])","). In 2.x such a call was added again on every run; remove the duplicates it left. A commented-out call no longer counts as made. When the provider imports the class, the added line uses its short name.",[750,2173,2175,2177,2178],{"id":2174},"osddprovider-no-longer-edits-bootstrapprovidersphp",[208,2176,1125],{}," no longer edits ",[208,2179,1617],{},[204,2181,2182,2184,2185,734,2187,2189,2190,2192,2193,2196,2197,2199,2200,2202,2203,2205],{},[208,2183,1125],{}," registers the provider in the layer's ",[208,2186,444],{},[208,2188,1215],{},") only. In 2.x it also added it to ",[208,2191,1617],{},", as ",[208,2194,2195],{},"make:provider"," does, so every command failed with \"class not found\" until ",[208,2198,1297],{}," installed the layer, and the provider was registered twice afterwards. Remove the layer providers that ",[208,2201,1125],{}," added to ",[208,2204,1617],{},"; package discovery loads them.",[750,2207,2209,2211],{"id":2208},"osddmodel-on-an-existing-model",[208,2210,1992],{}," on an existing model",[204,2213,2214,2216,2217,2219,2220,262,2223,262,2226,262,2229,262,2231,262,2234,262,2237,2239,2240,2242,2243,2245],{},[208,2215,1992],{}," now behaves like ",[208,2218,1996],{}," when the model already exists: it prints \"Model already exists.\" and, in a terminal, asks \"Do you want to generate additional components for the model?\" before creating the components you passed (",[208,2221,2222],{},"--factory",[208,2224,2225],{},"--migration",[208,2227,2228],{},"--seed",[208,2230,2000],{},[208,2232,2233],{},"--policy",[208,2235,2236],{},"--requests",[208,2238,2019],{},"). Without a terminal or with ",[208,2241,1301],{},", it creates them without asking. In 2.x it stopped after the error and created nothing. ",[208,2244,1455],{}," still overwrites the model and creates the components without asking.",[750,2247,2249,605,2252,2255],{"id":2248},"osddcommand-and-osddview-register-what-they-generate",[208,2250,2251],{},"osdd:command",[208,2253,2254],{},"osdd:view"," register what they generate",[204,2257,2258,2259,2261,2262,2264,2265,483],{},"In 2.x, a command generated by ",[208,2260,2251],{}," was never registered, and a view generated by ",[208,2263,2254],{}," could not be resolved by name. Both now edit the layer provider's ",[208,2266,1529],{},[236,2268,2269,2277],{},[239,2270,2271,2273,2274,219],{},[208,2272,2251],{}," adds ",[208,2275,2276],{},"$this->commands([\\Functional\\Orders\\Console\\Commands\\SyncOrders::class]);",[239,2278,2279,2273,2281,2284,2285,2287,2288,2291,2292,219],{},[208,2280,2254],{},[208,2282,2283],{},"$this->withViews(__DIR__ . '\u002F..\u002F..\u002Fresources\u002Fviews');",", a new helper of ",[208,2286,156],{}," that registers the layer's views under its package name, unless the provider already calls ",[208,2289,2290],{},"withViews()",". The view then renders as ",[208,2293,2294],{},"view('orders::index')",[204,2296,2297,2298,2301,2302,2305],{},"If you registered such commands or views by hand (",[208,2299,2300],{},"$this->commands([...])"," with an import, or ",[208,2303,2304],{},"loadViewsFrom()","), remove the duplicate line the generator adds, or drop your own.",[2307,2308,2309],"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 pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":348,"searchDepth":355,"depth":410,"links":2311},[2312],{"id":201,"depth":410,"text":202,"children":2313},[2314,2315,2316,2317,2318,2319,2321,2322],{"id":233,"depth":466,"text":234},{"id":250,"depth":466,"text":251},{"id":437,"depth":466,"text":438},{"id":538,"depth":466,"text":539},{"id":619,"depth":466,"text":176},{"id":684,"depth":466,"text":2320},"Dependency bots and composer audit",{"id":741,"depth":466,"text":742},{"id":1080,"depth":466,"text":1081},"Move a Laravel OSDD 2.x project to 3.0, step by step.","md",null,{},true,{"title":190,"description":2323},{"loc":191},"Xir3BeSpTSxyfWtnzfScm3DniktnO4LPPt4EmKP71PQ",[2332,2325],{"title":180,"path":181,"stem":182,"description":2333,"children":-1},"Use short class names in Tinker, and let IDE Helper find the models of every layer. Nothing to configure.",1794437213152]