[{"data":1,"prerenderedAt":2103},["ShallowReactive",2],{"navigation":3,"\u002Fdigging-deeper\u002Fevents-and-hooks":307,"\u002Fdigging-deeper\u002Fevents-and-hooks-surround":2098},{"3.x":4,"2.x":203},[5,32,61,99,121,147,165],{"title":6,"icon":7,"path":8,"stem":9,"children":10,"page":31},"Getting Started","i-heroicons-star","\u002Fgetting-started","1.getting-started",[11,15,19,23,27],{"title":12,"path":13,"stem":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction",{"title":16,"path":17,"stem":18},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation",{"title":20,"path":21,"stem":22},"Quick start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start",{"title":24,"path":25,"stem":26},"Configuration","\u002Fgetting-started\u002Fconfiguration","1.getting-started\u002F4.configuration",{"title":28,"path":29,"stem":30},"Upgrade guide","\u002Fgetting-started\u002Fupgrade-guide","1.getting-started\u002F5.upgrade-guide",false,{"title":33,"icon":34,"path":35,"stem":36,"children":37,"page":31},"Resources","i-heroicons-document-text","\u002Fresources","2.resources",[38,41,45,49,53,57],{"title":33,"path":39,"stem":40},"\u002Fresources\u002Fresources","2.resources\u002F1.resources",{"title":42,"path":43,"stem":44},"Fields","\u002Fresources\u002Ffields","2.resources\u002F2.fields",{"title":46,"path":47,"stem":48},"Relationships","\u002Fresources\u002Frelations","2.resources\u002F3.relations",{"title":50,"path":51,"stem":52},"Validation","\u002Fresources\u002Fvalidation","2.resources\u002F4.validation",{"title":54,"path":55,"stem":56},"Perimeter","\u002Fresources\u002Fperimeter","2.resources\u002F5.perimeter",{"title":58,"path":59,"stem":60},"Limits","\u002Fresources\u002Flimits","2.resources\u002F6.limits",{"title":62,"icon":63,"path":64,"stem":65,"children":66,"page":31},"Search","i-heroicons-magnifying-glass","\u002Fsearch","3.search",[67,71,75,79,83,87,91,95],{"title":68,"path":69,"stem":70},"Search overview","\u002Fsearch\u002Foverview","3.search\u002F1.overview",{"title":72,"path":73,"stem":74},"Search filters","\u002Fsearch\u002Ffilters","3.search\u002F2.filters",{"title":76,"path":77,"stem":78},"Sorts and selects","\u002Fsearch\u002Fsorts-and-selects","3.search\u002F3.sorts-and-selects",{"title":80,"path":81,"stem":82},"Includes and aggregates","\u002Fsearch\u002Fincludes-and-aggregates","3.search\u002F4.includes-and-aggregates",{"title":84,"path":85,"stem":86},"Scopes and instructions","\u002Fsearch\u002Fscopes-and-instructions","3.search\u002F5.scopes-and-instructions",{"title":88,"path":89,"stem":90},"Text search","\u002Fsearch\u002Ftext-search","3.search\u002F6.text-search",{"title":92,"path":93,"stem":94},"Search engines","\u002Fsearch\u002Fsearch-engines","3.search\u002F7.search-engines",{"title":96,"path":97,"stem":98},"Searching outside HTTP","\u002Fsearch\u002Foutside-http","3.search\u002F8.outside-http",{"title":100,"icon":101,"path":102,"stem":103,"children":104,"page":31},"Writing","i-heroicons-pencil-square","\u002Fwriting","4.writing",[105,109,113,117],{"title":106,"path":107,"stem":108},"Mutate","\u002Fwriting\u002Fmutate","4.writing\u002F1.mutate",{"title":110,"path":111,"stem":112},"Writing relations","\u002Fwriting\u002Frelations","4.writing\u002F2.relations",{"title":114,"path":115,"stem":116},"Versioned rows","\u002Fwriting\u002Fversioned-rows","4.writing\u002F3.versioned-rows",{"title":118,"path":119,"stem":120},"Deleting and restoring","\u002Fwriting\u002Fdeleting","4.writing\u002F4.deleting",{"title":122,"icon":123,"path":124,"stem":125,"children":126,"page":31},"Actions and Metrics","i-heroicons-bolt","\u002Factions-and-metrics","5.actions-and-metrics",[127,131,135,139,143],{"title":128,"path":129,"stem":130},"Actions","\u002Factions-and-metrics\u002Factions","5.actions-and-metrics\u002F1.actions",{"title":132,"path":133,"stem":134},"Queued Actions","\u002Factions-and-metrics\u002Fqueued-actions","5.actions-and-metrics\u002F2.queued-actions",{"title":136,"path":137,"stem":138},"Confirmation","\u002Factions-and-metrics\u002Fconfirmation","5.actions-and-metrics\u002F3.confirmation",{"title":140,"path":141,"stem":142},"Metrics","\u002Factions-and-metrics\u002Fmetrics","5.actions-and-metrics\u002F4.metrics",{"title":144,"path":145,"stem":146},"Exports","\u002Factions-and-metrics\u002Fexports","5.actions-and-metrics\u002F5.exports",{"title":148,"icon":149,"path":150,"stem":151,"children":152,"page":31},"Authorization","i-heroicons-lock-closed","\u002Fauthorization","6.authorization",[153,157,161],{"title":154,"path":155,"stem":156},"Policies","\u002Fauthorization\u002Fpolicies","6.authorization\u002F1.policies",{"title":158,"path":159,"stem":160},"Gates","\u002Fauthorization\u002Fgates","6.authorization\u002F2.gates",{"title":162,"path":163,"stem":164},"Decision Cache","\u002Fauthorization\u002Fdecision-cache","6.authorization\u002F3.decision-cache",{"title":166,"icon":167,"path":168,"stem":169,"children":170,"page":31},"Digging Deeper","i-heroicons-list-bullet","\u002Fdigging-deeper","7.digging-deeper",[171,175,179,183,187,191,195,199],{"title":172,"path":173,"stem":174},"Details","\u002Fdigging-deeper\u002Fdetails","7.digging-deeper\u002F1.details",{"title":176,"path":177,"stem":178},"Events and Hooks","\u002Fdigging-deeper\u002Fevents-and-hooks","7.digging-deeper\u002F2.events-and-hooks",{"title":180,"path":181,"stem":182},"Custom Responses","\u002Fdigging-deeper\u002Fresponses","7.digging-deeper\u002F3.responses",{"title":184,"path":185,"stem":186},"OpenAPI Documentation","\u002Fdigging-deeper\u002Fopenapi","7.digging-deeper\u002F4.openapi",{"title":188,"path":189,"stem":190},"Precognition","\u002Fdigging-deeper\u002Fprecognition","7.digging-deeper\u002F5.precognition",{"title":192,"path":193,"stem":194},"Artisan Commands","\u002Fdigging-deeper\u002Fartisan","7.digging-deeper\u002F6.artisan",{"title":196,"path":197,"stem":198},"Laravel Boost Skill","\u002Fdigging-deeper\u002Fai-skill","7.digging-deeper\u002F7.ai-skill",{"title":200,"path":201,"stem":202},"Translations","\u002Fdigging-deeper\u002Ftranslations","7.digging-deeper\u002F8.translations",[204,215,237,260,297],{"title":6,"icon":7,"path":205,"stem":206,"children":207,"page":31},"\u002F2.x\u002Fgetting-started","2.x\u002F1.getting-started",[208,211],{"title":16,"path":209,"stem":210},"\u002F2.x\u002Fgetting-started\u002Finstallation","2.x\u002F1.getting-started\u002F1.installation",{"title":212,"path":213,"stem":214},"Upgrade Guide","\u002F2.x\u002Fgetting-started\u002Fupgrade-guide","2.x\u002F1.getting-started\u002F2.upgrade-guide",{"title":216,"icon":217,"path":218,"stem":219,"children":220,"page":31},"Endpoints","i-heroicons-arrow-uturn-left","\u002F2.x\u002Fendpoints","2.x\u002F2.endpoints",[221,224,227,230,233],{"title":172,"path":222,"stem":223},"\u002F2.x\u002Fendpoints\u002Fdetails","2.x\u002F2.endpoints\u002F1.details",{"title":62,"path":225,"stem":226},"\u002F2.x\u002Fendpoints\u002Fsearch","2.x\u002F2.endpoints\u002F2.search",{"title":106,"path":228,"stem":229},"\u002F2.x\u002Fendpoints\u002Fmutate","2.x\u002F2.endpoints\u002F3.mutate",{"title":128,"path":231,"stem":232},"\u002F2.x\u002Fendpoints\u002Factions","2.x\u002F2.endpoints\u002F4.actions",{"title":234,"path":235,"stem":236},"Delete","\u002F2.x\u002Fendpoints\u002Fdelete","2.x\u002F2.endpoints\u002F5.delete",{"title":33,"icon":34,"path":238,"stem":239,"children":240,"page":31},"\u002F2.x\u002Fresources","2.x\u002F3.resources",[241,245,249,252,256],{"title":242,"path":243,"stem":244},"Basics","\u002F2.x\u002Fresources\u002Fbasics","2.x\u002F3.resources\u002F1.basics",{"title":246,"path":247,"stem":248},"Exposed Data","\u002F2.x\u002Fresources\u002Fexposed-data","2.x\u002F3.resources\u002F2.exposed-data",{"title":46,"path":250,"stem":251},"\u002F2.x\u002Fresources\u002Frelationships","2.x\u002F3.resources\u002F3.relationships",{"title":253,"path":254,"stem":255},"Validations","\u002F2.x\u002Fresources\u002Fvalidations","2.x\u002F3.resources\u002F4.validations",{"title":257,"path":258,"stem":259},"Interactions","\u002F2.x\u002Fresources\u002Finteractions","2.x\u002F3.resources\u002F5.interactions",{"title":166,"icon":167,"path":261,"stem":262,"children":263,"page":31},"\u002F2.x\u002Fdigging-deeper","2.x\u002F4.digging-deeper",[264,267,271,274,278,282,286,290,294],{"title":128,"path":265,"stem":266},"\u002F2.x\u002Fdigging-deeper\u002Factions","2.x\u002F4.digging-deeper\u002F1.actions",{"title":268,"path":269,"stem":270},"Hooks","\u002F2.x\u002Fdigging-deeper\u002Fhooks","2.x\u002F4.digging-deeper\u002F2.hooks",{"title":158,"path":272,"stem":273},"\u002F2.x\u002Fdigging-deeper\u002Fgates","2.x\u002F4.digging-deeper\u002F3.gates",{"title":275,"path":276,"stem":277},"Authorizations","\u002F2.x\u002Fdigging-deeper\u002Fauthorizations","2.x\u002F4.digging-deeper\u002F4.authorizations",{"title":279,"path":280,"stem":281},"Full Text Search","\u002F2.x\u002Fdigging-deeper\u002Ffull-text-search","2.x\u002F4.digging-deeper\u002F5.full-text-search",{"title":283,"path":284,"stem":285},"Instructions","\u002F2.x\u002Fdigging-deeper\u002Finstructions","2.x\u002F4.digging-deeper\u002F6.instructions",{"title":287,"path":288,"stem":289},"Responses","\u002F2.x\u002Fdigging-deeper\u002Fresponses","2.x\u002F4.digging-deeper\u002F7.responses",{"title":291,"path":292,"stem":293},"Documentation","\u002F2.x\u002Fdigging-deeper\u002Fdocumentation","2.x\u002F4.digging-deeper\u002F8.documentation",{"title":188,"path":295,"stem":296},"\u002F2.x\u002Fdigging-deeper\u002Fprecognition","2.x\u002F4.digging-deeper\u002F9.precognition",{"title":298,"icon":299,"path":300,"stem":301,"children":302,"page":31},"Integrations","i-lucide-puzzle","\u002F2.x\u002Fintegrations","2.x\u002F5.integrations",[303],{"title":304,"path":305,"stem":306},"Flutter","\u002F2.x\u002Fintegrations\u002Fflutter","2.x\u002F5.integrations\u002F1.flutter",{"id":308,"title":176,"body":309,"description":2091,"extension":2092,"links":2093,"meta":2094,"navigation":651,"path":177,"seo":2095,"sitemap":2096,"stem":178,"__hash__":2097},"docs3x\u002F7.digging-deeper\u002F2.events-and-hooks.md",{"type":310,"value":311,"toc":2081},"minimark",[312,316,357,361,364,504,570,575,587,803,823,827,923,926,929,1007,1046,1235,1318,1321,1324,1454,1616,1652,1656,1675,1922,2027,2077],[313,314,315],"p",{},"The package gives you three ways to run your code around an endpoint:",[317,318,319,336,348],"ul",{},[320,321,322,326,327,331,332,335],"li",{},[323,324,325],"strong",{},"Resource events",", such as ",[328,329,330],"code",{},"searching()"," or ",[328,333,334],{},"destroyedAll()",": methods of the resource that run once per request, at a fixed moment.",[320,337,338,326,341,331,344,347],{},[323,339,340],{},"Row hooks",[328,342,343],{},"mutating()",[328,345,346],{},"destroyed()",": methods of the resource that run for each row.",[320,349,350,326,353,356],{},[323,351,352],{},"Laravel events",[328,354,355],{},"ResourceMutated",": dispatched once a write is committed, for every resource.",[358,359,325],"h2",{"id":360},"resource-events",[313,362,363],{},"Override the event on the resource. Each one receives a typed payload and returns nothing:",[365,366,367,380],"table",{},[368,369,370],"thead",{},[371,372,373,377],"tr",{},[374,375,376],"th",{},"Event",[374,378,379],{},"When it runs",[381,382,383,398,408,418,428,438,448,458,471,488],"tbody",{},[371,384,385,391],{},[386,387,388],"td",{},[328,389,390],{},"describing(): void",[386,392,393,394,397],{},"once ",[328,395,396],{},"viewAny"," passed, before the details are built",[371,399,400,405],{},[386,401,402],{},[328,403,404],{},"described(array $details): void",[386,406,407],{},"after the details are built",[371,409,410,415],{},[386,411,412],{},[328,413,414],{},"searching(SearchContext $search): void",[386,416,417],{},"after validation, before any query; also for the search of an action or a metric",[371,419,420,425],{},[386,421,422],{},[328,423,424],{},"searched(LengthAwarePaginator $page): void",[386,426,427],{},"after the query and the includes are read, before the rows are rendered",[371,429,430,435],{},[386,431,432],{},[328,433,434],{},"mutatingAll(array $entries): void",[386,436,437],{},"inside the transaction, after the row checks, before the first write",[371,439,440,445],{},[386,441,442],{},[328,443,444],{},"mutatedAll(array $operations): void",[386,446,447],{},"inside the transaction, after the last write",[371,449,450,455],{},[386,451,452],{},[328,453,454],{},"operating(Action $action, ActionFields $fields): void",[386,456,457],{},"after the row checks of the action, before the first chunk",[371,459,460,465],{},[386,461,462],{},[328,463,464],{},"operated(Action $action, ActionFields $fields, int $impacted): void",[386,466,467,468],{},"after the last chunk, before ",[328,469,470],{},"respond()",[371,472,473,485],{},[386,474,475,478,479,478,482],{},[328,476,477],{},"destroyingAll(Collection $models)",", ",[328,480,481],{},"restoringAll()",[328,483,484],{},"forceDestroyingAll()",[386,486,487],{},"inside the transaction, after the row checks, before the first row",[371,489,490,501],{},[386,491,492,478,495,478,498],{},[328,493,494],{},"destroyedAll(Collection $models)",[328,496,497],{},"restoredAll()",[328,499,500],{},"forceDestroyedAll()",[386,502,503],{},"inside the transaction, after the last row",[317,505,506,509,535,542,567],{},[320,507,508],{},"The events run after the entry checks and the validation. The events that receive rows also run after the row checks: a row that a policy refuses runs no event.",[320,510,511,512,515,516,519,520,523,524,527,528,531,532,534],{},"An event that throws stops the endpoint. A ",[328,513,514],{},"ValidationException"," gives a ",[328,517,518],{},"422",", an ",[328,521,522],{},"AuthorizationException"," a ",[328,525,526],{},"403",". Inside a transaction, the throw rolls it back: ",[328,529,530],{},"mutatedAll()"," and ",[328,533,334],{}," can undo the write.",[320,536,537,538,541],{},"An event cannot change what the endpoint does: its payload is read-only. Read the request with ",[328,539,540],{},"$this->request()",".",[320,543,544,531,547,550,551,554,555,531,558,561,562,564,565,541],{},[328,545,546],{},"operating()",[328,548,549],{},"operated()"," run inside the transaction of an action with ",[328,552,553],{},"ActionTransaction::Whole",". Otherwise each chunk is committed, or each row with ",[328,556,557],{},"ActionTransaction::Row",[328,559,560],{},"ActionTransaction::None",", and a throw in ",[328,563,549],{}," leaves the rows written and skips ",[328,566,470],{},[320,568,569],{},"The queued jobs of an action run no event: the events run in the request.",[571,572,574],"h3",{"id":573},"refusing-a-search","Refusing a search",[313,576,577,579,580,583,584,586],{},[328,578,330],{}," receives a ",[328,581,582],{},"Lomkit\\Rest\\Search\\SearchContext"," built from the validated search. Throw a ",[328,585,514],{}," to refuse it before any query:",[588,589,594],"pre",{"className":590,"code":591,"language":592,"meta":593,"style":593},"language-php shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","use Illuminate\\Validation\\ValidationException;\nuse Lomkit\\Rest\\Search\\SearchContext;\n\npublic function searching(SearchContext $search): void\n{\n    if ($search->filtersOn('from') && ! $search->filtersOn('to')) {\n        throw ValidationException::withMessages(['search.filters' => 'The from filter requires a to filter.']);\n    }\n}\n","php","",[328,595,596,622,646,653,685,691,752,791,797],{"__ignoreMap":593},[597,598,601,605,609,613,615,617,619],"span",{"class":599,"line":600},"line",1,[597,602,604],{"class":603},"sbssI","use",[597,606,608],{"class":607},"sTEyZ"," Illuminate",[597,610,612],{"class":611},"sMK4o","\\",[597,614,50],{"class":607},[597,616,612],{"class":611},[597,618,514],{"class":607},[597,620,621],{"class":611},";\n",[597,623,625,627,630,632,635,637,639,641,644],{"class":599,"line":624},2,[597,626,604],{"class":603},[597,628,629],{"class":607}," Lomkit",[597,631,612],{"class":611},[597,633,634],{"class":607},"Rest",[597,636,612],{"class":611},[597,638,62],{"class":607},[597,640,612],{"class":611},[597,642,643],{"class":607},"SearchContext",[597,645,621],{"class":611},[597,647,649],{"class":599,"line":648},3,[597,650,652],{"emptyLinePlaceholder":651},true,"\n",[597,654,656,660,663,667,670,673,676,679,682],{"class":599,"line":655},4,[597,657,659],{"class":658},"spNyl","public",[597,661,662],{"class":658}," function",[597,664,666],{"class":665},"s2Zo4"," searching",[597,668,669],{"class":611},"(",[597,671,643],{"class":672},"sBMFI",[597,674,675],{"class":611}," $",[597,677,678],{"class":607},"search",[597,680,681],{"class":611},"):",[597,683,684],{"class":603}," void\n",[597,686,688],{"class":599,"line":687},5,[597,689,690],{"class":611},"{\n",[597,692,694,698,701,703,706,709,711,714,718,720,723,726,729,731,733,735,737,739,741,744,746,749],{"class":599,"line":693},6,[597,695,697],{"class":696},"s7zQu","    if",[597,699,700],{"class":611}," ($",[597,702,678],{"class":607},[597,704,705],{"class":611},"->",[597,707,708],{"class":665},"filtersOn",[597,710,669],{"class":611},[597,712,713],{"class":611},"'",[597,715,717],{"class":716},"sfazB","from",[597,719,713],{"class":611},[597,721,722],{"class":611},")",[597,724,725],{"class":611}," &&",[597,727,728],{"class":611}," !",[597,730,675],{"class":611},[597,732,678],{"class":607},[597,734,705],{"class":611},[597,736,708],{"class":665},[597,738,669],{"class":611},[597,740,713],{"class":611},[597,742,743],{"class":716},"to",[597,745,713],{"class":611},[597,747,748],{"class":611},"))",[597,750,751],{"class":611}," {\n",[597,753,755,758,761,764,767,770,772,775,777,780,783,786,788],{"class":599,"line":754},7,[597,756,757],{"class":696},"        throw",[597,759,760],{"class":672}," ValidationException",[597,762,763],{"class":611},"::",[597,765,766],{"class":665},"withMessages",[597,768,769],{"class":611},"([",[597,771,713],{"class":611},[597,773,774],{"class":716},"search.filters",[597,776,713],{"class":611},[597,778,779],{"class":611}," =>",[597,781,782],{"class":611}," '",[597,784,785],{"class":716},"The from filter requires a to filter.",[597,787,713],{"class":611},[597,789,790],{"class":611},"]);\n",[597,792,794],{"class":599,"line":793},8,[597,795,796],{"class":611},"    }\n",[597,798,800],{"class":599,"line":799},9,[597,801,802],{"class":611},"}\n",[313,804,805,531,808,811,812,815,816,531,819,822],{},[328,806,807],{},"filtersOn()",[328,809,810],{},"sortsOn()"," take a field, a relation path such as ",[328,813,814],{},"author.last_name",", or the key of an aggregate. ",[328,817,818],{},"scopes()",[328,820,821],{},"includes()"," list the names of the scopes and includes. The check also applies to the search of an action and of a metric.",[571,824,826],{"id":825},"logging-a-deletion","Logging a deletion",[588,828,830],{"className":590,"code":829,"language":592,"meta":593,"style":593},"use Illuminate\\Database\\Eloquent\\Collection;\n\npublic function destroyedAll(Collection $tickets): void\n{\n    ActivityLog::record('tickets.destroyed', $tickets->modelKeys());\n}\n",[328,831,832,855,859,881,885,919],{"__ignoreMap":593},[597,833,834,836,838,840,843,845,848,850,853],{"class":599,"line":600},[597,835,604],{"class":603},[597,837,608],{"class":607},[597,839,612],{"class":611},[597,841,842],{"class":607},"Database",[597,844,612],{"class":611},[597,846,847],{"class":607},"Eloquent",[597,849,612],{"class":611},[597,851,852],{"class":607},"Collection",[597,854,621],{"class":611},[597,856,857],{"class":599,"line":624},[597,858,652],{"emptyLinePlaceholder":651},[597,860,861,863,865,868,870,872,874,877,879],{"class":599,"line":648},[597,862,659],{"class":658},[597,864,662],{"class":658},[597,866,867],{"class":665}," destroyedAll",[597,869,669],{"class":611},[597,871,852],{"class":672},[597,873,675],{"class":611},[597,875,876],{"class":607},"tickets",[597,878,681],{"class":611},[597,880,684],{"class":603},[597,882,883],{"class":599,"line":655},[597,884,690],{"class":611},[597,886,887,890,892,895,897,899,902,904,907,909,911,913,916],{"class":599,"line":687},[597,888,889],{"class":672},"    ActivityLog",[597,891,763],{"class":611},[597,893,894],{"class":665},"record",[597,896,669],{"class":611},[597,898,713],{"class":611},[597,900,901],{"class":716},"tickets.destroyed",[597,903,713],{"class":611},[597,905,906],{"class":611},",",[597,908,675],{"class":611},[597,910,876],{"class":607},[597,912,705],{"class":611},[597,914,915],{"class":665},"modelKeys",[597,917,918],{"class":611},"());\n",[597,920,921],{"class":599,"line":693},[597,922,802],{"class":611},[358,924,340],{"id":925},"row-hooks",[313,927,928],{},"Row hooks run for each row, inside the transaction of their endpoint:",[365,930,931,940],{},[368,932,933],{},[371,934,935,938],{},[374,936,937],{},"Hook",[374,939,379],{},[381,941,942,956,968,981,994],{},[371,943,944,949],{},[386,945,946],{},[328,947,948],{},"mutating(MutationNode $entry, Model $model): void",[386,950,951,952,955],{},"before a row of ",[328,953,954],{},"mutate"," is saved",[371,957,958,963],{},[386,959,960],{},[328,961,962],{},"mutated(MutationNode $entry, Model $model): void",[386,964,965,966,955],{},"after a row of ",[328,967,954],{},[371,969,970,978],{},[386,971,972,478,975],{},[328,973,974],{},"destroying(Model $model)",[328,976,977],{},"destroyed(Model $model)",[386,979,980],{},"around the deletion of each row",[371,982,983,991],{},[386,984,985,478,988],{},[328,986,987],{},"restoring(Model $model)",[328,989,990],{},"restored(Model $model)",[386,992,993],{},"around the restore of each row",[371,995,996,1004],{},[386,997,998,478,1001],{},[328,999,1000],{},"forceDestroying(Model $model)",[328,1002,1003],{},"forceDestroyed(Model $model)",[386,1005,1006],{},"around the force deletion of each row",[313,1008,1009,531,1011,1014,1015,1018,1019,478,1022,478,1025,478,1028,478,1031,478,1034,478,1037,478,1040,531,1043,541],{},[328,1010,343],{},[328,1012,1013],{},"mutated()"," receive the entry of the request as a ",[328,1016,1017],{},"Lomkit\\Rest\\Mutations\\MutationNode",": ",[328,1020,1021],{},"operation",[328,1023,1024],{},"key",[328,1026,1027],{},"attributes",[328,1029,1030],{},"pivot",[328,1032,1033],{},"withoutDetaching",[328,1035,1036],{},"relations",[328,1038,1039],{},"type",[328,1041,1042],{},"depth",[328,1044,1045],{},"path",[588,1047,1049],{"className":590,"code":1048,"language":592,"meta":593,"style":593},"use Illuminate\\Database\\Eloquent\\Model;\nuse Lomkit\\Rest\\Fields\\MutationOperation;\nuse Lomkit\\Rest\\Mutations\\MutationNode;\n\npublic function mutating(MutationNode $entry, Model $model): void\n{\n    if ($entry->operation === MutationOperation::Create) {\n        $model->setAttribute('created_by', $this->request()->user()->id);\n    }\n}\n",[328,1050,1051,1072,1093,1115,1119,1151,1155,1183,1226,1230],{"__ignoreMap":593},[597,1052,1053,1055,1057,1059,1061,1063,1065,1067,1070],{"class":599,"line":600},[597,1054,604],{"class":603},[597,1056,608],{"class":607},[597,1058,612],{"class":611},[597,1060,842],{"class":607},[597,1062,612],{"class":611},[597,1064,847],{"class":607},[597,1066,612],{"class":611},[597,1068,1069],{"class":607},"Model",[597,1071,621],{"class":611},[597,1073,1074,1076,1078,1080,1082,1084,1086,1088,1091],{"class":599,"line":624},[597,1075,604],{"class":603},[597,1077,629],{"class":607},[597,1079,612],{"class":611},[597,1081,634],{"class":607},[597,1083,612],{"class":611},[597,1085,42],{"class":607},[597,1087,612],{"class":611},[597,1089,1090],{"class":607},"MutationOperation",[597,1092,621],{"class":611},[597,1094,1095,1097,1099,1101,1103,1105,1108,1110,1113],{"class":599,"line":648},[597,1096,604],{"class":603},[597,1098,629],{"class":607},[597,1100,612],{"class":611},[597,1102,634],{"class":607},[597,1104,612],{"class":611},[597,1106,1107],{"class":607},"Mutations",[597,1109,612],{"class":611},[597,1111,1112],{"class":607},"MutationNode",[597,1114,621],{"class":611},[597,1116,1117],{"class":599,"line":655},[597,1118,652],{"emptyLinePlaceholder":651},[597,1120,1121,1123,1125,1128,1130,1132,1134,1137,1139,1142,1144,1147,1149],{"class":599,"line":687},[597,1122,659],{"class":658},[597,1124,662],{"class":658},[597,1126,1127],{"class":665}," mutating",[597,1129,669],{"class":611},[597,1131,1112],{"class":672},[597,1133,675],{"class":611},[597,1135,1136],{"class":607},"entry",[597,1138,906],{"class":611},[597,1140,1141],{"class":672}," Model",[597,1143,675],{"class":611},[597,1145,1146],{"class":607},"model",[597,1148,681],{"class":611},[597,1150,684],{"class":603},[597,1152,1153],{"class":599,"line":693},[597,1154,690],{"class":611},[597,1156,1157,1159,1161,1163,1165,1168,1171,1174,1176,1179,1181],{"class":599,"line":754},[597,1158,697],{"class":696},[597,1160,700],{"class":611},[597,1162,1136],{"class":607},[597,1164,705],{"class":611},[597,1166,1167],{"class":607},"operation ",[597,1169,1170],{"class":611},"===",[597,1172,1173],{"class":672}," MutationOperation",[597,1175,763],{"class":611},[597,1177,1178],{"class":607},"Create",[597,1180,722],{"class":611},[597,1182,751],{"class":611},[597,1184,1185,1188,1190,1192,1195,1197,1199,1202,1204,1206,1209,1212,1215,1218,1220,1223],{"class":599,"line":793},[597,1186,1187],{"class":611},"        $",[597,1189,1146],{"class":607},[597,1191,705],{"class":611},[597,1193,1194],{"class":665},"setAttribute",[597,1196,669],{"class":611},[597,1198,713],{"class":611},[597,1200,1201],{"class":716},"created_by",[597,1203,713],{"class":611},[597,1205,906],{"class":611},[597,1207,1208],{"class":611}," $this->",[597,1210,1211],{"class":665},"request",[597,1213,1214],{"class":611},"()->",[597,1216,1217],{"class":665},"user",[597,1219,1214],{"class":611},[597,1221,1222],{"class":607},"id",[597,1224,1225],{"class":611},");\n",[597,1227,1228],{"class":599,"line":799},[597,1229,796],{"class":611},[597,1231,1233],{"class":599,"line":1232},10,[597,1234,802],{"class":611},[317,1236,1237,1274,1282,1294],{},[320,1238,1239,531,1241,1243,1244,519,1247,1250,1251,1253,1254,478,1257,478,1260,331,1263,1266,1267,1269,1270,331,1272,541],{},[328,1240,343],{},[328,1242,1013],{}," run for each row that an entry writes, at every level: a ",[328,1245,1246],{},"create",[328,1248,1249],{},"update",", an entry with ",[328,1252,1027],{},", and an ",[328,1255,1256],{},"attach",[328,1258,1259],{},"detach",[328,1261,1262],{},"sync",[328,1264,1265],{},"toggle"," entry whose own ",[328,1268,1036],{}," change. They do not run for a target that is only linked, without ",[328,1271,1027],{},[328,1273,1036],{},[320,1275,1276,1277,541],{},"To keep a history row for each written row, write it in these hooks: see ",[1278,1279,1281],"a",{"href":1280},"\u002Fwriting\u002Fmutate#recording-each-written-row","Recording each written row",[320,1283,1284,478,1287,531,1290,1293],{},[328,1285,1286],{},"performDelete(Model $model)",[328,1288,1289],{},"performRestore(Model $model)",[328,1291,1292],{},"performForceDelete(Model $model)"," replace the write itself.",[320,1295,1296,1297,1300,1301,1304,1305,1307,1308,1311,1312,331,1315,1317],{},"A ",[328,1298,1299],{},"delete"," entry of a ",[328,1302,1303],{},"deletable()"," relation in ",[328,1306,954],{}," goes through ",[328,1309,1310],{},"performDelete()"," and runs no ",[328,1313,1314],{},"destroying()",[328,1316,346],{}," hook.",[358,1319,352],{"id":1320},"laravel-events",[313,1322,1323],{},"After each write, the package dispatches a Laravel event, for every resource:",[365,1325,1326,1342],{},[368,1327,1328],{},[371,1329,1330,1336,1339],{},[374,1331,1332,1333,722],{},"Event (",[328,1334,1335],{},"Lomkit\\Rest\\Events",[374,1337,1338],{},"Endpoint",[374,1340,1341],{},"Properties",[381,1343,1344,1366,1398,1417],{},[371,1345,1346,1350,1354],{},[386,1347,1348],{},[328,1349,355],{},[386,1351,1352],{},[328,1353,954],{},[386,1355,1356,478,1359,1362,1363,1365],{},[328,1357,1358],{},"resource",[328,1360,1361],{},"operations"," (the ",[328,1364,1361],{}," of the response, as arrays)",[371,1367,1368,1376,1384],{},[386,1369,1370,478,1373],{},[328,1371,1372],{},"ResourceDestroyed",[328,1374,1375],{},"ResourceForceDestroyed",[386,1377,1378,478,1381],{},[328,1379,1380],{},"destroy",[328,1382,1383],{},"forceDestroy",[386,1385,1386,478,1388,1390,1391,1394,1395,722],{},[328,1387,1358],{},[328,1389,1146],{}," (the class of the model), ",[328,1392,1393],{},"keys"," (the keys of the rows, in the order of ",[328,1396,1397],{},"resources",[371,1399,1400,1405,1410],{},[386,1401,1402],{},[328,1403,1404],{},"ResourceRestored",[386,1406,1407],{},[328,1408,1409],{},"restore",[386,1411,1412,478,1414],{},[328,1413,1358],{},[328,1415,1416],{},"models",[371,1418,1419,1424,1429],{},[386,1420,1421],{},[328,1422,1423],{},"ActionOperated",[386,1425,1426],{},[328,1427,1428],{},"operate",[386,1430,1431,478,1433,1436,1437,478,1440,1443,1444,478,1447,1450,1451,722],{},[328,1432,1358],{},[328,1434,1435],{},"action"," (the class of the action), ",[328,1438,1439],{},"uriKey",[328,1441,1442],{},"fields"," (the values of the fields, by name), ",[328,1445,1446],{},"impacted",[328,1448,1449],{},"batch"," (the id of the batch, or ",[328,1452,1453],{},"null",[588,1455,1457],{"className":590,"code":1456,"language":592,"meta":593,"style":593},"use Illuminate\\Support\\Facades\\Event;\nuse Lomkit\\Rest\\Events\\ResourceDestroyed;\n\nEvent::listen(ResourceDestroyed::class, function (ResourceDestroyed $event) {\n    if ($event->resource === TicketResource::class) {\n        ActivityLog::record($event->resource, 'destroyed', $event->keys);\n    }\n});\n",[328,1458,1459,1481,1502,1506,1542,1568,1607,1611],{"__ignoreMap":593},[597,1460,1461,1463,1465,1467,1470,1472,1475,1477,1479],{"class":599,"line":600},[597,1462,604],{"class":603},[597,1464,608],{"class":607},[597,1466,612],{"class":611},[597,1468,1469],{"class":607},"Support",[597,1471,612],{"class":611},[597,1473,1474],{"class":607},"Facades",[597,1476,612],{"class":611},[597,1478,376],{"class":607},[597,1480,621],{"class":611},[597,1482,1483,1485,1487,1489,1491,1493,1496,1498,1500],{"class":599,"line":624},[597,1484,604],{"class":603},[597,1486,629],{"class":607},[597,1488,612],{"class":611},[597,1490,634],{"class":607},[597,1492,612],{"class":611},[597,1494,1495],{"class":607},"Events",[597,1497,612],{"class":611},[597,1499,1372],{"class":607},[597,1501,621],{"class":611},[597,1503,1504],{"class":599,"line":648},[597,1505,652],{"emptyLinePlaceholder":651},[597,1507,1508,1510,1512,1515,1517,1519,1521,1524,1526,1528,1531,1533,1535,1538,1540],{"class":599,"line":655},[597,1509,376],{"class":672},[597,1511,763],{"class":611},[597,1513,1514],{"class":665},"listen",[597,1516,669],{"class":611},[597,1518,1372],{"class":672},[597,1520,763],{"class":611},[597,1522,1523],{"class":603},"class",[597,1525,906],{"class":611},[597,1527,662],{"class":658},[597,1529,1530],{"class":611}," (",[597,1532,1372],{"class":672},[597,1534,675],{"class":611},[597,1536,1537],{"class":607},"event",[597,1539,722],{"class":611},[597,1541,751],{"class":611},[597,1543,1544,1546,1548,1550,1552,1555,1557,1560,1562,1564,1566],{"class":599,"line":687},[597,1545,697],{"class":696},[597,1547,700],{"class":611},[597,1549,1537],{"class":607},[597,1551,705],{"class":611},[597,1553,1554],{"class":607},"resource ",[597,1556,1170],{"class":611},[597,1558,1559],{"class":672}," TicketResource",[597,1561,763],{"class":611},[597,1563,1523],{"class":603},[597,1565,722],{"class":611},[597,1567,751],{"class":611},[597,1569,1570,1573,1575,1577,1580,1582,1584,1586,1588,1590,1593,1595,1597,1599,1601,1603,1605],{"class":599,"line":693},[597,1571,1572],{"class":672},"        ActivityLog",[597,1574,763],{"class":611},[597,1576,894],{"class":665},[597,1578,1579],{"class":611},"($",[597,1581,1537],{"class":607},[597,1583,705],{"class":611},[597,1585,1358],{"class":607},[597,1587,906],{"class":611},[597,1589,782],{"class":611},[597,1591,1592],{"class":716},"destroyed",[597,1594,713],{"class":611},[597,1596,906],{"class":611},[597,1598,675],{"class":611},[597,1600,1537],{"class":607},[597,1602,705],{"class":611},[597,1604,1393],{"class":607},[597,1606,1225],{"class":611},[597,1608,1609],{"class":599,"line":754},[597,1610,796],{"class":611},[597,1612,1613],{"class":599,"line":793},[597,1614,1615],{"class":611},"});\n",[317,1617,1618,1623,1629,1634,1637,1640],{},[320,1619,1620,1622],{},[328,1621,1358],{}," is the class of the resource: filter on it.",[320,1624,1625,1626,541],{},"The event is dispatched once the write is committed, once per request: never for a write that rolls back, nor for an attempt that a deadlock runs again. The events implement ",[328,1627,1628],{},"ShouldDispatchAfterCommit",[320,1630,1631,1633],{},[328,1632,1423],{}," is dispatched once the run ends without error. For a queued action, it is dispatched in the request, once the jobs are queued. The queued jobs dispatch no event.",[320,1635,1636],{},"Searches, details and metrics dispatch no event.",[320,1638,1639],{},"A listener cannot refuse or change the write: refuse it in the resource events.",[320,1641,1642,1643,1646,1647,531,1649,1651],{},"A listener may implement ",[328,1644,1645],{},"ShouldQueue",". ",[328,1648,1372],{},[328,1650,1375],{}," carry keys, since a deleted row may no longer load.",[571,1653,1655],{"id":1654},"keys-out-of-reach","Keys out of reach",[313,1657,1658,1659,1664,1665,1668,1669,478,1671,1674],{},"When a request names keys that the ",[1278,1660,1661],{"href":55},[328,1662,1663],{},"perimeterQuery()"," of their resource does not return, the package dispatches ",[328,1666,1667],{},"Lomkit\\Rest\\Events\\KeysOutOfReach",", so that a listener can record it. The request still answers its ",[328,1670,518],{},[328,1672,1673],{},"The selected resources.1 is invalid.",":",[588,1676,1678],{"className":590,"code":1677,"language":592,"meta":593,"style":593},"use Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Support\\Facades\\Log;\nuse Lomkit\\Rest\\Events\\KeysOutOfReach;\n\nEvent::listen(KeysOutOfReach::class, function (KeysOutOfReach $event) {\n    Log::warning('Keys out of reach', [\n        'resource' => $event->resource,\n        'endpoint' => $event->endpoint->value,\n        'keys' => $event->keys,\n        'paths' => $event->paths,\n        'user' => $event->user,\n    ]);\n});\n",[328,1679,1680,1700,1721,1742,1746,1778,1801,1823,1849,1869,1890,1911,1917],{"__ignoreMap":593},[597,1681,1682,1684,1686,1688,1690,1692,1694,1696,1698],{"class":599,"line":600},[597,1683,604],{"class":603},[597,1685,608],{"class":607},[597,1687,612],{"class":611},[597,1689,1469],{"class":607},[597,1691,612],{"class":611},[597,1693,1474],{"class":607},[597,1695,612],{"class":611},[597,1697,376],{"class":607},[597,1699,621],{"class":611},[597,1701,1702,1704,1706,1708,1710,1712,1714,1716,1719],{"class":599,"line":624},[597,1703,604],{"class":603},[597,1705,608],{"class":607},[597,1707,612],{"class":611},[597,1709,1469],{"class":607},[597,1711,612],{"class":611},[597,1713,1474],{"class":607},[597,1715,612],{"class":611},[597,1717,1718],{"class":607},"Log",[597,1720,621],{"class":611},[597,1722,1723,1725,1727,1729,1731,1733,1735,1737,1740],{"class":599,"line":648},[597,1724,604],{"class":603},[597,1726,629],{"class":607},[597,1728,612],{"class":611},[597,1730,634],{"class":607},[597,1732,612],{"class":611},[597,1734,1495],{"class":607},[597,1736,612],{"class":611},[597,1738,1739],{"class":607},"KeysOutOfReach",[597,1741,621],{"class":611},[597,1743,1744],{"class":599,"line":655},[597,1745,652],{"emptyLinePlaceholder":651},[597,1747,1748,1750,1752,1754,1756,1758,1760,1762,1764,1766,1768,1770,1772,1774,1776],{"class":599,"line":687},[597,1749,376],{"class":672},[597,1751,763],{"class":611},[597,1753,1514],{"class":665},[597,1755,669],{"class":611},[597,1757,1739],{"class":672},[597,1759,763],{"class":611},[597,1761,1523],{"class":603},[597,1763,906],{"class":611},[597,1765,662],{"class":658},[597,1767,1530],{"class":611},[597,1769,1739],{"class":672},[597,1771,675],{"class":611},[597,1773,1537],{"class":607},[597,1775,722],{"class":611},[597,1777,751],{"class":611},[597,1779,1780,1783,1785,1788,1790,1792,1794,1796,1798],{"class":599,"line":693},[597,1781,1782],{"class":672},"    Log",[597,1784,763],{"class":611},[597,1786,1787],{"class":665},"warning",[597,1789,669],{"class":611},[597,1791,713],{"class":611},[597,1793,1655],{"class":716},[597,1795,713],{"class":611},[597,1797,906],{"class":611},[597,1799,1800],{"class":611}," [\n",[597,1802,1803,1806,1808,1810,1812,1814,1816,1818,1820],{"class":599,"line":754},[597,1804,1805],{"class":611},"        '",[597,1807,1358],{"class":716},[597,1809,713],{"class":611},[597,1811,779],{"class":611},[597,1813,675],{"class":611},[597,1815,1537],{"class":607},[597,1817,705],{"class":611},[597,1819,1358],{"class":607},[597,1821,1822],{"class":611},",\n",[597,1824,1825,1827,1830,1832,1834,1836,1838,1840,1842,1844,1847],{"class":599,"line":793},[597,1826,1805],{"class":611},[597,1828,1829],{"class":716},"endpoint",[597,1831,713],{"class":611},[597,1833,779],{"class":611},[597,1835,675],{"class":611},[597,1837,1537],{"class":607},[597,1839,705],{"class":611},[597,1841,1829],{"class":607},[597,1843,705],{"class":611},[597,1845,1846],{"class":607},"value",[597,1848,1822],{"class":611},[597,1850,1851,1853,1855,1857,1859,1861,1863,1865,1867],{"class":599,"line":799},[597,1852,1805],{"class":611},[597,1854,1393],{"class":716},[597,1856,713],{"class":611},[597,1858,779],{"class":611},[597,1860,675],{"class":611},[597,1862,1537],{"class":607},[597,1864,705],{"class":611},[597,1866,1393],{"class":607},[597,1868,1822],{"class":611},[597,1870,1871,1873,1876,1878,1880,1882,1884,1886,1888],{"class":599,"line":1232},[597,1872,1805],{"class":611},[597,1874,1875],{"class":716},"paths",[597,1877,713],{"class":611},[597,1879,779],{"class":611},[597,1881,675],{"class":611},[597,1883,1537],{"class":607},[597,1885,705],{"class":611},[597,1887,1875],{"class":607},[597,1889,1822],{"class":611},[597,1891,1893,1895,1897,1899,1901,1903,1905,1907,1909],{"class":599,"line":1892},11,[597,1894,1805],{"class":611},[597,1896,1217],{"class":716},[597,1898,713],{"class":611},[597,1900,779],{"class":611},[597,1902,675],{"class":611},[597,1904,1537],{"class":607},[597,1906,705],{"class":611},[597,1908,1217],{"class":607},[597,1910,1822],{"class":611},[597,1912,1914],{"class":599,"line":1913},12,[597,1915,1916],{"class":611},"    ]);\n",[597,1918,1920],{"class":599,"line":1919},13,[597,1921,1615],{"class":611},[365,1923,1924,1934],{},[368,1925,1926],{},[371,1927,1928,1931],{},[374,1929,1930],{},"Property",[374,1932,1933],{},"Value",[381,1935,1936,1945,1954,1970,1979,1992,2005,2015],{},[371,1937,1938,1942],{},[386,1939,1940],{},[328,1941,1358],{},[386,1943,1944],{},"the class of the resource of the keys",[371,1946,1947,1951],{},[386,1948,1949],{},[328,1950,1146],{},[386,1952,1953],{},"the class of its model",[371,1955,1956,1960],{},[386,1957,1958],{},[328,1959,1829],{},[386,1961,1962,1963,1966,1967],{},"the ",[328,1964,1965],{},"Lomkit\\Rest\\Http\\Routing\\Endpoint"," of the request, such as ",[328,1968,1969],{},"Endpoint::Destroy",[371,1971,1972,1976],{},[386,1973,1974],{},[328,1975,1393],{},[386,1977,1978],{},"the keys out of reach, each once, at most 50",[371,1980,1981,1985],{},[386,1982,1983],{},[328,1984,1875],{},[386,1986,1987,1988,1991],{},"the payload path of each refused key, such as ",[328,1989,1990],{},"mutate.0.relations.shelves.0.key.0",", at most 50",[371,1993,1994,1999],{},[386,1995,1996],{},[328,1997,1998],{},"capped",[386,2000,2001,2004],{},[328,2002,2003],{},"true"," when keys or paths were left out",[371,2006,2007,2012],{},[386,2008,2009],{},[328,2010,2011],{},"guard",[386,2013,2014],{},"the guard of the request",[371,2016,2017,2021],{},[386,2018,2019],{},[328,2020,1217],{},[386,2022,2023,2024,2026],{},"the identifier of the user, or ",[328,2025,1453],{}," for a guest",[317,2028,2029,2063,2069,2072],{},[320,2030,2031,2032,2034,2035,2037,2038,478,2040,478,2042,478,2044,478,2046,478,2048,2050,2051,2053,2054,2056,2057,478,2059,531,2061,541],{},"It covers the ",[328,2033,1024],{}," of a ",[328,2036,954],{}," entry and of a relation entry (",[328,2039,1256],{},[328,2041,1259],{},[328,2043,1249],{},[328,2045,1262],{},[328,2047,1265],{},[328,2049,1299],{},"), the ",[328,2052,1397],{}," of an action, and the ",[328,2055,1397],{}," of ",[328,2058,1380],{},[328,2060,1409],{},[328,2062,1383],{},[320,2064,2065,2066,2068],{},"One event per resource and per request, dispatched during validation, before the ",[328,2067,518],{},". The response does not change.",[320,2070,2071],{},"A key refused for another reason, its type, a repeat or a list over its limit, dispatches nothing.",[320,2073,1296,2074,2076],{},[1278,2075,188],{"href":189}," request dispatches it when it validates the keys.",[2078,2079,2080],"style",{},"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 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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}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);}",{"title":593,"searchDepth":600,"depth":624,"links":2082},[2083,2087,2088],{"id":360,"depth":624,"text":325,"children":2084},[2085,2086],{"id":573,"depth":648,"text":574},{"id":825,"depth":648,"text":826},{"id":925,"depth":624,"text":340},{"id":1320,"depth":624,"text":352,"children":2089},[2090],{"id":1654,"depth":648,"text":1655},"Run your code at fixed moments of each endpoint with resource events and row hooks, and listen to the Laravel events of each write.","md",null,{},{"title":176,"description":2091},{"loc":177},"-Ct907sesyzrabUOiA3UKIwiGFQlrJCLyXx12eIy4Vo",[2099,2101],{"title":172,"path":173,"stem":174,"description":2100,"children":-1},"Describe a resource to clients with a thin base, then ask for fields, relations, actions, metrics and authorizations with the with parameter.",{"title":180,"path":181,"stem":182,"description":2102,"children":-1},"Change the rows that a resource sends with map(), and add keys to the meta of a search page with searchMeta().",1794181350596]