[{"data":1,"prerenderedAt":389},["ShallowReactive",2],{"page-\u002Fv1\u002Fadapters\u002Flaravel\u002Fcomposition-root":3},{"id":4,"title":5,"body":6,"description":382,"extension":383,"meta":384,"navigation":108,"path":385,"seo":386,"stem":387,"__hash__":388},"content\u002Fv1\u002Fadapters\u002Flaravel\u002Fcomposition-root.md","Laravel composition root",{"type":7,"value":8,"toc":375},"minimark",[9,14,36,41,67,71,82,86,265,268,272,348,352,362,371],[10,11,13],"h1",{"id":12},"composition-root","Composition root",[15,16,17,18,22,23,26,27,31,32,35],"p",{},"On Laravel (",[19,20,21],"strong",{},"13.x","), each module’s ",[19,24,25],{},"ServiceProvider"," is the composition root. Register providers in ",[28,29,30],"code",{},"bootstrap\u002Fproviders.php",". Framework APIs are welcome ",[19,33,34],{},"here only"," for wiring.",[37,38,40],"h2",{"id":39},"allowed-in-providers","Allowed in Providers",[42,43,44,55,58,64],"ul",{},[45,46,47,50,51,54],"li",{},[28,48,49],{},"bind"," \u002F ",[28,52,53],{},"singleton"," Port → Adapter",[45,56,57],{},"Load UI routes",[45,59,60,61],{},"Merge module ",[28,62,63],{},"config",[45,65,66],{},"Register queue \u002F event listeners (Infrastructure listeners)",[37,68,70],{"id":69},"forbidden-in-providers","Forbidden in Providers",[42,72,73,76,79],{},[45,74,75],{},"Eligibility, reservation, pricing, stock policy",[45,77,78],{},"Calling repositories to “set up” business state",[45,80,81],{},"Orchestrating multi-step features (that is a Use Case)",[37,83,85],{"id":84},"typical-binds","Typical binds",[87,88,93],"pre",{"className":89,"code":90,"language":91,"meta":92,"style":92},"language-php shiki shiki-themes github-light github-dark","namespace App\\Modules\\Ordering\\Application\\Providers;\n\nuse App\\Modules\\Ordering\\Domain\\Ports\\Order\\OrderRepositoryInterface;\nuse App\\Modules\\Ordering\\Domain\\Ports\\Acl\\WarehouseAvailabilityPortInterface;\nuse App\\Modules\\Ordering\\Infrastructure\\ExternalServices\\WarehouseAvailabilityAclAdapter;\nuse App\\Modules\\Ordering\\Infrastructure\\Persistence\\Eloquent\\Repositories\\OrderRepository;\nuse Illuminate\\Support\\ServiceProvider;\n\nclass OrderingServiceProvider extends ServiceProvider\n{\n    public function register(): void\n    {\n        $this->app->bind(\n            OrderRepositoryInterface::class,\n            OrderRepository::class,\n        );\n\n        $this->app->bind(\n            WarehouseAvailabilityPortInterface::class,\n            WarehouseAvailabilityAclAdapter::class,\n        );\n    }\n\n    public function boot(): void\n    {\n        $this->loadRoutesFrom(__DIR__ . '\u002F..\u002F..\u002FUI\u002FRoutes\u002Fapi.php');\n        $this->mergeConfigFrom(__DIR__ . '\u002F..\u002F..\u002FInfrastructure\u002FConfig\u002Fordering.php', 'ordering');\n    }\n}\n","php","",[28,94,95,103,110,116,122,128,134,140,145,151,157,163,169,175,181,187,193,198,203,209,215,220,226,231,237,242,248,254,259],{"__ignoreMap":92},[96,97,100],"span",{"class":98,"line":99},"line",1,[96,101,102],{},"namespace App\\Modules\\Ordering\\Application\\Providers;\n",[96,104,106],{"class":98,"line":105},2,[96,107,109],{"emptyLinePlaceholder":108},true,"\n",[96,111,113],{"class":98,"line":112},3,[96,114,115],{},"use App\\Modules\\Ordering\\Domain\\Ports\\Order\\OrderRepositoryInterface;\n",[96,117,119],{"class":98,"line":118},4,[96,120,121],{},"use App\\Modules\\Ordering\\Domain\\Ports\\Acl\\WarehouseAvailabilityPortInterface;\n",[96,123,125],{"class":98,"line":124},5,[96,126,127],{},"use App\\Modules\\Ordering\\Infrastructure\\ExternalServices\\WarehouseAvailabilityAclAdapter;\n",[96,129,131],{"class":98,"line":130},6,[96,132,133],{},"use App\\Modules\\Ordering\\Infrastructure\\Persistence\\Eloquent\\Repositories\\OrderRepository;\n",[96,135,137],{"class":98,"line":136},7,[96,138,139],{},"use Illuminate\\Support\\ServiceProvider;\n",[96,141,143],{"class":98,"line":142},8,[96,144,109],{"emptyLinePlaceholder":108},[96,146,148],{"class":98,"line":147},9,[96,149,150],{},"class OrderingServiceProvider extends ServiceProvider\n",[96,152,154],{"class":98,"line":153},10,[96,155,156],{},"{\n",[96,158,160],{"class":98,"line":159},11,[96,161,162],{},"    public function register(): void\n",[96,164,166],{"class":98,"line":165},12,[96,167,168],{},"    {\n",[96,170,172],{"class":98,"line":171},13,[96,173,174],{},"        $this->app->bind(\n",[96,176,178],{"class":98,"line":177},14,[96,179,180],{},"            OrderRepositoryInterface::class,\n",[96,182,184],{"class":98,"line":183},15,[96,185,186],{},"            OrderRepository::class,\n",[96,188,190],{"class":98,"line":189},16,[96,191,192],{},"        );\n",[96,194,196],{"class":98,"line":195},17,[96,197,109],{"emptyLinePlaceholder":108},[96,199,201],{"class":98,"line":200},18,[96,202,174],{},[96,204,206],{"class":98,"line":205},19,[96,207,208],{},"            WarehouseAvailabilityPortInterface::class,\n",[96,210,212],{"class":98,"line":211},20,[96,213,214],{},"            WarehouseAvailabilityAclAdapter::class,\n",[96,216,218],{"class":98,"line":217},21,[96,219,192],{},[96,221,223],{"class":98,"line":222},22,[96,224,225],{},"    }\n",[96,227,229],{"class":98,"line":228},23,[96,230,109],{"emptyLinePlaceholder":108},[96,232,234],{"class":98,"line":233},24,[96,235,236],{},"    public function boot(): void\n",[96,238,240],{"class":98,"line":239},25,[96,241,168],{},[96,243,245],{"class":98,"line":244},26,[96,246,247],{},"        $this->loadRoutesFrom(__DIR__ . '\u002F..\u002F..\u002FUI\u002FRoutes\u002Fapi.php');\n",[96,249,251],{"class":98,"line":250},27,[96,252,253],{},"        $this->mergeConfigFrom(__DIR__ . '\u002F..\u002F..\u002FInfrastructure\u002FConfig\u002Fordering.php', 'ordering');\n",[96,255,257],{"class":98,"line":256},28,[96,258,225],{},[96,260,262],{"class":98,"line":261},29,[96,263,264],{},"}\n",[15,266,267],{},"Register the module provider from the host application’s provider list (or package discovery) so the composition root actually runs.",[37,269,271],{"id":270},"providers-vs-use-cases","Providers vs Use Cases",[273,274,275,288],"table",{},[276,277,278],"thead",{},[279,280,281,285],"tr",{},[282,283,284],"th",{},"Concern",[282,286,287],{},"Place",[289,290,291,302,314,324,332,340],"tbody",{},[279,292,293,299],{},[294,295,296],"td",{},[28,297,298],{},"Route::prefix(...)->group(...)",[294,300,301],{},"Provider",[279,303,304,312],{},[294,305,306,50,309],{},[28,307,308],{},"config()->merge(...)",[28,310,311],{},"mergeConfigFrom",[294,313,301],{},[279,315,316,322],{},[294,317,318,321],{},[28,319,320],{},"Event::listen(...)"," \u002F listener discovery",[294,323,301],{},[279,325,326,329],{},[294,327,328],{},"Place order \u002F fulfill order",[294,330,331],{},"Use Case",[279,333,334,337],{},[294,335,336],{},"Map Eloquent ↔ Entity",[294,338,339],{},"Repository adapter",[279,341,342,345],{},[294,343,344],{},"Map peer ModuleInterface ↔ local port",[294,346,347],{},"ACL adapter",[37,349,351],{"id":350},"why-providers-are-special","Why Providers are special",[15,353,354,357,358,361],{},[28,355,356],{},"Application\u002FProviders"," needs Laravel to bind the container and load routes. That privilege must ",[19,359,360],{},"not"," be copied into Use Cases or Domain. If a “rule” appears in a Provider, move it to a Use Case or Domain service.",[15,363,364,365,370],{},"Core reference: ",[366,367,369],"a",{"href":368},"\u002Fv1\u002Fcore\u002Fstrictness-ladder","Strictness ladder",".",[372,373,374],"style",{},"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":92,"searchDepth":105,"depth":105,"links":376},[377,378,379,380,381],{"id":39,"depth":105,"text":40},{"id":69,"depth":105,"text":70},{"id":84,"depth":105,"text":85},{"id":270,"depth":105,"text":271},{"id":350,"depth":105,"text":351},"Module ServiceProviders bind ports to adapters, register routes and listeners, and merge config — no business rules.","md",{},"\u002Fv1\u002Fadapters\u002Flaravel\u002Fcomposition-root",{"title":5,"description":382},"v1\u002Fadapters\u002Flaravel\u002Fcomposition-root","6zmoyzPznm1XaRCYRxasa7ESXqI66HEQMJkAjVBaqXo",1786241413784]