[{"data":1,"prerenderedAt":1322},["ShallowReactive",2],{"navigation":3,"\u002Fauthorization\u002Fgates":307,"\u002Fauthorization\u002Fgates-surround":1317},{"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":158,"body":309,"description":1310,"extension":1311,"links":1312,"meta":1313,"navigation":1050,"path":159,"seo":1314,"sitemap":1315,"stem":160,"__hash__":1316},"docs3x\u002F6.authorization\u002F2.gates.md",{"type":310,"value":311,"toc":1301},"minimark",[312,321,326,422,428,659,770,775,793,815,819,826,878,952,964,997,1001,1007,1192,1218,1222,1232,1265,1279,1283,1297],[313,314,315,316,320],"p",{},"A client often needs to know whether to show an edit or a delete button on a row. Ask for ",[317,318,319],"code",{},"gates"," in a search, and each row answers the abilities of your policies for the current user.",[322,323,325],"h2",{"id":324},"asking-for-gates","Asking for gates",[327,328,333],"pre",{"className":329,"code":330,"language":331,"meta":332,"style":332},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"search\": {\n    \"gates\": [\"view\", \"update\", \"create\"]\n  }\n}\n","json","",[317,334,335,344,363,410,416],{"__ignoreMap":332},[336,337,340],"span",{"class":338,"line":339},"line",1,[336,341,343],{"class":342},"sMK4o","{\n",[336,345,347,350,354,357,360],{"class":338,"line":346},2,[336,348,349],{"class":342},"  \"",[336,351,353],{"class":352},"spNyl","search",[336,355,356],{"class":342},"\"",[336,358,359],{"class":342},":",[336,361,362],{"class":342}," {\n",[336,364,366,369,372,374,376,379,381,385,387,390,393,396,398,400,402,405,407],{"class":338,"line":365},3,[336,367,368],{"class":342},"    \"",[336,370,319],{"class":371},"sBMFI",[336,373,356],{"class":342},[336,375,359],{"class":342},[336,377,378],{"class":342}," [",[336,380,356],{"class":342},[336,382,384],{"class":383},"sfazB","view",[336,386,356],{"class":342},[336,388,389],{"class":342},",",[336,391,392],{"class":342}," \"",[336,394,395],{"class":383},"update",[336,397,356],{"class":342},[336,399,389],{"class":342},[336,401,392],{"class":342},[336,403,404],{"class":383},"create",[336,406,356],{"class":342},[336,408,409],{"class":342},"]\n",[336,411,413],{"class":338,"line":412},4,[336,414,415],{"class":342},"  }\n",[336,417,419],{"class":338,"line":418},5,[336,420,421],{"class":342},"}\n",[313,423,424,425,359],{},"An excerpt of the page, when the policy denies the update with ",[317,426,427],{},"Response::deny('Closed tickets are read-only.')",[327,429,431],{"className":329,"code":430,"language":331,"meta":332,"style":332},"{\n  \"current_page\": 1,\n  \"data\": [\n    {\"id\": 2, \"title\": \"Password reset\", \"gates\": {\"authorized_to_view\": {\"allowed\": true, \"message\": null}, \"authorized_to_update\": {\"allowed\": false, \"message\": \"Closed tickets are read-only.\"}}}\n  ],\n  \"meta\": {\"gates\": {\"authorized_to_create\": {\"allowed\": true, \"message\": null}}}\n}\n",[317,432,433,437,455,469,593,598,654],{"__ignoreMap":332},[336,434,435],{"class":338,"line":339},[336,436,343],{"class":342},[336,438,439,441,444,446,448,452],{"class":338,"line":346},[336,440,349],{"class":342},[336,442,443],{"class":352},"current_page",[336,445,356],{"class":342},[336,447,359],{"class":342},[336,449,451],{"class":450},"sbssI"," 1",[336,453,454],{"class":342},",\n",[336,456,457,459,462,464,466],{"class":338,"line":365},[336,458,349],{"class":342},[336,460,461],{"class":352},"data",[336,463,356],{"class":342},[336,465,359],{"class":342},[336,467,468],{"class":342}," [\n",[336,470,471,474,476,479,481,483,486,488,490,493,495,497,499,502,504,506,508,510,512,514,517,519,522,524,526,528,530,534,536,538,541,543,546,548,550,553,555,558,560,562,564,566,568,570,572,575,577,579,581,583,585,588,590],{"class":338,"line":412},[336,472,473],{"class":342},"    {",[336,475,356],{"class":342},[336,477,478],{"class":371},"id",[336,480,356],{"class":342},[336,482,359],{"class":342},[336,484,485],{"class":450}," 2",[336,487,389],{"class":342},[336,489,392],{"class":342},[336,491,492],{"class":371},"title",[336,494,356],{"class":342},[336,496,359],{"class":342},[336,498,392],{"class":342},[336,500,501],{"class":383},"Password reset",[336,503,356],{"class":342},[336,505,389],{"class":342},[336,507,392],{"class":342},[336,509,319],{"class":371},[336,511,356],{"class":342},[336,513,359],{"class":342},[336,515,516],{"class":342}," {",[336,518,356],{"class":342},[336,520,521],{"class":450},"authorized_to_view",[336,523,356],{"class":342},[336,525,359],{"class":342},[336,527,516],{"class":342},[336,529,356],{"class":342},[336,531,533],{"class":532},"swJcz","allowed",[336,535,356],{"class":342},[336,537,359],{"class":342},[336,539,540],{"class":342}," true,",[336,542,392],{"class":342},[336,544,545],{"class":532},"message",[336,547,356],{"class":342},[336,549,359],{"class":342},[336,551,552],{"class":342}," null},",[336,554,392],{"class":342},[336,556,557],{"class":450},"authorized_to_update",[336,559,356],{"class":342},[336,561,359],{"class":342},[336,563,516],{"class":342},[336,565,356],{"class":342},[336,567,533],{"class":532},[336,569,356],{"class":342},[336,571,359],{"class":342},[336,573,574],{"class":342}," false,",[336,576,392],{"class":342},[336,578,545],{"class":532},[336,580,356],{"class":342},[336,582,359],{"class":342},[336,584,392],{"class":342},[336,586,587],{"class":383},"Closed tickets are read-only.",[336,589,356],{"class":342},[336,591,592],{"class":342},"}}}\n",[336,594,595],{"class":338,"line":418},[336,596,597],{"class":342},"  ],\n",[336,599,601,603,606,608,610,612,614,616,618,620,622,624,627,629,631,633,635,637,639,641,643,645,647,649,651],{"class":338,"line":600},6,[336,602,349],{"class":342},[336,604,605],{"class":352},"meta",[336,607,356],{"class":342},[336,609,359],{"class":342},[336,611,516],{"class":342},[336,613,356],{"class":342},[336,615,319],{"class":371},[336,617,356],{"class":342},[336,619,359],{"class":342},[336,621,516],{"class":342},[336,623,356],{"class":342},[336,625,626],{"class":450},"authorized_to_create",[336,628,356],{"class":342},[336,630,359],{"class":342},[336,632,516],{"class":342},[336,634,356],{"class":342},[336,636,533],{"class":532},[336,638,356],{"class":342},[336,640,359],{"class":342},[336,642,540],{"class":342},[336,644,392],{"class":342},[336,646,545],{"class":532},[336,648,356],{"class":342},[336,650,359],{"class":342},[336,652,653],{"class":342}," null}}}\n",[336,655,657],{"class":338,"line":656},7,[336,658,421],{"class":342},[660,661,662,680,738,746,754],"ul",{},[663,664,665,666,668,669,671,672,675,676,679],"li",{},"Each answer holds ",[317,667,533],{}," and ",[317,670,545],{},": the message of the policy's ",[317,673,674],{},"Response::deny()",", or ",[317,677,678],{},"null",".",[663,681,682,684,685,687,688,687,690,687,692,687,695,668,698,701,702,707,708,668,710,712,713,716,717,720,721,668,723,725,726,729,730,733,734,737],{},[317,683,319],{}," takes ",[317,686,384],{},", ",[317,689,404],{},[317,691,395],{},[317,693,694],{},"delete",[317,696,697],{},"restore",[317,699,700],{},"forceDelete",", and the ",[703,704,706],"a",{"href":705},"#declaring-your-own-gates","gates that the resource declares",", each once. ",[317,709,697],{},[317,711,700],{}," are gates only when the model of the resource uses ",[317,714,715],{},"SoftDeletes",". ",[317,718,719],{},"viewAny",", another name, or ",[317,722,697],{},[317,724,700],{}," on another model, is a ",[317,727,728],{},"422",": ",[317,731,732],{},"The selected search.gates.0 is invalid."," An ability listed twice gives ",[317,735,736],{},"The search.gates.0 field has a duplicate value."," on each copy.",[663,739,740,742,743,745],{},[317,741,404],{}," does not depend on a row: its answer goes to the ",[317,744,605],{}," of the page. It is accepted at the root of a search only.",[663,747,748,749,751,752,679],{},"An include takes its own ",[317,750,319],{},", answered on each included row. See ",[703,753,80],{"href":81},[663,755,756,757,759,760,763,764,766,767,769],{},"A row whose ",[317,758,319],{}," hold no answer returns ",[317,761,762],{},"{}",". A search without ",[317,765,319],{}," returns no ",[317,768,319],{}," key on its rows.",[771,772,774],"h3",{"id":773},"gates-and-the-perimeter","Gates and the perimeter",[313,776,777,687,779,687,781,668,783,785,786,788,789,792],{},[317,778,395],{},[317,780,694],{},[317,782,697],{},[317,784,700],{}," answer for the rows that their endpoint reaches. A row that the endpoint would refuse with a ",[317,787,728],{}," answers ",[317,790,791],{},"{\"allowed\": false, \"message\": null}"," without calling the policy:",[660,794,795,807],{},[663,796,797,798,668,800,802,803,806],{},"a trashed row, for ",[317,799,395],{},[317,801,694],{},", unless ",[317,804,805],{},"perimeterQuery()"," takes trashed rows in;",[663,808,809,810,812,813,679],{},"a row of a search engine page that ",[317,811,805],{}," leaves out. See ",[703,814,92],{"href":93},[322,816,818],{"id":817},"declaring-your-own-gates","Declaring your own gates",[313,820,821,822,825],{},"A resource declares more gates in ",[317,823,824],{},"gates()",": the names of policy methods that receive the user and the model.",[327,827,831],{"className":828,"code":829,"language":830,"meta":332,"style":332},"language-php shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","public function gates(): array\n{\n    return ['download'];\n}\n","php",[317,832,833,851,855,874],{"__ignoreMap":332},[336,834,835,838,841,845,848],{"class":338,"line":339},[336,836,837],{"class":352},"public",[336,839,840],{"class":352}," function",[336,842,844],{"class":843},"s2Zo4"," gates",[336,846,847],{"class":342},"():",[336,849,850],{"class":450}," array\n",[336,852,853],{"class":338,"line":346},[336,854,343],{"class":342},[336,856,857,861,863,866,869,871],{"class":338,"line":365},[336,858,860],{"class":859},"s7zQu","    return",[336,862,378],{"class":342},[336,864,865],{"class":342},"'",[336,867,868],{"class":383},"download",[336,870,865],{"class":342},[336,872,873],{"class":342},"];\n",[336,875,876],{"class":338,"line":412},[336,877,421],{"class":342},[327,879,881],{"className":828,"code":880,"language":830,"meta":332,"style":332},"\u002F\u002F PostPolicy\npublic function download(User $user, Post $post): bool\n{\n    return $post->published;\n}\n",[317,882,883,889,927,931,948],{"__ignoreMap":332},[336,884,885],{"class":338,"line":339},[336,886,888],{"class":887},"sHwdD","\u002F\u002F PostPolicy\n",[336,890,891,893,895,898,901,904,907,911,913,916,918,921,924],{"class":338,"line":346},[336,892,837],{"class":352},[336,894,840],{"class":352},[336,896,897],{"class":843}," download",[336,899,900],{"class":342},"(",[336,902,903],{"class":371},"User",[336,905,906],{"class":342}," $",[336,908,910],{"class":909},"sTEyZ","user",[336,912,389],{"class":342},[336,914,915],{"class":371}," Post",[336,917,906],{"class":342},[336,919,920],{"class":909},"post",[336,922,923],{"class":342},"):",[336,925,926],{"class":450}," bool\n",[336,928,929],{"class":338,"line":365},[336,930,343],{"class":342},[336,932,933,935,937,939,942,945],{"class":338,"line":412},[336,934,860],{"class":859},[336,936,906],{"class":342},[336,938,920],{"class":909},[336,940,941],{"class":342},"->",[336,943,944],{"class":909},"published",[336,946,947],{"class":342},";\n",[336,949,950],{"class":338,"line":418},[336,951,421],{"class":342},[313,953,954,955,957,958,960,961,679],{},"A search of that resource then accepts ",[317,956,868],{}," in ",[317,959,319],{},", at the root and in each include of that resource, and each row answers it under ",[317,962,963],{},"authorized_to_download",[660,965,966,976,981,987],{},[663,967,968,969,971,972,975],{},"A name is the camelCase name of a policy method, listed once, other than ",[317,970,719],{}," and the six abilities above. Another value throws ",[317,973,974],{},"Lomkit\\Rest\\Exceptions\\InvalidResourceException"," when the gates are first read.",[663,977,978,979,679],{},"A declared gate is answered on each row, never in ",[317,980,605],{},[663,982,983,984,986],{},"A policy without the method denies it, with a ",[317,985,678],{}," message, as Laravel does.",[663,988,989,990,993,994,679],{},"The ",[703,991,992],{"href":173},"details"," list every gate that a search accepts, with ",[317,995,996],{},"?with=gates",[322,998,1000],{"id":999},"naming-the-answers","Naming the answers",[313,1002,1003,1006],{},[317,1004,1005],{},"config\u002Frest.php"," names the key of the answers and each answer:",[327,1008,1010],{"className":828,"code":1009,"language":830,"meta":332,"style":332},"'gates' => [\n    'key' => 'gates',\n\n    'names' => [\n        'authorized_to_view' => 'authorized_to_view',\n        'authorized_to_create' => 'authorized_to_create',\n        'authorized_to_update' => 'authorized_to_update',\n        'authorized_to_delete' => 'authorized_to_delete',\n        'authorized_to_restore' => 'authorized_to_restore',\n        'authorized_to_force_delete' => 'authorized_to_force_delete',\n    ],\n],\n",[317,1011,1012,1025,1046,1052,1065,1084,1102,1120,1140,1160,1180,1186],{"__ignoreMap":332},[336,1013,1014,1016,1018,1020,1023],{"class":338,"line":339},[336,1015,865],{"class":342},[336,1017,319],{"class":383},[336,1019,865],{"class":342},[336,1021,1022],{"class":342}," =>",[336,1024,468],{"class":342},[336,1026,1027,1030,1033,1035,1037,1040,1042,1044],{"class":338,"line":346},[336,1028,1029],{"class":342},"    '",[336,1031,1032],{"class":383},"key",[336,1034,865],{"class":342},[336,1036,1022],{"class":342},[336,1038,1039],{"class":342}," '",[336,1041,319],{"class":383},[336,1043,865],{"class":342},[336,1045,454],{"class":342},[336,1047,1048],{"class":338,"line":365},[336,1049,1051],{"emptyLinePlaceholder":1050},true,"\n",[336,1053,1054,1056,1059,1061,1063],{"class":338,"line":412},[336,1055,1029],{"class":342},[336,1057,1058],{"class":383},"names",[336,1060,865],{"class":342},[336,1062,1022],{"class":342},[336,1064,468],{"class":342},[336,1066,1067,1070,1072,1074,1076,1078,1080,1082],{"class":338,"line":418},[336,1068,1069],{"class":342},"        '",[336,1071,521],{"class":383},[336,1073,865],{"class":342},[336,1075,1022],{"class":342},[336,1077,1039],{"class":342},[336,1079,521],{"class":383},[336,1081,865],{"class":342},[336,1083,454],{"class":342},[336,1085,1086,1088,1090,1092,1094,1096,1098,1100],{"class":338,"line":600},[336,1087,1069],{"class":342},[336,1089,626],{"class":383},[336,1091,865],{"class":342},[336,1093,1022],{"class":342},[336,1095,1039],{"class":342},[336,1097,626],{"class":383},[336,1099,865],{"class":342},[336,1101,454],{"class":342},[336,1103,1104,1106,1108,1110,1112,1114,1116,1118],{"class":338,"line":656},[336,1105,1069],{"class":342},[336,1107,557],{"class":383},[336,1109,865],{"class":342},[336,1111,1022],{"class":342},[336,1113,1039],{"class":342},[336,1115,557],{"class":383},[336,1117,865],{"class":342},[336,1119,454],{"class":342},[336,1121,1123,1125,1128,1130,1132,1134,1136,1138],{"class":338,"line":1122},8,[336,1124,1069],{"class":342},[336,1126,1127],{"class":383},"authorized_to_delete",[336,1129,865],{"class":342},[336,1131,1022],{"class":342},[336,1133,1039],{"class":342},[336,1135,1127],{"class":383},[336,1137,865],{"class":342},[336,1139,454],{"class":342},[336,1141,1143,1145,1148,1150,1152,1154,1156,1158],{"class":338,"line":1142},9,[336,1144,1069],{"class":342},[336,1146,1147],{"class":383},"authorized_to_restore",[336,1149,865],{"class":342},[336,1151,1022],{"class":342},[336,1153,1039],{"class":342},[336,1155,1147],{"class":383},[336,1157,865],{"class":342},[336,1159,454],{"class":342},[336,1161,1163,1165,1168,1170,1172,1174,1176,1178],{"class":338,"line":1162},10,[336,1164,1069],{"class":342},[336,1166,1167],{"class":383},"authorized_to_force_delete",[336,1169,865],{"class":342},[336,1171,1022],{"class":342},[336,1173,1039],{"class":342},[336,1175,1167],{"class":383},[336,1177,865],{"class":342},[336,1179,454],{"class":342},[336,1181,1183],{"class":338,"line":1182},11,[336,1184,1185],{"class":342},"    ],\n",[336,1187,1189],{"class":338,"line":1188},12,[336,1190,1191],{"class":342},"],\n",[660,1193,1194,1209],{},[663,1195,1196,1199,1200,1202,1203,1205,1206,679],{},[317,1197,1198],{},"gates.key"," renames the ",[317,1201,319],{}," key of the rows and of ",[317,1204,605],{},". A field named like it throws ",[317,1207,1208],{},"InvalidResourceException",[663,1210,1211,1214,1215,679],{},[317,1212,1213],{},"gates.names"," renames each answer. It also renames the gates that a resource declares, by their default name: ",[317,1216,1217],{},"'authorized_to_download' => 'can_download'",[322,1219,1221],{"id":1220},"turning-the-gates-off","Turning the gates off",[313,1223,1224,1225,1228,1229,359],{},"Override ",[317,1226,1227],{},"isGatingEnabled()"," on a resource, or on the base resource for every resource, and return ",[317,1230,1231],{},"false",[327,1233,1235],{"className":828,"code":1234,"language":830,"meta":332,"style":332},"public function isGatingEnabled(): bool\n{\n    return false;\n}\n",[317,1236,1237,1250,1254,1261],{"__ignoreMap":332},[336,1238,1239,1241,1243,1246,1248],{"class":338,"line":339},[336,1240,837],{"class":352},[336,1242,840],{"class":352},[336,1244,1245],{"class":843}," isGatingEnabled",[336,1247,847],{"class":342},[336,1249,926],{"class":450},[336,1251,1252],{"class":338,"line":346},[336,1253,343],{"class":342},[336,1255,1256,1258],{"class":338,"line":365},[336,1257,860],{"class":859},[336,1259,1260],{"class":342}," false;\n",[336,1262,1263],{"class":338,"line":412},[336,1264,421],{"class":342},[313,1266,1267,1268,1270,1271,1273,1274,729,1276],{},"At the root of a search, ",[317,1269,319],{}," stays accepted and returns no answer. In an include of such a resource, ",[317,1272,319],{}," is a ",[317,1275,728],{},[317,1277,1278],{},"The search.includes.0.gates field is prohibited: the included resource turns its gates off.",[322,1280,1282],{"id":1281},"cost","Cost",[313,1284,1285,1286,1289,1290,1293,1294,679],{},"Each answer goes through the resource's ",[317,1287,1288],{},"authorizedTo()",", so the policy runs once per row and gate in a request. To keep the answers between requests, declare the abilities in ",[317,1291,1292],{},"authorizationCache()",", see ",[703,1295,1296],{"href":163},"Decision cache",[1298,1299,1300],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .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}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":332,"searchDepth":339,"depth":346,"links":1302},[1303,1306,1307,1308,1309],{"id":324,"depth":346,"text":325,"children":1304},[1305],{"id":773,"depth":365,"text":774},{"id":817,"depth":346,"text":818},{"id":999,"depth":346,"text":1000},{"id":1220,"depth":346,"text":1221},{"id":1281,"depth":346,"text":1282},"Tell clients what the user may do with each row of a search, with the answers and messages of your policies, and your own gates.","md",null,{},{"title":158,"description":1310},{"loc":159},"sqqG_NSTxSvewAim3EmjXQyFV0Eu1LE1q8h-cf4a6pI",[1318,1320],{"title":154,"path":155,"stem":156,"description":1319,"children":-1},"How Laravel policies guard each endpoint, each resource a request reaches and each row it writes, before validation and before any query.",{"title":162,"path":163,"stem":164,"description":1321,"children":-1},"Keep the decisions of chosen policy abilities between requests, key them per user and tenant, and forget them when rights change.",1794181351138]