[{"data":1,"prerenderedAt":4023},["ShallowReactive",2],{"navigation-zh":3,"navigation-v1":81,"\u002Fzh\u002Fguide\u002Fsecurity":146,"\u002Fzh\u002Fguide\u002Fsecurity-surround":2200,"\u002Fzh\u002Fguide\u002Fsecurity-og":2205},[4,55,77],{"title":5,"path":6,"stem":7,"children":8},"指南","\u002Fzh\u002Fguide","zh\u002F1.guide\u002F01.index",[9,11,15,19,23,27,31,35,39,43,47,51],{"title":10,"path":6,"stem":7},"介绍",{"title":12,"path":13,"stem":14},"序言","\u002Fzh\u002Fguide\u002Fprologue","zh\u002F1.guide\u002F00.prologue",{"title":16,"path":17,"stem":18},"快速上手","\u002Fzh\u002Fguide\u002Fgetting-started","zh\u002F1.guide\u002F02.getting-started",{"title":20,"path":21,"stem":22},"模型","\u002Fzh\u002Fguide\u002Fmodels","zh\u002F1.guide\u002F03.models",{"title":24,"path":25,"stem":26},"关联","\u002Fzh\u002Fguide\u002Frelationships","zh\u002F1.guide\u002F04.relationships",{"title":28,"path":29,"stem":30},"钩子","\u002Fzh\u002Fguide\u002Fhooks","zh\u002F1.guide\u002F05.hooks",{"title":32,"path":33,"stem":34},"搜索","\u002Fzh\u002Fguide\u002Fsearch","zh\u002F1.guide\u002F06.search",{"title":36,"path":37,"stem":38},"批量操作","\u002Fzh\u002Fguide\u002Fbatch-operations","zh\u002F1.guide\u002F07.batch-operations",{"title":40,"path":41,"stem":42},"查询参数","\u002Fzh\u002Fguide\u002Fquery-parameters","zh\u002F1.guide\u002F08.query-parameters",{"title":44,"path":45,"stem":46},"安全","\u002Fzh\u002Fguide\u002Fsecurity","zh\u002F1.guide\u002F09.security",{"title":48,"path":49,"stem":50},"响应","\u002Fzh\u002Fguide\u002Fresponses","zh\u002F1.guide\u002F10.responses",{"title":52,"path":53,"stem":54},"规范","\u002Fzh\u002Fguide\u002Fspecifications","zh\u002F1.guide\u002F11.specifications",{"title":56,"path":57,"stem":58,"children":59},"TypeScript SDK","\u002Fzh\u002Ftypescript-sdk","zh\u002F2.typescript-sdk\u002F01.index",[60,61,64,68,71,74],{"title":10,"path":57,"stem":58},{"title":16,"path":62,"stem":63},"\u002Fzh\u002Ftypescript-sdk\u002Fgetting-started","zh\u002F2.typescript-sdk\u002F02.getting-started",{"title":65,"path":66,"stem":67},"配置","\u002Fzh\u002Ftypescript-sdk\u002Fconfiguration","zh\u002F2.typescript-sdk\u002F03.configuration",{"title":20,"path":69,"stem":70},"\u002Fzh\u002Ftypescript-sdk\u002Fmodels","zh\u002F2.typescript-sdk\u002F04.models",{"title":24,"path":72,"stem":73},"\u002Fzh\u002Ftypescript-sdk\u002Frelationships","zh\u002F2.typescript-sdk\u002F05.relationships",{"title":40,"path":75,"stem":76},"\u002Fzh\u002Ftypescript-sdk\u002Fquery-parameters","zh\u002F2.typescript-sdk\u002F06.query-parameters",{"title":78,"path":79,"stem":80},"视频教程","\u002Fzh\u002Fscreencasts","zh\u002Fscreencasts",[82,125],{"title":83,"path":84,"stem":85,"children":86},"Guide","\u002Fv1.x\u002Fguide","v1.x\u002F1.guide\u002F01.index",[87,89,93,97,101,105,109,113,117,121],{"title":88,"path":84,"stem":85},"Introduction",{"title":90,"path":91,"stem":92},"Getting Started","\u002Fv1.x\u002Fguide\u002Fgetting-started","v1.x\u002F1.guide\u002F02.getting-started",{"title":94,"path":95,"stem":96},"Models","\u002Fv1.x\u002Fguide\u002Fmodels","v1.x\u002F1.guide\u002F03.models",{"title":98,"path":99,"stem":100},"Relationships","\u002Fv1.x\u002Fguide\u002Frelationships","v1.x\u002F1.guide\u002F04.relationships",{"title":102,"path":103,"stem":104},"Hooks","\u002Fv1.x\u002Fguide\u002Fhooks","v1.x\u002F1.guide\u002F05.hooks",{"title":106,"path":107,"stem":108},"Search","\u002Fv1.x\u002Fguide\u002Fsearch","v1.x\u002F1.guide\u002F06.search",{"title":110,"path":111,"stem":112},"Batch Operations","\u002Fv1.x\u002Fguide\u002Fbatch-operations","v1.x\u002F1.guide\u002F07.batch-operations",{"title":114,"path":115,"stem":116},"Query Parameters","\u002Fv1.x\u002Fguide\u002Fquery-parameters","v1.x\u002F1.guide\u002F08.query-parameters",{"title":118,"path":119,"stem":120},"Security","\u002Fv1.x\u002Fguide\u002Fsecurity","v1.x\u002F1.guide\u002F09.security",{"title":122,"path":123,"stem":124},"Responses","\u002Fv1.x\u002Fguide\u002Fresponses","v1.x\u002F1.guide\u002F10.responses",{"title":56,"path":126,"stem":127,"children":128},"\u002Fv1.x\u002Ftypescript-sdk","v1.x\u002F2.typescript-sdk\u002F01.index",[129,130,133,137,140,143],{"title":88,"path":126,"stem":127},{"title":90,"path":131,"stem":132},"\u002Fv1.x\u002Ftypescript-sdk\u002Fgetting-started","v1.x\u002F2.typescript-sdk\u002F02.getting-started",{"title":134,"path":135,"stem":136},"Configuration","\u002Fv1.x\u002Ftypescript-sdk\u002Fconfiguration","v1.x\u002F2.typescript-sdk\u002F03.configuration",{"title":94,"path":138,"stem":139},"\u002Fv1.x\u002Ftypescript-sdk\u002Fmodels","v1.x\u002F2.typescript-sdk\u002F04.models",{"title":98,"path":141,"stem":142},"\u002Fv1.x\u002Ftypescript-sdk\u002Frelationships","v1.x\u002F2.typescript-sdk\u002F05.relationships",{"title":114,"path":144,"stem":145},"\u002Fv1.x\u002Ftypescript-sdk\u002Fquery-parameters","v1.x\u002F2.typescript-sdk\u002F06.query-parameters",{"id":147,"title":44,"body":148,"description":2194,"extension":2195,"links":2196,"meta":2197,"navigation":225,"path":45,"seo":2198,"stem":46,"__hash__":2199},"docs_zh\u002Fzh\u002F1.guide\u002F09.security.md",{"type":149,"value":150,"toc":2181},"minimark",[151,155,173,176,190,198,404,409,416,431,670,673,681,941,944,954,960,1134,1139,1444,1447,1465,1483,1493,1500,1683,1697,1736,1739,1749,1755,1774,1790,1984,2010,2013,2035,2047,2050,2059,2062,2065,2073,2090,2104,2107,2128,2138,2141,2150,2153,2163,2177],[152,153,154],"h2",{"id":154},"认证",[156,157,158,159,166,167,172],"p",{},"Orion 目前不提供任何认证功能，认证能力的搭建由开发者自行负责。我们推荐使用 ",[160,161,165],"a",{"href":162,"rel":163},"https:\u002F\u002Fgithub.com\u002Flaravel\u002Fpassport",[164],"nofollow","Laravel Passport"," 或 ",[160,168,171],{"href":169,"rel":170},"https:\u002F\u002Fgithub.com\u002Flaravel\u002Fsanctum",[164],"Laravel Sanctum"," 来实现这一目的。",[152,174,175],{"id":175},"授权",[156,177,178,180,181,183,184,189],{},[160,179,20],{"href":21},"控制器和",[160,182,24],{"href":25},"控制器都依赖",[160,185,188],{"href":186,"rel":187},"https:\u002F\u002Flaravel.com\u002Fdocs\u002Fauthorization#creating-policies",[164],"模型策略","来判断当前认证用户是否被允许执行某些操作。",[156,191,192,193,197],{},"虽然不建议这样做，但在某些情况下，你可能希望在特定控制器上禁用授权检查。为此，可以使用 ",[194,195,196],"code",{},"Orion\\Concerns\\DisableAuthorization"," trait。",[199,200,205],"pre",{"className":201,"code":202,"language":203,"meta":204,"style":204},"language-php shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003C?php\n\nnamespace App\\Http\\Controllers\\Api;\n\nuse App\\Models\\Post;\nuse Orion\\Concerns\\DisableAuthorization;\n\nclass PostsController extends ApiController\n{\n    use DisableAuthorization;\n\n    \u002F**\n     * @var string $model\n     *\u002F\n    protected $model = Post::class;\n}\n","php","",[194,206,207,220,227,257,262,281,301,306,322,328,339,344,351,367,373,398],{"__ignoreMap":204},[208,209,212,216],"span",{"class":210,"line":211},"line",1,[208,213,215],{"class":214},"sMK4o","\u003C?",[208,217,219],{"class":218},"sTEyZ","php\n",[208,221,223],{"class":210,"line":222},2,[208,224,226],{"emptyLinePlaceholder":225},true,"\n",[208,228,230,234,238,241,244,246,249,251,254],{"class":210,"line":229},3,[208,231,233],{"class":232},"sbssI","namespace",[208,235,237],{"class":236},"sBMFI"," App",[208,239,240],{"class":214},"\\",[208,242,243],{"class":236},"Http",[208,245,240],{"class":214},[208,247,248],{"class":236},"Controllers",[208,250,240],{"class":214},[208,252,253],{"class":236},"Api",[208,255,256],{"class":214},";\n",[208,258,260],{"class":210,"line":259},4,[208,261,226],{"emptyLinePlaceholder":225},[208,263,265,268,270,272,274,276,279],{"class":210,"line":264},5,[208,266,267],{"class":232},"use",[208,269,237],{"class":218},[208,271,240],{"class":214},[208,273,94],{"class":218},[208,275,240],{"class":214},[208,277,278],{"class":218},"Post",[208,280,256],{"class":214},[208,282,284,286,289,291,294,296,299],{"class":210,"line":283},6,[208,285,267],{"class":232},[208,287,288],{"class":218}," Orion",[208,290,240],{"class":214},[208,292,293],{"class":218},"Concerns",[208,295,240],{"class":214},[208,297,298],{"class":218},"DisableAuthorization",[208,300,256],{"class":214},[208,302,304],{"class":210,"line":303},7,[208,305,226],{"emptyLinePlaceholder":225},[208,307,309,313,316,319],{"class":210,"line":308},8,[208,310,312],{"class":311},"spNyl","class",[208,314,315],{"class":236}," PostsController",[208,317,318],{"class":311}," extends",[208,320,321],{"class":236}," ApiController\n",[208,323,325],{"class":210,"line":324},9,[208,326,327],{"class":214},"{\n",[208,329,331,334,337],{"class":210,"line":330},10,[208,332,333],{"class":232},"    use",[208,335,336],{"class":218}," DisableAuthorization",[208,338,256],{"class":214},[208,340,342],{"class":210,"line":341},11,[208,343,226],{"emptyLinePlaceholder":225},[208,345,347],{"class":210,"line":346},12,[208,348,350],{"class":349},"sHwdD","    \u002F**\n",[208,352,354,357,361,364],{"class":210,"line":353},13,[208,355,356],{"class":349},"     * ",[208,358,360],{"class":359},"svl4J","@var",[208,362,363],{"class":359}," string",[208,365,366],{"class":349}," $model\n",[208,368,370],{"class":210,"line":369},14,[208,371,372],{"class":349},"     *\u002F\n",[208,374,376,379,382,385,388,391,394,396],{"class":210,"line":375},15,[208,377,378],{"class":311},"    protected",[208,380,381],{"class":214}," $",[208,383,384],{"class":218},"model ",[208,386,387],{"class":214},"=",[208,389,390],{"class":236}," Post",[208,392,393],{"class":214},"::",[208,395,312],{"class":232},[208,397,256],{"class":214},[208,399,401],{"class":210,"line":400},16,[208,402,403],{"class":214},"}\n",[405,406,408],"h3",{"id":407},"配合-sanctum或其他自定义-auth-guard使用","配合 Sanctum（或其他自定义 Auth guard）使用",[156,410,411,412,415],{},"默认情况下，授权时使用 ",[194,413,414],{},"api"," guard 来解析当前认证用户。",[156,417,418,419,422,423,426,427,430],{},"不过，你可以通过在 ",[194,420,421],{},"config\u002Forion.php"," 中设置 ",[194,424,425],{},"auth.guard","，或在控制器上重写 ",[194,428,429],{},"resolveUser"," 方法，来改变用户的解析方式。",[199,432,434],{"className":201,"code":433,"language":203,"meta":204,"style":204},"\u003C?php\n\nnamespace App\\Http\\Controllers\\Api;\n\nuse App\\Models\\Post;\n\nclass PostsController extends ApiController\n{\n    \u002F**\n     * @var string $model\n     *\u002F\n    protected $model = Post::class;\n\n     \u002F**\n     * 基于守卫（guard）获取当前已认证的用户。\n     *\n     * @return \\Illuminate\\Contracts\\Auth\\Authenticatable|null\n     *\u002F\n    public function resolveUser()\n    {\n        return Auth::guard('sanctum')->user();\n    }\n}\n",[194,435,436,442,446,466,470,486,490,500,504,508,518,522,540,544,549,554,559,597,602,618,624,659,665],{"__ignoreMap":204},[208,437,438,440],{"class":210,"line":211},[208,439,215],{"class":214},[208,441,219],{"class":218},[208,443,444],{"class":210,"line":222},[208,445,226],{"emptyLinePlaceholder":225},[208,447,448,450,452,454,456,458,460,462,464],{"class":210,"line":229},[208,449,233],{"class":232},[208,451,237],{"class":236},[208,453,240],{"class":214},[208,455,243],{"class":236},[208,457,240],{"class":214},[208,459,248],{"class":236},[208,461,240],{"class":214},[208,463,253],{"class":236},[208,465,256],{"class":214},[208,467,468],{"class":210,"line":259},[208,469,226],{"emptyLinePlaceholder":225},[208,471,472,474,476,478,480,482,484],{"class":210,"line":264},[208,473,267],{"class":232},[208,475,237],{"class":218},[208,477,240],{"class":214},[208,479,94],{"class":218},[208,481,240],{"class":214},[208,483,278],{"class":218},[208,485,256],{"class":214},[208,487,488],{"class":210,"line":283},[208,489,226],{"emptyLinePlaceholder":225},[208,491,492,494,496,498],{"class":210,"line":303},[208,493,312],{"class":311},[208,495,315],{"class":236},[208,497,318],{"class":311},[208,499,321],{"class":236},[208,501,502],{"class":210,"line":308},[208,503,327],{"class":214},[208,505,506],{"class":210,"line":324},[208,507,350],{"class":349},[208,509,510,512,514,516],{"class":210,"line":330},[208,511,356],{"class":349},[208,513,360],{"class":359},[208,515,363],{"class":359},[208,517,366],{"class":349},[208,519,520],{"class":210,"line":341},[208,521,372],{"class":349},[208,523,524,526,528,530,532,534,536,538],{"class":210,"line":346},[208,525,378],{"class":311},[208,527,381],{"class":214},[208,529,384],{"class":218},[208,531,387],{"class":214},[208,533,390],{"class":236},[208,535,393],{"class":214},[208,537,312],{"class":232},[208,539,256],{"class":214},[208,541,542],{"class":210,"line":353},[208,543,226],{"emptyLinePlaceholder":225},[208,545,546],{"class":210,"line":369},[208,547,548],{"class":349},"     \u002F**\n",[208,550,551],{"class":210,"line":375},[208,552,553],{"class":349},"     * 基于守卫（guard）获取当前已认证的用户。\n",[208,555,556],{"class":210,"line":400},[208,557,558],{"class":349},"     *\n",[208,560,562,564,567,571,575,577,580,582,585,587,591,594],{"class":210,"line":561},17,[208,563,356],{"class":349},[208,565,566],{"class":359},"@return",[208,568,570],{"class":569},"s7zQu"," \\",[208,572,574],{"class":573},"sHdIc","Illuminate",[208,576,240],{"class":569},[208,578,579],{"class":573},"Contracts",[208,581,240],{"class":569},[208,583,584],{"class":573},"Auth",[208,586,240],{"class":569},[208,588,590],{"class":589},"sFweD","Authenticatable",[208,592,593],{"class":569},"|",[208,595,596],{"class":359},"null\n",[208,598,600],{"class":210,"line":599},18,[208,601,372],{"class":349},[208,603,605,608,611,615],{"class":210,"line":604},19,[208,606,607],{"class":311},"    public",[208,609,610],{"class":311}," function",[208,612,614],{"class":613},"s2Zo4"," resolveUser",[208,616,617],{"class":214},"()\n",[208,619,621],{"class":210,"line":620},20,[208,622,623],{"class":214},"    {\n",[208,625,627,630,633,635,638,641,644,648,650,653,656],{"class":210,"line":626},21,[208,628,629],{"class":569},"        return",[208,631,632],{"class":236}," Auth",[208,634,393],{"class":214},[208,636,637],{"class":613},"guard",[208,639,640],{"class":214},"(",[208,642,643],{"class":214},"'",[208,645,647],{"class":646},"sfazB","sanctum",[208,649,643],{"class":214},[208,651,652],{"class":214},")->",[208,654,655],{"class":613},"user",[208,657,658],{"class":214},"();\n",[208,660,662],{"class":210,"line":661},22,[208,663,664],{"class":214},"    }\n",[208,666,668],{"class":210,"line":667},23,[208,669,403],{"class":214},[405,671,672],{"id":672},"授权父实体",[156,674,675,676,680],{},"关联操作会向策略传递一个额外参数——父实体。你可以利用该参数设置额外的检查，判断用户是否被授权",[677,678,679],"em",{},"在给定父实体的上下文中","对关联实体执行某些操作。",[199,682,684],{"className":201,"code":683,"language":203,"meta":204,"style":204},"class PostPolicy\n{\n    public function update($user, $post)\n    {\n        return $post->user_id === $user->id;\n    }\n}\n\nclass PostMetaPolicy\n{\n    public function update($user, $postMeta, $post) \u002F\u002F \u003C---- 这里的 $post 是父实体\n    {\n        \u002F\u002F 请注意，此检查是针对父实体 $post 执行的，\n        \u002F\u002F 而不是关联实体 $postMeta\n        return Gate::forUser($user)->inspect('update', $post); \n    }\n    \n    public function create($user, $post)\n    {\n        return Gate::forUser($user)->inspect('update', $post);\n    }\n}\n",[194,685,686,693,697,722,726,754,758,762,766,773,777,808,812,817,822,864,868,873,894,898,933,937],{"__ignoreMap":204},[208,687,688,690],{"class":210,"line":211},[208,689,312],{"class":311},[208,691,692],{"class":236}," PostPolicy\n",[208,694,695],{"class":210,"line":222},[208,696,327],{"class":214},[208,698,699,701,703,706,709,711,714,716,719],{"class":210,"line":229},[208,700,607],{"class":311},[208,702,610],{"class":311},[208,704,705],{"class":613}," update",[208,707,708],{"class":214},"($",[208,710,655],{"class":218},[208,712,713],{"class":214},",",[208,715,381],{"class":214},[208,717,718],{"class":218},"post",[208,720,721],{"class":214},")\n",[208,723,724],{"class":210,"line":259},[208,725,623],{"class":214},[208,727,728,730,732,734,737,740,743,745,747,749,752],{"class":210,"line":264},[208,729,629],{"class":569},[208,731,381],{"class":214},[208,733,718],{"class":218},[208,735,736],{"class":214},"->",[208,738,739],{"class":218},"user_id ",[208,741,742],{"class":214},"===",[208,744,381],{"class":214},[208,746,655],{"class":218},[208,748,736],{"class":214},[208,750,751],{"class":218},"id",[208,753,256],{"class":214},[208,755,756],{"class":210,"line":283},[208,757,664],{"class":214},[208,759,760],{"class":210,"line":303},[208,761,403],{"class":214},[208,763,764],{"class":210,"line":308},[208,765,226],{"emptyLinePlaceholder":225},[208,767,768,770],{"class":210,"line":324},[208,769,312],{"class":311},[208,771,772],{"class":236}," PostMetaPolicy\n",[208,774,775],{"class":210,"line":330},[208,776,327],{"class":214},[208,778,779,781,783,785,787,789,791,793,796,798,800,802,805],{"class":210,"line":341},[208,780,607],{"class":311},[208,782,610],{"class":311},[208,784,705],{"class":613},[208,786,708],{"class":214},[208,788,655],{"class":218},[208,790,713],{"class":214},[208,792,381],{"class":214},[208,794,795],{"class":218},"postMeta",[208,797,713],{"class":214},[208,799,381],{"class":214},[208,801,718],{"class":218},[208,803,804],{"class":214},")",[208,806,807],{"class":349}," \u002F\u002F \u003C---- 这里的 $post 是父实体\n",[208,809,810],{"class":210,"line":346},[208,811,623],{"class":214},[208,813,814],{"class":210,"line":353},[208,815,816],{"class":349},"        \u002F\u002F 请注意，此检查是针对父实体 $post 执行的，\n",[208,818,819],{"class":210,"line":369},[208,820,821],{"class":349},"        \u002F\u002F 而不是关联实体 $postMeta\n",[208,823,824,826,829,831,834,836,838,840,843,845,847,850,852,854,856,858,861],{"class":210,"line":375},[208,825,629],{"class":569},[208,827,828],{"class":236}," Gate",[208,830,393],{"class":214},[208,832,833],{"class":613},"forUser",[208,835,708],{"class":214},[208,837,655],{"class":218},[208,839,652],{"class":214},[208,841,842],{"class":613},"inspect",[208,844,640],{"class":214},[208,846,643],{"class":214},[208,848,849],{"class":646},"update",[208,851,643],{"class":214},[208,853,713],{"class":214},[208,855,381],{"class":214},[208,857,718],{"class":218},[208,859,860],{"class":214},");",[208,862,863],{"class":218}," \n",[208,865,866],{"class":210,"line":400},[208,867,664],{"class":214},[208,869,870],{"class":210,"line":561},[208,871,872],{"class":218},"    \n",[208,874,875,877,879,882,884,886,888,890,892],{"class":210,"line":599},[208,876,607],{"class":311},[208,878,610],{"class":311},[208,880,881],{"class":613}," create",[208,883,708],{"class":214},[208,885,655],{"class":218},[208,887,713],{"class":214},[208,889,381],{"class":214},[208,891,718],{"class":218},[208,893,721],{"class":214},[208,895,896],{"class":210,"line":604},[208,897,623],{"class":214},[208,899,900,902,904,906,908,910,912,914,916,918,920,922,924,926,928,930],{"class":210,"line":620},[208,901,629],{"class":569},[208,903,828],{"class":236},[208,905,393],{"class":214},[208,907,833],{"class":613},[208,909,708],{"class":214},[208,911,655],{"class":218},[208,913,652],{"class":214},[208,915,842],{"class":613},[208,917,640],{"class":214},[208,919,643],{"class":214},[208,921,849],{"class":646},[208,923,643],{"class":214},[208,925,713],{"class":214},[208,927,381],{"class":214},[208,929,718],{"class":218},[208,931,932],{"class":214},");\n",[208,934,935],{"class":210,"line":626},[208,936,664],{"class":214},[208,938,939],{"class":210,"line":661},[208,940,403],{"class":214},[405,942,943],{"id":943},"自定义策略类",[156,945,946,947,166,950,953],{},"同一模型在不同控制器或场景中使用不同的授权规则是很常见的。默认情况下，策略由 Laravel 通过其内置机制解析。不过，如果你希望为某个控制器使用特定的策略，请相应地设置 ",[194,948,949],{},"protected $policy",[194,951,952],{},"protected $parentPolicy"," 变量：",[156,955,956],{},[957,958,959],"strong",{},"模型控制器",[199,961,963],{"className":201,"code":962,"language":203,"meta":204,"style":204},"\u003C?php\n\nnamespace App\\Http\\Controllers\\Api;\n\nuse App\\Models\\Post;\nuse App\\Policies\\CustomPostPolicy;\n\nclass PostsController extends ApiController\n{\n    \u002F**\n     * @var string $model\n     *\u002F\n    protected $model = Post::class;\n\n    \u002F**\n     * @var string $policy\n     *\u002F\n    protected $policy = CustomPostPolicy::class;\n}\n",[194,964,965,971,975,995,999,1015,1033,1037,1047,1051,1055,1065,1069,1087,1091,1095,1106,1110,1130],{"__ignoreMap":204},[208,966,967,969],{"class":210,"line":211},[208,968,215],{"class":214},[208,970,219],{"class":218},[208,972,973],{"class":210,"line":222},[208,974,226],{"emptyLinePlaceholder":225},[208,976,977,979,981,983,985,987,989,991,993],{"class":210,"line":229},[208,978,233],{"class":232},[208,980,237],{"class":236},[208,982,240],{"class":214},[208,984,243],{"class":236},[208,986,240],{"class":214},[208,988,248],{"class":236},[208,990,240],{"class":214},[208,992,253],{"class":236},[208,994,256],{"class":214},[208,996,997],{"class":210,"line":259},[208,998,226],{"emptyLinePlaceholder":225},[208,1000,1001,1003,1005,1007,1009,1011,1013],{"class":210,"line":264},[208,1002,267],{"class":232},[208,1004,237],{"class":218},[208,1006,240],{"class":214},[208,1008,94],{"class":218},[208,1010,240],{"class":214},[208,1012,278],{"class":218},[208,1014,256],{"class":214},[208,1016,1017,1019,1021,1023,1026,1028,1031],{"class":210,"line":283},[208,1018,267],{"class":232},[208,1020,237],{"class":218},[208,1022,240],{"class":214},[208,1024,1025],{"class":218},"Policies",[208,1027,240],{"class":214},[208,1029,1030],{"class":218},"CustomPostPolicy",[208,1032,256],{"class":214},[208,1034,1035],{"class":210,"line":303},[208,1036,226],{"emptyLinePlaceholder":225},[208,1038,1039,1041,1043,1045],{"class":210,"line":308},[208,1040,312],{"class":311},[208,1042,315],{"class":236},[208,1044,318],{"class":311},[208,1046,321],{"class":236},[208,1048,1049],{"class":210,"line":324},[208,1050,327],{"class":214},[208,1052,1053],{"class":210,"line":330},[208,1054,350],{"class":349},[208,1056,1057,1059,1061,1063],{"class":210,"line":341},[208,1058,356],{"class":349},[208,1060,360],{"class":359},[208,1062,363],{"class":359},[208,1064,366],{"class":349},[208,1066,1067],{"class":210,"line":346},[208,1068,372],{"class":349},[208,1070,1071,1073,1075,1077,1079,1081,1083,1085],{"class":210,"line":353},[208,1072,378],{"class":311},[208,1074,381],{"class":214},[208,1076,384],{"class":218},[208,1078,387],{"class":214},[208,1080,390],{"class":236},[208,1082,393],{"class":214},[208,1084,312],{"class":232},[208,1086,256],{"class":214},[208,1088,1089],{"class":210,"line":369},[208,1090,226],{"emptyLinePlaceholder":225},[208,1092,1093],{"class":210,"line":375},[208,1094,350],{"class":349},[208,1096,1097,1099,1101,1103],{"class":210,"line":400},[208,1098,356],{"class":349},[208,1100,360],{"class":359},[208,1102,363],{"class":359},[208,1104,1105],{"class":349}," $policy\n",[208,1107,1108],{"class":210,"line":561},[208,1109,372],{"class":349},[208,1111,1112,1114,1116,1119,1121,1124,1126,1128],{"class":210,"line":599},[208,1113,378],{"class":311},[208,1115,381],{"class":214},[208,1117,1118],{"class":218},"policy ",[208,1120,387],{"class":214},[208,1122,1123],{"class":236}," CustomPostPolicy",[208,1125,393],{"class":214},[208,1127,312],{"class":232},[208,1129,256],{"class":214},[208,1131,1132],{"class":210,"line":604},[208,1133,403],{"class":214},[156,1135,1136],{},[957,1137,1138],{},"关联控制器",[199,1140,1142],{"className":201,"code":1141,"language":203,"meta":204,"style":204},"\u003C?php\n\nnamespace App\\Http\\Controllers\\Api;\n\nuse App\\Models\\Team;\nuse App\\Policies\\CustomPostPolicy;\nuse App\\Policies\\CustomTeamPolicy;\nuse Orion\\Http\\Controllers\\RelationController;\n\nclass TeamPostsController extends RelationController\n{\n     \u002F**\n     * @var string $model\n     *\u002F\n    protected $model = Team::class; \u002F\u002F 或 \"App\\Models\\Team\"\n    \n    \u002F**\n     * 在 Post 模型上定义的关联名称\n     *\u002F\n    protected $relation = 'posts';\n\n    \u002F**\n     * @var string $parentPolicy\n     *\u002F\n    protected $parentPolicy = CustomTeamPolicy::class;\n\n   \u002F**\n     * @var string $policy\n     *\u002F\n    protected $policy = CustomPostPolicy::class;\n}\n",[194,1143,1144,1150,1154,1174,1178,1195,1211,1228,1249,1253,1265,1269,1273,1283,1287,1310,1314,1318,1323,1327,1348,1352,1356,1367,1372,1393,1398,1404,1415,1420,1439],{"__ignoreMap":204},[208,1145,1146,1148],{"class":210,"line":211},[208,1147,215],{"class":214},[208,1149,219],{"class":218},[208,1151,1152],{"class":210,"line":222},[208,1153,226],{"emptyLinePlaceholder":225},[208,1155,1156,1158,1160,1162,1164,1166,1168,1170,1172],{"class":210,"line":229},[208,1157,233],{"class":232},[208,1159,237],{"class":236},[208,1161,240],{"class":214},[208,1163,243],{"class":236},[208,1165,240],{"class":214},[208,1167,248],{"class":236},[208,1169,240],{"class":214},[208,1171,253],{"class":236},[208,1173,256],{"class":214},[208,1175,1176],{"class":210,"line":259},[208,1177,226],{"emptyLinePlaceholder":225},[208,1179,1180,1182,1184,1186,1188,1190,1193],{"class":210,"line":264},[208,1181,267],{"class":232},[208,1183,237],{"class":218},[208,1185,240],{"class":214},[208,1187,94],{"class":218},[208,1189,240],{"class":214},[208,1191,1192],{"class":218},"Team",[208,1194,256],{"class":214},[208,1196,1197,1199,1201,1203,1205,1207,1209],{"class":210,"line":283},[208,1198,267],{"class":232},[208,1200,237],{"class":218},[208,1202,240],{"class":214},[208,1204,1025],{"class":218},[208,1206,240],{"class":214},[208,1208,1030],{"class":218},[208,1210,256],{"class":214},[208,1212,1213,1215,1217,1219,1221,1223,1226],{"class":210,"line":303},[208,1214,267],{"class":232},[208,1216,237],{"class":218},[208,1218,240],{"class":214},[208,1220,1025],{"class":218},[208,1222,240],{"class":214},[208,1224,1225],{"class":218},"CustomTeamPolicy",[208,1227,256],{"class":214},[208,1229,1230,1232,1234,1236,1238,1240,1242,1244,1247],{"class":210,"line":308},[208,1231,267],{"class":232},[208,1233,288],{"class":218},[208,1235,240],{"class":214},[208,1237,243],{"class":218},[208,1239,240],{"class":214},[208,1241,248],{"class":218},[208,1243,240],{"class":214},[208,1245,1246],{"class":218},"RelationController",[208,1248,256],{"class":214},[208,1250,1251],{"class":210,"line":324},[208,1252,226],{"emptyLinePlaceholder":225},[208,1254,1255,1257,1260,1262],{"class":210,"line":330},[208,1256,312],{"class":311},[208,1258,1259],{"class":236}," TeamPostsController",[208,1261,318],{"class":311},[208,1263,1264],{"class":236}," RelationController\n",[208,1266,1267],{"class":210,"line":341},[208,1268,327],{"class":214},[208,1270,1271],{"class":210,"line":346},[208,1272,548],{"class":349},[208,1274,1275,1277,1279,1281],{"class":210,"line":353},[208,1276,356],{"class":349},[208,1278,360],{"class":359},[208,1280,363],{"class":359},[208,1282,366],{"class":349},[208,1284,1285],{"class":210,"line":369},[208,1286,372],{"class":349},[208,1288,1289,1291,1293,1295,1297,1300,1302,1304,1307],{"class":210,"line":375},[208,1290,378],{"class":311},[208,1292,381],{"class":214},[208,1294,384],{"class":218},[208,1296,387],{"class":214},[208,1298,1299],{"class":236}," Team",[208,1301,393],{"class":214},[208,1303,312],{"class":232},[208,1305,1306],{"class":214},";",[208,1308,1309],{"class":349}," \u002F\u002F 或 \"App\\Models\\Team\"\n",[208,1311,1312],{"class":210,"line":400},[208,1313,872],{"class":218},[208,1315,1316],{"class":210,"line":561},[208,1317,350],{"class":349},[208,1319,1320],{"class":210,"line":599},[208,1321,1322],{"class":349},"     * 在 Post 模型上定义的关联名称\n",[208,1324,1325],{"class":210,"line":604},[208,1326,372],{"class":349},[208,1328,1329,1331,1333,1336,1338,1341,1344,1346],{"class":210,"line":620},[208,1330,378],{"class":311},[208,1332,381],{"class":214},[208,1334,1335],{"class":218},"relation ",[208,1337,387],{"class":214},[208,1339,1340],{"class":214}," '",[208,1342,1343],{"class":646},"posts",[208,1345,643],{"class":214},[208,1347,256],{"class":214},[208,1349,1350],{"class":210,"line":626},[208,1351,226],{"emptyLinePlaceholder":225},[208,1353,1354],{"class":210,"line":661},[208,1355,350],{"class":349},[208,1357,1358,1360,1362,1364],{"class":210,"line":667},[208,1359,356],{"class":349},[208,1361,360],{"class":359},[208,1363,363],{"class":359},[208,1365,1366],{"class":349}," $parentPolicy\n",[208,1368,1370],{"class":210,"line":1369},24,[208,1371,372],{"class":349},[208,1373,1375,1377,1379,1382,1384,1387,1389,1391],{"class":210,"line":1374},25,[208,1376,378],{"class":311},[208,1378,381],{"class":214},[208,1380,1381],{"class":218},"parentPolicy ",[208,1383,387],{"class":214},[208,1385,1386],{"class":236}," CustomTeamPolicy",[208,1388,393],{"class":214},[208,1390,312],{"class":232},[208,1392,256],{"class":214},[208,1394,1396],{"class":210,"line":1395},26,[208,1397,226],{"emptyLinePlaceholder":225},[208,1399,1401],{"class":210,"line":1400},27,[208,1402,1403],{"class":349},"   \u002F**\n",[208,1405,1407,1409,1411,1413],{"class":210,"line":1406},28,[208,1408,356],{"class":349},[208,1410,360],{"class":359},[208,1412,363],{"class":359},[208,1414,1105],{"class":349},[208,1416,1418],{"class":210,"line":1417},29,[208,1419,372],{"class":349},[208,1421,1423,1425,1427,1429,1431,1433,1435,1437],{"class":210,"line":1422},30,[208,1424,378],{"class":311},[208,1426,381],{"class":214},[208,1428,1118],{"class":218},[208,1430,387],{"class":214},[208,1432,1123],{"class":236},[208,1434,393],{"class":214},[208,1436,312],{"class":232},[208,1438,256],{"class":214},[208,1440,1442],{"class":210,"line":1441},31,[208,1443,403],{"class":214},[152,1445,1446],{"id":1446},"验证",[1448,1449,1450],"warning",{},[156,1451,1452,1453,1456,1457,1460,1461,1464],{},"请求类",[957,1454,1455],{},"必须","继承 ",[194,1458,1459],{},"Orion\\Http\\Requests\\Request"," 类，而不是 ",[194,1462,1463],{},"Illuminate\\Foundation\\Http\\FormRequest","。",[156,1466,1467,1468,1471,1472,1474,1475,1478,1479,1464],{},"为了验证发送到 ",[194,1469,1470],{},"store"," 和 ",[194,1473,849],{}," 端点的请求数据，Orion 会按照类名模式 ",[194,1476,1477],{},"App\\Http\\Requests\\\u003Cmodel>Request"," 查找资源模型对应的",[160,1480,1452],{"href":1481,"rel":1482},"https:\u002F\u002Flaravel.com\u002Fdocs\u002Fvalidation#form-request-validation",[164],[156,1484,1485,1486,1489,1490,1464],{},"例如，如果你有一个 ",[194,1487,1488],{},"App\\Models\\Message"," 模型，对应的请求类就是 ",[194,1491,1492],{},"App\\Http\\Requests\\MessageRequest",[156,1494,1495,1496,1499],{},"如果你的应用中请求类的命名不遵循这一约定，或者你只是想更明确地指定，可以将控制器上的 ",[194,1497,1498],{},"protected $request"," 属性设置为请求类的完全限定类名。",[199,1501,1503],{"className":201,"code":1502,"language":203,"meta":204,"style":204},"\u003C?php\n\nnamespace App\\Http\\Controllers\\Api;\n\nuse App\\Models\\Message;\nuse App\\Http\\Requests\\CustomMessageRequest;\n\nclass MessagesController extends ApiController\n{\n    \u002F**\n     * @var string $model\n     *\u002F\n    protected $model = Message::class;\n\n    \u002F**\n    * @var string $request\n    *\u002F\n    protected $request = CustomMessageRequest::class;\n}\n",[194,1504,1505,1511,1515,1535,1539,1556,1578,1582,1593,1597,1601,1611,1615,1634,1638,1642,1654,1659,1679],{"__ignoreMap":204},[208,1506,1507,1509],{"class":210,"line":211},[208,1508,215],{"class":214},[208,1510,219],{"class":218},[208,1512,1513],{"class":210,"line":222},[208,1514,226],{"emptyLinePlaceholder":225},[208,1516,1517,1519,1521,1523,1525,1527,1529,1531,1533],{"class":210,"line":229},[208,1518,233],{"class":232},[208,1520,237],{"class":236},[208,1522,240],{"class":214},[208,1524,243],{"class":236},[208,1526,240],{"class":214},[208,1528,248],{"class":236},[208,1530,240],{"class":214},[208,1532,253],{"class":236},[208,1534,256],{"class":214},[208,1536,1537],{"class":210,"line":259},[208,1538,226],{"emptyLinePlaceholder":225},[208,1540,1541,1543,1545,1547,1549,1551,1554],{"class":210,"line":264},[208,1542,267],{"class":232},[208,1544,237],{"class":218},[208,1546,240],{"class":214},[208,1548,94],{"class":218},[208,1550,240],{"class":214},[208,1552,1553],{"class":218},"Message",[208,1555,256],{"class":214},[208,1557,1558,1560,1562,1564,1566,1568,1571,1573,1576],{"class":210,"line":283},[208,1559,267],{"class":232},[208,1561,237],{"class":218},[208,1563,240],{"class":214},[208,1565,243],{"class":218},[208,1567,240],{"class":214},[208,1569,1570],{"class":218},"Requests",[208,1572,240],{"class":214},[208,1574,1575],{"class":218},"CustomMessageRequest",[208,1577,256],{"class":214},[208,1579,1580],{"class":210,"line":303},[208,1581,226],{"emptyLinePlaceholder":225},[208,1583,1584,1586,1589,1591],{"class":210,"line":308},[208,1585,312],{"class":311},[208,1587,1588],{"class":236}," MessagesController",[208,1590,318],{"class":311},[208,1592,321],{"class":236},[208,1594,1595],{"class":210,"line":324},[208,1596,327],{"class":214},[208,1598,1599],{"class":210,"line":330},[208,1600,350],{"class":349},[208,1602,1603,1605,1607,1609],{"class":210,"line":341},[208,1604,356],{"class":349},[208,1606,360],{"class":359},[208,1608,363],{"class":359},[208,1610,366],{"class":349},[208,1612,1613],{"class":210,"line":346},[208,1614,372],{"class":349},[208,1616,1617,1619,1621,1623,1625,1628,1630,1632],{"class":210,"line":353},[208,1618,378],{"class":311},[208,1620,381],{"class":214},[208,1622,384],{"class":218},[208,1624,387],{"class":214},[208,1626,1627],{"class":236}," Message",[208,1629,393],{"class":214},[208,1631,312],{"class":232},[208,1633,256],{"class":214},[208,1635,1636],{"class":210,"line":369},[208,1637,226],{"emptyLinePlaceholder":225},[208,1639,1640],{"class":210,"line":375},[208,1641,350],{"class":349},[208,1643,1644,1647,1649,1651],{"class":210,"line":400},[208,1645,1646],{"class":349},"    * ",[208,1648,360],{"class":359},[208,1650,363],{"class":359},[208,1652,1653],{"class":349}," $request\n",[208,1655,1656],{"class":210,"line":561},[208,1657,1658],{"class":349},"    *\u002F\n",[208,1660,1661,1663,1665,1668,1670,1673,1675,1677],{"class":210,"line":599},[208,1662,378],{"class":311},[208,1664,381],{"class":214},[208,1666,1667],{"class":218},"request ",[208,1669,387],{"class":214},[208,1671,1672],{"class":236}," CustomMessageRequest",[208,1674,393],{"class":214},[208,1676,312],{"class":232},[208,1678,256],{"class":214},[208,1680,1681],{"class":210,"line":604},[208,1682,403],{"class":214},[156,1684,1685,1686,1691,1692,1471,1694,1696],{},"随后，请求类会通过 Laravel 的",[160,1687,1690],{"href":1688,"rel":1689},"https:\u002F\u002Flaravel.com\u002Fdocs\u002Fcontainer",[164],"服务容器","进行绑定，并在 ",[194,1693,1470],{},[194,1695,849],{}," 方法中用于验证请求数据，效果与在方法签名中显式声明完全相同：",[199,1698,1700],{"className":201,"code":1699,"language":203,"meta":204,"style":204},"public function store(CustomMessageRequest $request)\n{\n    ...\n}\n",[194,1701,1702,1723,1727,1732],{"__ignoreMap":204},[208,1703,1704,1707,1709,1712,1714,1716,1718,1721],{"class":210,"line":211},[208,1705,1706],{"class":311},"public",[208,1708,610],{"class":311},[208,1710,1711],{"class":613}," store",[208,1713,640],{"class":214},[208,1715,1575],{"class":236},[208,1717,381],{"class":214},[208,1719,1720],{"class":218},"request",[208,1722,721],{"class":214},[208,1724,1725],{"class":210,"line":222},[208,1726,327],{"class":214},[208,1728,1729],{"class":210,"line":229},[208,1730,1731],{"class":214},"    ...\n",[208,1733,1734],{"class":210,"line":259},[208,1735,403],{"class":214},[405,1737,1738],{"id":1738},"验证规则",[1740,1741,1743,1744,1471,1746,1748],"h4",{"id":1742},"为-store-和-update-操作定义规则","为 ",[194,1745,1470],{},[194,1747,849],{}," 操作定义规则",[156,1750,1751,1752,1754],{},"Orion 提供了 ",[194,1753,1459],{}," 类，其中包含一系列用于指定验证规则的方法。",[156,1756,1757,1758,1471,1760,1762,1763,1766,1767,1471,1770,1773],{},"要为 ",[194,1759,1470],{},[194,1761,849],{}," 两个端点定义共用规则，可以使用 ",[194,1764,1765],{},"commonRules"," 方法。\n如果你想定义特定于某个端点的规则，可以使用 ",[194,1768,1769],{},"storeRules",[194,1771,1772],{},"updateRules"," 方法。",[1448,1775,1776],{},[156,1777,1778,1779,1471,1781,1783,1784,1786,1787,1789],{},"如果 ",[194,1780,1769],{},[194,1782,1772],{}," 方法与 ",[194,1785,1765],{}," 方法中包含相同的键，则前者中为该字段指定的规则会覆盖 ",[194,1788,1765],{}," 方法中的规则。",[199,1791,1793],{"className":201,"code":1792,"language":203,"meta":204,"style":204},"\u003C?php\n\nnamespace App\\Http\\Requests;\n\nuse Orion\\Http\\Requests\\Request;\n\nclass PostRequest extends Request\n{\n    public function commonRules() : array\n    {\n        return [\n            'title' => 'required'\n        ];\n    }\n\n    public function storeRules() : array\n    {\n        return [\n            'status' => 'required|in:draft,review'\n        ];\n    }\n}\n",[194,1794,1795,1801,1805,1821,1825,1846,1850,1862,1866,1884,1888,1895,1916,1921,1925,1929,1944,1948,1954,1972,1976,1980],{"__ignoreMap":204},[208,1796,1797,1799],{"class":210,"line":211},[208,1798,215],{"class":214},[208,1800,219],{"class":218},[208,1802,1803],{"class":210,"line":222},[208,1804,226],{"emptyLinePlaceholder":225},[208,1806,1807,1809,1811,1813,1815,1817,1819],{"class":210,"line":229},[208,1808,233],{"class":232},[208,1810,237],{"class":236},[208,1812,240],{"class":214},[208,1814,243],{"class":236},[208,1816,240],{"class":214},[208,1818,1570],{"class":236},[208,1820,256],{"class":214},[208,1822,1823],{"class":210,"line":259},[208,1824,226],{"emptyLinePlaceholder":225},[208,1826,1827,1829,1831,1833,1835,1837,1839,1841,1844],{"class":210,"line":264},[208,1828,267],{"class":232},[208,1830,288],{"class":218},[208,1832,240],{"class":214},[208,1834,243],{"class":218},[208,1836,240],{"class":214},[208,1838,1570],{"class":218},[208,1840,240],{"class":214},[208,1842,1843],{"class":218},"Request",[208,1845,256],{"class":214},[208,1847,1848],{"class":210,"line":283},[208,1849,226],{"emptyLinePlaceholder":225},[208,1851,1852,1854,1857,1859],{"class":210,"line":303},[208,1853,312],{"class":311},[208,1855,1856],{"class":236}," PostRequest",[208,1858,318],{"class":311},[208,1860,1861],{"class":236}," Request\n",[208,1863,1864],{"class":210,"line":308},[208,1865,327],{"class":214},[208,1867,1868,1870,1872,1875,1878,1881],{"class":210,"line":324},[208,1869,607],{"class":311},[208,1871,610],{"class":311},[208,1873,1874],{"class":613}," commonRules",[208,1876,1877],{"class":214},"()",[208,1879,1880],{"class":214}," :",[208,1882,1883],{"class":232}," array\n",[208,1885,1886],{"class":210,"line":330},[208,1887,623],{"class":214},[208,1889,1890,1892],{"class":210,"line":341},[208,1891,629],{"class":569},[208,1893,1894],{"class":214}," [\n",[208,1896,1897,1900,1903,1905,1908,1910,1913],{"class":210,"line":346},[208,1898,1899],{"class":214},"            '",[208,1901,1902],{"class":646},"title",[208,1904,643],{"class":214},[208,1906,1907],{"class":214}," =>",[208,1909,1340],{"class":214},[208,1911,1912],{"class":646},"required",[208,1914,1915],{"class":214},"'\n",[208,1917,1918],{"class":210,"line":353},[208,1919,1920],{"class":214},"        ];\n",[208,1922,1923],{"class":210,"line":369},[208,1924,664],{"class":214},[208,1926,1927],{"class":210,"line":375},[208,1928,226],{"emptyLinePlaceholder":225},[208,1930,1931,1933,1935,1938,1940,1942],{"class":210,"line":400},[208,1932,607],{"class":311},[208,1934,610],{"class":311},[208,1936,1937],{"class":613}," storeRules",[208,1939,1877],{"class":214},[208,1941,1880],{"class":214},[208,1943,1883],{"class":232},[208,1945,1946],{"class":210,"line":561},[208,1947,623],{"class":214},[208,1949,1950,1952],{"class":210,"line":599},[208,1951,629],{"class":569},[208,1953,1894],{"class":214},[208,1955,1956,1958,1961,1963,1965,1967,1970],{"class":210,"line":604},[208,1957,1899],{"class":214},[208,1959,1960],{"class":646},"status",[208,1962,643],{"class":214},[208,1964,1907],{"class":214},[208,1966,1340],{"class":214},[208,1968,1969],{"class":646},"required|in:draft,review",[208,1971,1915],{"class":214},[208,1973,1974],{"class":210,"line":620},[208,1975,1920],{"class":214},[208,1977,1978],{"class":210,"line":626},[208,1979,664],{"class":214},[208,1981,1982],{"class":210,"line":661},[208,1983,403],{"class":214},[156,1985,1986,1987,1989,1990,1471,1992,1994,1995,1997,1998,2000,2001,2003,2004,2006,2007,2009],{},"在这个示例中，当请求发送到 ",[194,1988,1470],{}," 端点时，",[194,1991,1902],{},[194,1993,1960],{}," 两个字段都是必填的。而当请求发送到 ",[194,1996,849],{}," 端点时，只有 ",[194,1999,1902],{}," 字段是必填的，因为 ",[194,2002,1772],{}," 方法中没有定义其他规则，而 ",[194,2005,1902],{}," 字段在 ",[194,2008,1765],{}," 方法中被标记为必填。",[1740,2011,2012],{"id":2012},"为关联专属操作定义规则",[156,2014,2015,2016,2019,2020,2019,2023,2019,2026,2019,2029,2019,2032,1464],{},"你还可以为关联专属端点定义规则：",[194,2017,2018],{},"associateRules","、",[194,2021,2022],{},"attachRules",[194,2024,2025],{},"detachRules",[194,2027,2028],{},"syncRules",[194,2030,2031],{},"toggleRules",[194,2033,2034],{},"updatePivotRules",[1448,2036,2037],{},[156,2038,2039,2040,2043,2044,2046],{},"在这些方法中指定的规则",[957,2041,2042],{},"不会","与 ",[194,2045,1765],{}," 方法中的规则合并。",[1740,2048,2049],{"id":2049},"为批量操作定义规则",[156,2051,2052,2053,2019,2056,1464],{},"你还可以为批量端点定义规则：",[194,2054,2055],{},"batchStoreRules",[194,2057,2058],{},"batchUpdateRules",[405,2060,2061],{"id":2061},"验证消息",[156,2063,2064],{},"就像可以为特定端点配置规则一样，也可以自定义它们的验证消息。",[1740,2066,1743,2068,1471,2070,2072],{"id":2067},"为-store-和-update-操作自定义验证消息",[194,2069,1470],{},[194,2071,849],{}," 操作自定义验证消息",[156,2074,1757,2075,1471,2077,2079,2080,2083,2084,1471,2087,1773],{},[194,2076,1470],{},[194,2078,849],{}," 两个端点定义共用消息，可以使用 ",[194,2081,2082],{},"commonMessages"," 方法。\n如果你想定义特定于某个端点的消息，可以使用 ",[194,2085,2086],{},"storeMessages",[194,2088,2089],{},"updateMessages",[1448,2091,2092],{},[156,2093,1778,2094,1471,2096,1783,2098,2100,2101,2103],{},[194,2095,2086],{},[194,2097,2089],{},[194,2099,2082],{}," 方法中包含相同的键，则前者中为该字段指定的消息会覆盖 ",[194,2102,2082],{}," 方法中的消息。",[1740,2105,2106],{"id":2106},"为关联专属操作自定义验证消息",[156,2108,2109,2110,2019,2113,2019,2116,2019,2119,2019,2122,2019,2125,1464],{},"你还可以为关联专属端点自定义消息：",[194,2111,2112],{},"associateMessages",[194,2114,2115],{},"attachMessages",[194,2117,2118],{},"detachMessages",[194,2120,2121],{},"syncMessages",[194,2123,2124],{},"toggleMessages",[194,2126,2127],{},"updatePivotMessages",[1448,2129,2130],{},[156,2131,2132,2133,2043,2135,2137],{},"在这些方法中指定的消息",[957,2134,2042],{},[194,2136,2082],{}," 方法中的消息合并。",[1740,2139,2140],{"id":2140},"为批量操作自定义验证消息",[156,2142,2143,2144,2019,2147,1464],{},"你还可以为批量端点自定义消息：",[194,2145,2146],{},"batchStoreMessages",[194,2148,2149],{},"batchUpdateMessages",[405,2151,2152],{"id":2152},"获取请求数据",[156,2154,2155,2156,2159,2160,1773],{},"默认情况下，在存储或更新实体时，会获取",[677,2157,2158],{},"全部","请求数据并传入模型的 ",[194,2161,2162],{},"fill",[156,2164,2165,2166,2169,2170,2173,2174,1464],{},"不过，也可以只传入已验证的数据。为此，请在 ",[194,2167,2168],{},"orion.php"," 配置文件中将 ",[194,2171,2172],{},"use_validated"," 设置为 ",[194,2175,2176],{},"true",[2178,2179,2180],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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 .svl4J, html code.shiki .svl4J{--shiki-light:#F76D47;--shiki-light-font-style:italic;--shiki-default:#F78C6C;--shiki-default-font-style:italic;--shiki-dark:#F78C6C;--shiki-dark-font-style:italic}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 .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 .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sFweD, html code.shiki .sFweD{--shiki-light:#E2931D;--shiki-light-font-style:italic;--shiki-default:#FFCB6B;--shiki-default-font-style:italic;--shiki-dark:#FFCB6B;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}",{"title":204,"searchDepth":211,"depth":222,"links":2182},[2183,2184,2189],{"id":154,"depth":222,"text":154},{"id":175,"depth":222,"text":175,"children":2185},[2186,2187,2188],{"id":407,"depth":229,"text":408},{"id":672,"depth":229,"text":672},{"id":943,"depth":229,"text":943},{"id":1446,"depth":222,"text":1446,"children":2190},[2191,2192,2193],{"id":1738,"depth":229,"text":1738},{"id":2061,"depth":229,"text":2061},{"id":2152,"depth":229,"text":2152},"了解认证、授权与验证。","md",null,{},{"title":44,"description":2194},"6Wd9SF19QBFEHaP5Ioujjt8MhdOkl0sv9gDjUN46jts",[2201,2203],{"title":40,"path":41,"stem":42,"description":2202,"children":-1},"了解有哪些可用的查询参数以及如何使用它们。",{"title":48,"path":49,"stem":50,"description":2204,"children":-1},"了解模型如何被转换为 JSON 响应。",{"id":2206,"title":118,"body":2207,"description":4017,"extension":2195,"links":2196,"meta":4018,"navigation":225,"path":4019,"seo":4020,"stem":4021,"__hash__":4022},"docs_en\u002F1.guide\u002F09.security.md",{"type":149,"value":2208,"toc":4004},[2209,2213,2224,2228,2246,2252,2392,2396,2402,2414,2616,2620,2627,2865,2869,2877,2882,3050,3055,3338,3342,3356,3371,3379,3385,3557,3570,3604,3608,3617,3623,3639,3652,3828,3854,3858,3874,3885,3889,3896,3900,3903,3911,3925,3937,3941,3956,3966,3970,3977,3981,3991,4002],[152,2210,2212],{"id":2211},"authentication","Authentication",[156,2214,2215,2216,2219,2220,2223],{},"Orion does not provide any authentication perks at the moment, assuming that the developer is responsible for setting up the desired app's authentication capabilities. However, we recommend using ",[160,2217,165],{"href":162,"rel":2218},[164]," or ",[160,2221,171],{"href":169,"rel":2222},[164]," for this purpose.",[152,2225,2227],{"id":2226},"authorization","Authorization",[156,2229,2230,2231,2235,2236,2240,2241,2245],{},"Both ",[160,2232,2234],{"href":2233},"\u002Fguide\u002Fmodels","model"," and ",[160,2237,2239],{"href":2238},"\u002Fguide\u002Frelationships","relation"," controllers rely on ",[160,2242,2244],{"href":186,"rel":2243},[164],"model policies"," to determine whether the currently authenticated user is allowed to perform certain actions or not.",[156,2247,2248,2249,2251],{},"While it is not recommended, in some situations you may want to disable authorization checks on a particular controller. To do so, you can use ",[194,2250,196],{}," trait.",[199,2253,2254],{"className":201,"code":202,"language":203,"meta":204,"style":204},[194,2255,2256,2262,2266,2286,2290,2306,2322,2326,2336,2340,2348,2352,2356,2366,2370,2388],{"__ignoreMap":204},[208,2257,2258,2260],{"class":210,"line":211},[208,2259,215],{"class":214},[208,2261,219],{"class":218},[208,2263,2264],{"class":210,"line":222},[208,2265,226],{"emptyLinePlaceholder":225},[208,2267,2268,2270,2272,2274,2276,2278,2280,2282,2284],{"class":210,"line":229},[208,2269,233],{"class":232},[208,2271,237],{"class":236},[208,2273,240],{"class":214},[208,2275,243],{"class":236},[208,2277,240],{"class":214},[208,2279,248],{"class":236},[208,2281,240],{"class":214},[208,2283,253],{"class":236},[208,2285,256],{"class":214},[208,2287,2288],{"class":210,"line":259},[208,2289,226],{"emptyLinePlaceholder":225},[208,2291,2292,2294,2296,2298,2300,2302,2304],{"class":210,"line":264},[208,2293,267],{"class":232},[208,2295,237],{"class":218},[208,2297,240],{"class":214},[208,2299,94],{"class":218},[208,2301,240],{"class":214},[208,2303,278],{"class":218},[208,2305,256],{"class":214},[208,2307,2308,2310,2312,2314,2316,2318,2320],{"class":210,"line":283},[208,2309,267],{"class":232},[208,2311,288],{"class":218},[208,2313,240],{"class":214},[208,2315,293],{"class":218},[208,2317,240],{"class":214},[208,2319,298],{"class":218},[208,2321,256],{"class":214},[208,2323,2324],{"class":210,"line":303},[208,2325,226],{"emptyLinePlaceholder":225},[208,2327,2328,2330,2332,2334],{"class":210,"line":308},[208,2329,312],{"class":311},[208,2331,315],{"class":236},[208,2333,318],{"class":311},[208,2335,321],{"class":236},[208,2337,2338],{"class":210,"line":324},[208,2339,327],{"class":214},[208,2341,2342,2344,2346],{"class":210,"line":330},[208,2343,333],{"class":232},[208,2345,336],{"class":218},[208,2347,256],{"class":214},[208,2349,2350],{"class":210,"line":341},[208,2351,226],{"emptyLinePlaceholder":225},[208,2353,2354],{"class":210,"line":346},[208,2355,350],{"class":349},[208,2357,2358,2360,2362,2364],{"class":210,"line":353},[208,2359,356],{"class":349},[208,2361,360],{"class":359},[208,2363,363],{"class":359},[208,2365,366],{"class":349},[208,2367,2368],{"class":210,"line":369},[208,2369,372],{"class":349},[208,2371,2372,2374,2376,2378,2380,2382,2384,2386],{"class":210,"line":375},[208,2373,378],{"class":311},[208,2375,381],{"class":214},[208,2377,384],{"class":218},[208,2379,387],{"class":214},[208,2381,390],{"class":236},[208,2383,393],{"class":214},[208,2385,312],{"class":232},[208,2387,256],{"class":214},[208,2389,2390],{"class":210,"line":400},[208,2391,403],{"class":214},[405,2393,2395],{"id":2394},"usage-with-sanctum-or-any-other-custom-auth-guard","Usage with Sanctum (or any other custom Auth guard)",[156,2397,2398,2399,2401],{},"By default, the ",[194,2400,414],{}," guard is used to resolve the currently authenticated user for authorization.",[156,2403,2404,2405,2407,2408,2410,2411,2413],{},"However, you can change the way users are resolved either by setting ",[194,2406,425],{}," in ",[194,2409,421],{}," or by overriding ",[194,2412,429],{}," method on a controller.",[199,2415,2417],{"className":201,"code":2416,"language":203,"meta":204,"style":204},"\u003C?php\n\nnamespace App\\Http\\Controllers\\Api;\n\nuse App\\Models\\Post;\n\nclass PostsController extends ApiController\n{\n    \u002F**\n     * @var string $model\n     *\u002F\n    protected $model = Post::class;\n\n     \u002F**\n     * Retrieves currently authenticated user based on the guard.\n     *\n     * @return \\Illuminate\\Contracts\\Auth\\Authenticatable|null\n     *\u002F\n    public function resolveUser()\n    {\n        return Auth::guard('sanctum')->user();\n    }\n}\n",[194,2418,2419,2425,2429,2449,2453,2469,2473,2483,2487,2491,2501,2505,2523,2527,2531,2536,2540,2566,2570,2580,2584,2608,2612],{"__ignoreMap":204},[208,2420,2421,2423],{"class":210,"line":211},[208,2422,215],{"class":214},[208,2424,219],{"class":218},[208,2426,2427],{"class":210,"line":222},[208,2428,226],{"emptyLinePlaceholder":225},[208,2430,2431,2433,2435,2437,2439,2441,2443,2445,2447],{"class":210,"line":229},[208,2432,233],{"class":232},[208,2434,237],{"class":236},[208,2436,240],{"class":214},[208,2438,243],{"class":236},[208,2440,240],{"class":214},[208,2442,248],{"class":236},[208,2444,240],{"class":214},[208,2446,253],{"class":236},[208,2448,256],{"class":214},[208,2450,2451],{"class":210,"line":259},[208,2452,226],{"emptyLinePlaceholder":225},[208,2454,2455,2457,2459,2461,2463,2465,2467],{"class":210,"line":264},[208,2456,267],{"class":232},[208,2458,237],{"class":218},[208,2460,240],{"class":214},[208,2462,94],{"class":218},[208,2464,240],{"class":214},[208,2466,278],{"class":218},[208,2468,256],{"class":214},[208,2470,2471],{"class":210,"line":283},[208,2472,226],{"emptyLinePlaceholder":225},[208,2474,2475,2477,2479,2481],{"class":210,"line":303},[208,2476,312],{"class":311},[208,2478,315],{"class":236},[208,2480,318],{"class":311},[208,2482,321],{"class":236},[208,2484,2485],{"class":210,"line":308},[208,2486,327],{"class":214},[208,2488,2489],{"class":210,"line":324},[208,2490,350],{"class":349},[208,2492,2493,2495,2497,2499],{"class":210,"line":330},[208,2494,356],{"class":349},[208,2496,360],{"class":359},[208,2498,363],{"class":359},[208,2500,366],{"class":349},[208,2502,2503],{"class":210,"line":341},[208,2504,372],{"class":349},[208,2506,2507,2509,2511,2513,2515,2517,2519,2521],{"class":210,"line":346},[208,2508,378],{"class":311},[208,2510,381],{"class":214},[208,2512,384],{"class":218},[208,2514,387],{"class":214},[208,2516,390],{"class":236},[208,2518,393],{"class":214},[208,2520,312],{"class":232},[208,2522,256],{"class":214},[208,2524,2525],{"class":210,"line":353},[208,2526,226],{"emptyLinePlaceholder":225},[208,2528,2529],{"class":210,"line":369},[208,2530,548],{"class":349},[208,2532,2533],{"class":210,"line":375},[208,2534,2535],{"class":349},"     * Retrieves currently authenticated user based on the guard.\n",[208,2537,2538],{"class":210,"line":400},[208,2539,558],{"class":349},[208,2541,2542,2544,2546,2548,2550,2552,2554,2556,2558,2560,2562,2564],{"class":210,"line":561},[208,2543,356],{"class":349},[208,2545,566],{"class":359},[208,2547,570],{"class":569},[208,2549,574],{"class":573},[208,2551,240],{"class":569},[208,2553,579],{"class":573},[208,2555,240],{"class":569},[208,2557,584],{"class":573},[208,2559,240],{"class":569},[208,2561,590],{"class":589},[208,2563,593],{"class":569},[208,2565,596],{"class":359},[208,2567,2568],{"class":210,"line":599},[208,2569,372],{"class":349},[208,2571,2572,2574,2576,2578],{"class":210,"line":604},[208,2573,607],{"class":311},[208,2575,610],{"class":311},[208,2577,614],{"class":613},[208,2579,617],{"class":214},[208,2581,2582],{"class":210,"line":620},[208,2583,623],{"class":214},[208,2585,2586,2588,2590,2592,2594,2596,2598,2600,2602,2604,2606],{"class":210,"line":626},[208,2587,629],{"class":569},[208,2589,632],{"class":236},[208,2591,393],{"class":214},[208,2593,637],{"class":613},[208,2595,640],{"class":214},[208,2597,643],{"class":214},[208,2599,647],{"class":646},[208,2601,643],{"class":214},[208,2603,652],{"class":214},[208,2605,655],{"class":613},[208,2607,658],{"class":214},[208,2609,2610],{"class":210,"line":661},[208,2611,664],{"class":214},[208,2613,2614],{"class":210,"line":667},[208,2615,403],{"class":214},[405,2617,2619],{"id":2618},"authorizing-parent-entities","Authorizing Parent Entities",[156,2621,2622,2623,2626],{},"Relation operations pass an additional argument to policies - the parent entity. You can use that argument to set up additional checks on whether a user is authorized to perform certain actions on a relation entity ",[677,2624,2625],{},"in the context of a given parent entity",".",[199,2628,2630],{"className":201,"code":2629,"language":203,"meta":204,"style":204},"class PostPolicy\n{\n    public function update($user, $post)\n    {\n        return $post->user_id === $user->id;\n    }\n}\n\nclass PostMetaPolicy\n{\n    public function update($user, $postMeta, $post) \u002F\u002F \u003C---- $post here is the parent entity\n    {\n        \u002F\u002F please note that the check is performed against\n        \u002F\u002F the parent entity $post, not the relation entity $postMeta\n        return Gate::forUser($user)->inspect('update', $post); \n    }\n    \n    public function create($user, $post)\n    {\n        return Gate::forUser($user)->inspect('update', $post);\n    }\n}\n",[194,2631,2632,2638,2642,2662,2666,2690,2694,2698,2702,2708,2712,2741,2745,2750,2755,2791,2795,2799,2819,2823,2857,2861],{"__ignoreMap":204},[208,2633,2634,2636],{"class":210,"line":211},[208,2635,312],{"class":311},[208,2637,692],{"class":236},[208,2639,2640],{"class":210,"line":222},[208,2641,327],{"class":214},[208,2643,2644,2646,2648,2650,2652,2654,2656,2658,2660],{"class":210,"line":229},[208,2645,607],{"class":311},[208,2647,610],{"class":311},[208,2649,705],{"class":613},[208,2651,708],{"class":214},[208,2653,655],{"class":218},[208,2655,713],{"class":214},[208,2657,381],{"class":214},[208,2659,718],{"class":218},[208,2661,721],{"class":214},[208,2663,2664],{"class":210,"line":259},[208,2665,623],{"class":214},[208,2667,2668,2670,2672,2674,2676,2678,2680,2682,2684,2686,2688],{"class":210,"line":264},[208,2669,629],{"class":569},[208,2671,381],{"class":214},[208,2673,718],{"class":218},[208,2675,736],{"class":214},[208,2677,739],{"class":218},[208,2679,742],{"class":214},[208,2681,381],{"class":214},[208,2683,655],{"class":218},[208,2685,736],{"class":214},[208,2687,751],{"class":218},[208,2689,256],{"class":214},[208,2691,2692],{"class":210,"line":283},[208,2693,664],{"class":214},[208,2695,2696],{"class":210,"line":303},[208,2697,403],{"class":214},[208,2699,2700],{"class":210,"line":308},[208,2701,226],{"emptyLinePlaceholder":225},[208,2703,2704,2706],{"class":210,"line":324},[208,2705,312],{"class":311},[208,2707,772],{"class":236},[208,2709,2710],{"class":210,"line":330},[208,2711,327],{"class":214},[208,2713,2714,2716,2718,2720,2722,2724,2726,2728,2730,2732,2734,2736,2738],{"class":210,"line":341},[208,2715,607],{"class":311},[208,2717,610],{"class":311},[208,2719,705],{"class":613},[208,2721,708],{"class":214},[208,2723,655],{"class":218},[208,2725,713],{"class":214},[208,2727,381],{"class":214},[208,2729,795],{"class":218},[208,2731,713],{"class":214},[208,2733,381],{"class":214},[208,2735,718],{"class":218},[208,2737,804],{"class":214},[208,2739,2740],{"class":349}," \u002F\u002F \u003C---- $post here is the parent entity\n",[208,2742,2743],{"class":210,"line":346},[208,2744,623],{"class":214},[208,2746,2747],{"class":210,"line":353},[208,2748,2749],{"class":349},"        \u002F\u002F please note that the check is performed against\n",[208,2751,2752],{"class":210,"line":369},[208,2753,2754],{"class":349},"        \u002F\u002F the parent entity $post, not the relation entity $postMeta\n",[208,2756,2757,2759,2761,2763,2765,2767,2769,2771,2773,2775,2777,2779,2781,2783,2785,2787,2789],{"class":210,"line":375},[208,2758,629],{"class":569},[208,2760,828],{"class":236},[208,2762,393],{"class":214},[208,2764,833],{"class":613},[208,2766,708],{"class":214},[208,2768,655],{"class":218},[208,2770,652],{"class":214},[208,2772,842],{"class":613},[208,2774,640],{"class":214},[208,2776,643],{"class":214},[208,2778,849],{"class":646},[208,2780,643],{"class":214},[208,2782,713],{"class":214},[208,2784,381],{"class":214},[208,2786,718],{"class":218},[208,2788,860],{"class":214},[208,2790,863],{"class":218},[208,2792,2793],{"class":210,"line":400},[208,2794,664],{"class":214},[208,2796,2797],{"class":210,"line":561},[208,2798,872],{"class":218},[208,2800,2801,2803,2805,2807,2809,2811,2813,2815,2817],{"class":210,"line":599},[208,2802,607],{"class":311},[208,2804,610],{"class":311},[208,2806,881],{"class":613},[208,2808,708],{"class":214},[208,2810,655],{"class":218},[208,2812,713],{"class":214},[208,2814,381],{"class":214},[208,2816,718],{"class":218},[208,2818,721],{"class":214},[208,2820,2821],{"class":210,"line":604},[208,2822,623],{"class":214},[208,2824,2825,2827,2829,2831,2833,2835,2837,2839,2841,2843,2845,2847,2849,2851,2853,2855],{"class":210,"line":620},[208,2826,629],{"class":569},[208,2828,828],{"class":236},[208,2830,393],{"class":214},[208,2832,833],{"class":613},[208,2834,708],{"class":214},[208,2836,655],{"class":218},[208,2838,652],{"class":214},[208,2840,842],{"class":613},[208,2842,640],{"class":214},[208,2844,643],{"class":214},[208,2846,849],{"class":646},[208,2848,643],{"class":214},[208,2850,713],{"class":214},[208,2852,381],{"class":214},[208,2854,718],{"class":218},[208,2856,932],{"class":214},[208,2858,2859],{"class":210,"line":626},[208,2860,664],{"class":214},[208,2862,2863],{"class":210,"line":661},[208,2864,403],{"class":214},[405,2866,2868],{"id":2867},"customizing-policy-classes","Customizing Policy Classes",[156,2870,2871,2872,2219,2874,2876],{},"It is quite common to see different authorization rules for the same models used in different controllers or scenarios. By default, the policy is resolved by Laravel using its built-in functionality. However, if you would like to use a specific policy for a controller, set the ",[194,2873,949],{},[194,2875,952],{}," variables accordingly:",[156,2878,2879],{},[957,2880,2881],{},"Model controller",[199,2883,2884],{"className":201,"code":962,"language":203,"meta":204,"style":204},[194,2885,2886,2892,2896,2916,2920,2936,2952,2956,2966,2970,2974,2984,2988,3006,3010,3014,3024,3028,3046],{"__ignoreMap":204},[208,2887,2888,2890],{"class":210,"line":211},[208,2889,215],{"class":214},[208,2891,219],{"class":218},[208,2893,2894],{"class":210,"line":222},[208,2895,226],{"emptyLinePlaceholder":225},[208,2897,2898,2900,2902,2904,2906,2908,2910,2912,2914],{"class":210,"line":229},[208,2899,233],{"class":232},[208,2901,237],{"class":236},[208,2903,240],{"class":214},[208,2905,243],{"class":236},[208,2907,240],{"class":214},[208,2909,248],{"class":236},[208,2911,240],{"class":214},[208,2913,253],{"class":236},[208,2915,256],{"class":214},[208,2917,2918],{"class":210,"line":259},[208,2919,226],{"emptyLinePlaceholder":225},[208,2921,2922,2924,2926,2928,2930,2932,2934],{"class":210,"line":264},[208,2923,267],{"class":232},[208,2925,237],{"class":218},[208,2927,240],{"class":214},[208,2929,94],{"class":218},[208,2931,240],{"class":214},[208,2933,278],{"class":218},[208,2935,256],{"class":214},[208,2937,2938,2940,2942,2944,2946,2948,2950],{"class":210,"line":283},[208,2939,267],{"class":232},[208,2941,237],{"class":218},[208,2943,240],{"class":214},[208,2945,1025],{"class":218},[208,2947,240],{"class":214},[208,2949,1030],{"class":218},[208,2951,256],{"class":214},[208,2953,2954],{"class":210,"line":303},[208,2955,226],{"emptyLinePlaceholder":225},[208,2957,2958,2960,2962,2964],{"class":210,"line":308},[208,2959,312],{"class":311},[208,2961,315],{"class":236},[208,2963,318],{"class":311},[208,2965,321],{"class":236},[208,2967,2968],{"class":210,"line":324},[208,2969,327],{"class":214},[208,2971,2972],{"class":210,"line":330},[208,2973,350],{"class":349},[208,2975,2976,2978,2980,2982],{"class":210,"line":341},[208,2977,356],{"class":349},[208,2979,360],{"class":359},[208,2981,363],{"class":359},[208,2983,366],{"class":349},[208,2985,2986],{"class":210,"line":346},[208,2987,372],{"class":349},[208,2989,2990,2992,2994,2996,2998,3000,3002,3004],{"class":210,"line":353},[208,2991,378],{"class":311},[208,2993,381],{"class":214},[208,2995,384],{"class":218},[208,2997,387],{"class":214},[208,2999,390],{"class":236},[208,3001,393],{"class":214},[208,3003,312],{"class":232},[208,3005,256],{"class":214},[208,3007,3008],{"class":210,"line":369},[208,3009,226],{"emptyLinePlaceholder":225},[208,3011,3012],{"class":210,"line":375},[208,3013,350],{"class":349},[208,3015,3016,3018,3020,3022],{"class":210,"line":400},[208,3017,356],{"class":349},[208,3019,360],{"class":359},[208,3021,363],{"class":359},[208,3023,1105],{"class":349},[208,3025,3026],{"class":210,"line":561},[208,3027,372],{"class":349},[208,3029,3030,3032,3034,3036,3038,3040,3042,3044],{"class":210,"line":599},[208,3031,378],{"class":311},[208,3033,381],{"class":214},[208,3035,1118],{"class":218},[208,3037,387],{"class":214},[208,3039,1123],{"class":236},[208,3041,393],{"class":214},[208,3043,312],{"class":232},[208,3045,256],{"class":214},[208,3047,3048],{"class":210,"line":604},[208,3049,403],{"class":214},[156,3051,3052],{},[957,3053,3054],{},"Relation controller",[199,3056,3058],{"className":201,"code":3057,"language":203,"meta":204,"style":204},"\u003C?php\n\nnamespace App\\Http\\Controllers\\Api;\n\nuse App\\Models\\Team;\nuse App\\Policies\\CustomPostPolicy;\nuse App\\Policies\\CustomTeamPolicy;\nuse Orion\\Http\\Controllers\\RelationController;\n\nclass TeamPostsController extends RelationController\n{\n     \u002F**\n     * @var string $model\n     *\u002F\n    protected $model = Team::class; \u002F\u002F or \"App\\Models\\Team\"\n    \n    \u002F**\n     * Name of the relationship as it is defined on the Post model\n     *\u002F\n    protected $relation = 'posts';\n\n    \u002F**\n     * @var string $parentPolicy\n     *\u002F\n    protected $parentPolicy = CustomTeamPolicy::class;\n\n   \u002F**\n     * @var string $policy\n     *\u002F\n    protected $policy = CustomPostPolicy::class;\n}\n",[194,3059,3060,3066,3070,3090,3094,3110,3126,3142,3162,3166,3176,3180,3184,3194,3198,3219,3223,3227,3232,3236,3254,3258,3262,3272,3276,3294,3298,3302,3312,3316,3334],{"__ignoreMap":204},[208,3061,3062,3064],{"class":210,"line":211},[208,3063,215],{"class":214},[208,3065,219],{"class":218},[208,3067,3068],{"class":210,"line":222},[208,3069,226],{"emptyLinePlaceholder":225},[208,3071,3072,3074,3076,3078,3080,3082,3084,3086,3088],{"class":210,"line":229},[208,3073,233],{"class":232},[208,3075,237],{"class":236},[208,3077,240],{"class":214},[208,3079,243],{"class":236},[208,3081,240],{"class":214},[208,3083,248],{"class":236},[208,3085,240],{"class":214},[208,3087,253],{"class":236},[208,3089,256],{"class":214},[208,3091,3092],{"class":210,"line":259},[208,3093,226],{"emptyLinePlaceholder":225},[208,3095,3096,3098,3100,3102,3104,3106,3108],{"class":210,"line":264},[208,3097,267],{"class":232},[208,3099,237],{"class":218},[208,3101,240],{"class":214},[208,3103,94],{"class":218},[208,3105,240],{"class":214},[208,3107,1192],{"class":218},[208,3109,256],{"class":214},[208,3111,3112,3114,3116,3118,3120,3122,3124],{"class":210,"line":283},[208,3113,267],{"class":232},[208,3115,237],{"class":218},[208,3117,240],{"class":214},[208,3119,1025],{"class":218},[208,3121,240],{"class":214},[208,3123,1030],{"class":218},[208,3125,256],{"class":214},[208,3127,3128,3130,3132,3134,3136,3138,3140],{"class":210,"line":303},[208,3129,267],{"class":232},[208,3131,237],{"class":218},[208,3133,240],{"class":214},[208,3135,1025],{"class":218},[208,3137,240],{"class":214},[208,3139,1225],{"class":218},[208,3141,256],{"class":214},[208,3143,3144,3146,3148,3150,3152,3154,3156,3158,3160],{"class":210,"line":308},[208,3145,267],{"class":232},[208,3147,288],{"class":218},[208,3149,240],{"class":214},[208,3151,243],{"class":218},[208,3153,240],{"class":214},[208,3155,248],{"class":218},[208,3157,240],{"class":214},[208,3159,1246],{"class":218},[208,3161,256],{"class":214},[208,3163,3164],{"class":210,"line":324},[208,3165,226],{"emptyLinePlaceholder":225},[208,3167,3168,3170,3172,3174],{"class":210,"line":330},[208,3169,312],{"class":311},[208,3171,1259],{"class":236},[208,3173,318],{"class":311},[208,3175,1264],{"class":236},[208,3177,3178],{"class":210,"line":341},[208,3179,327],{"class":214},[208,3181,3182],{"class":210,"line":346},[208,3183,548],{"class":349},[208,3185,3186,3188,3190,3192],{"class":210,"line":353},[208,3187,356],{"class":349},[208,3189,360],{"class":359},[208,3191,363],{"class":359},[208,3193,366],{"class":349},[208,3195,3196],{"class":210,"line":369},[208,3197,372],{"class":349},[208,3199,3200,3202,3204,3206,3208,3210,3212,3214,3216],{"class":210,"line":375},[208,3201,378],{"class":311},[208,3203,381],{"class":214},[208,3205,384],{"class":218},[208,3207,387],{"class":214},[208,3209,1299],{"class":236},[208,3211,393],{"class":214},[208,3213,312],{"class":232},[208,3215,1306],{"class":214},[208,3217,3218],{"class":349}," \u002F\u002F or \"App\\Models\\Team\"\n",[208,3220,3221],{"class":210,"line":400},[208,3222,872],{"class":218},[208,3224,3225],{"class":210,"line":561},[208,3226,350],{"class":349},[208,3228,3229],{"class":210,"line":599},[208,3230,3231],{"class":349},"     * Name of the relationship as it is defined on the Post model\n",[208,3233,3234],{"class":210,"line":604},[208,3235,372],{"class":349},[208,3237,3238,3240,3242,3244,3246,3248,3250,3252],{"class":210,"line":620},[208,3239,378],{"class":311},[208,3241,381],{"class":214},[208,3243,1335],{"class":218},[208,3245,387],{"class":214},[208,3247,1340],{"class":214},[208,3249,1343],{"class":646},[208,3251,643],{"class":214},[208,3253,256],{"class":214},[208,3255,3256],{"class":210,"line":626},[208,3257,226],{"emptyLinePlaceholder":225},[208,3259,3260],{"class":210,"line":661},[208,3261,350],{"class":349},[208,3263,3264,3266,3268,3270],{"class":210,"line":667},[208,3265,356],{"class":349},[208,3267,360],{"class":359},[208,3269,363],{"class":359},[208,3271,1366],{"class":349},[208,3273,3274],{"class":210,"line":1369},[208,3275,372],{"class":349},[208,3277,3278,3280,3282,3284,3286,3288,3290,3292],{"class":210,"line":1374},[208,3279,378],{"class":311},[208,3281,381],{"class":214},[208,3283,1381],{"class":218},[208,3285,387],{"class":214},[208,3287,1386],{"class":236},[208,3289,393],{"class":214},[208,3291,312],{"class":232},[208,3293,256],{"class":214},[208,3295,3296],{"class":210,"line":1395},[208,3297,226],{"emptyLinePlaceholder":225},[208,3299,3300],{"class":210,"line":1400},[208,3301,1403],{"class":349},[208,3303,3304,3306,3308,3310],{"class":210,"line":1406},[208,3305,356],{"class":349},[208,3307,360],{"class":359},[208,3309,363],{"class":359},[208,3311,1105],{"class":349},[208,3313,3314],{"class":210,"line":1417},[208,3315,372],{"class":349},[208,3317,3318,3320,3322,3324,3326,3328,3330,3332],{"class":210,"line":1422},[208,3319,378],{"class":311},[208,3321,381],{"class":214},[208,3323,1118],{"class":218},[208,3325,387],{"class":214},[208,3327,1123],{"class":236},[208,3329,393],{"class":214},[208,3331,312],{"class":232},[208,3333,256],{"class":214},[208,3335,3336],{"class":210,"line":1441},[208,3337,403],{"class":214},[152,3339,3341],{"id":3340},"validation","Validation",[1448,3343,3344],{},[156,3345,3346,3347,3350,3351,3353,3354,2626],{},"Request classes ",[957,3348,3349],{},"must"," extend ",[194,3352,1459],{}," class instead of ",[194,3355,1463],{},[156,3357,3358,3359,2235,3361,3363,3364,3368,3369,2626],{},"To validate incoming request data to ",[194,3360,1470],{},[194,3362,849],{}," endpoints, Orion will try to find ",[160,3365,3367],{"href":1481,"rel":3366},[164],"request class"," for resource model following the class name pattern:\n",[194,3370,1477],{},[156,3372,3373,3374,3376,3377,2626],{},"For example, if you have an ",[194,3375,1488],{}," model, the related request class would be ",[194,3378,1492],{},[156,3380,3381,3382,3384],{},"If request class names in your app do not follow this naming convention or if you just would like to be more explicit, set ",[194,3383,1498],{}," property on controller to a fully-qualified request class name.",[199,3386,3387],{"className":201,"code":1502,"language":203,"meta":204,"style":204},[194,3388,3389,3395,3399,3419,3423,3439,3459,3463,3473,3477,3481,3491,3495,3513,3517,3521,3531,3535,3553],{"__ignoreMap":204},[208,3390,3391,3393],{"class":210,"line":211},[208,3392,215],{"class":214},[208,3394,219],{"class":218},[208,3396,3397],{"class":210,"line":222},[208,3398,226],{"emptyLinePlaceholder":225},[208,3400,3401,3403,3405,3407,3409,3411,3413,3415,3417],{"class":210,"line":229},[208,3402,233],{"class":232},[208,3404,237],{"class":236},[208,3406,240],{"class":214},[208,3408,243],{"class":236},[208,3410,240],{"class":214},[208,3412,248],{"class":236},[208,3414,240],{"class":214},[208,3416,253],{"class":236},[208,3418,256],{"class":214},[208,3420,3421],{"class":210,"line":259},[208,3422,226],{"emptyLinePlaceholder":225},[208,3424,3425,3427,3429,3431,3433,3435,3437],{"class":210,"line":264},[208,3426,267],{"class":232},[208,3428,237],{"class":218},[208,3430,240],{"class":214},[208,3432,94],{"class":218},[208,3434,240],{"class":214},[208,3436,1553],{"class":218},[208,3438,256],{"class":214},[208,3440,3441,3443,3445,3447,3449,3451,3453,3455,3457],{"class":210,"line":283},[208,3442,267],{"class":232},[208,3444,237],{"class":218},[208,3446,240],{"class":214},[208,3448,243],{"class":218},[208,3450,240],{"class":214},[208,3452,1570],{"class":218},[208,3454,240],{"class":214},[208,3456,1575],{"class":218},[208,3458,256],{"class":214},[208,3460,3461],{"class":210,"line":303},[208,3462,226],{"emptyLinePlaceholder":225},[208,3464,3465,3467,3469,3471],{"class":210,"line":308},[208,3466,312],{"class":311},[208,3468,1588],{"class":236},[208,3470,318],{"class":311},[208,3472,321],{"class":236},[208,3474,3475],{"class":210,"line":324},[208,3476,327],{"class":214},[208,3478,3479],{"class":210,"line":330},[208,3480,350],{"class":349},[208,3482,3483,3485,3487,3489],{"class":210,"line":341},[208,3484,356],{"class":349},[208,3486,360],{"class":359},[208,3488,363],{"class":359},[208,3490,366],{"class":349},[208,3492,3493],{"class":210,"line":346},[208,3494,372],{"class":349},[208,3496,3497,3499,3501,3503,3505,3507,3509,3511],{"class":210,"line":353},[208,3498,378],{"class":311},[208,3500,381],{"class":214},[208,3502,384],{"class":218},[208,3504,387],{"class":214},[208,3506,1627],{"class":236},[208,3508,393],{"class":214},[208,3510,312],{"class":232},[208,3512,256],{"class":214},[208,3514,3515],{"class":210,"line":369},[208,3516,226],{"emptyLinePlaceholder":225},[208,3518,3519],{"class":210,"line":375},[208,3520,350],{"class":349},[208,3522,3523,3525,3527,3529],{"class":210,"line":400},[208,3524,1646],{"class":349},[208,3526,360],{"class":359},[208,3528,363],{"class":359},[208,3530,1653],{"class":349},[208,3532,3533],{"class":210,"line":561},[208,3534,1658],{"class":349},[208,3536,3537,3539,3541,3543,3545,3547,3549,3551],{"class":210,"line":599},[208,3538,378],{"class":311},[208,3540,381],{"class":214},[208,3542,1667],{"class":218},[208,3544,387],{"class":214},[208,3546,1672],{"class":236},[208,3548,393],{"class":214},[208,3550,312],{"class":232},[208,3552,256],{"class":214},[208,3554,3555],{"class":210,"line":604},[208,3556,403],{"class":214},[156,3558,3559,3560,3564,3565,2235,3567,3569],{},"The request class is then bound using Laravel ",[160,3561,3563],{"href":1688,"rel":3562},[164],"Service Container"," and used in ",[194,3566,1470],{},[194,3568,849],{}," methods to validate request data the same way as if you would explicitly set it in method signature:",[199,3571,3572],{"className":201,"code":1699,"language":203,"meta":204,"style":204},[194,3573,3574,3592,3596,3600],{"__ignoreMap":204},[208,3575,3576,3578,3580,3582,3584,3586,3588,3590],{"class":210,"line":211},[208,3577,1706],{"class":311},[208,3579,610],{"class":311},[208,3581,1711],{"class":613},[208,3583,640],{"class":214},[208,3585,1575],{"class":236},[208,3587,381],{"class":214},[208,3589,1720],{"class":218},[208,3591,721],{"class":214},[208,3593,3594],{"class":210,"line":222},[208,3595,327],{"class":214},[208,3597,3598],{"class":210,"line":229},[208,3599,1731],{"class":214},[208,3601,3602],{"class":210,"line":259},[208,3603,403],{"class":214},[405,3605,3607],{"id":3606},"validation-rules","Validation Rules",[1740,3609,3611,3612,2235,3614,3616],{"id":3610},"defining-rules-for-store-and-update-operations","Defining rules for ",[194,3613,1470],{},[194,3615,849],{}," operations",[156,3618,3619,3620,3622],{},"Orion provides ",[194,3621,1459],{}," class with a handful of methods to specify validation rules.",[156,3624,3625,3626,2235,3628,3630,3631,3633,3634,2235,3636,3638],{},"To define common rules for both ",[194,3627,1470],{},[194,3629,849],{}," endpoints you can use ",[194,3632,1765],{}," method.\nIf you would like to define rules specific to an endpoint, you can use ",[194,3635,1769],{},[194,3637,1772],{}," methods.",[1448,3640,3641],{},[156,3642,3643,3644,2235,3646,3648,3649,3651],{},"Rules for a particular field specified in the ",[194,3645,1769],{},[194,3647,1772],{}," methods overwrite rules from the ",[194,3650,1765],{}," method, if both contain the same key.",[199,3653,3654],{"className":201,"code":1792,"language":203,"meta":204,"style":204},[194,3655,3656,3662,3666,3682,3686,3706,3710,3720,3724,3738,3742,3748,3764,3768,3772,3776,3790,3794,3800,3816,3820,3824],{"__ignoreMap":204},[208,3657,3658,3660],{"class":210,"line":211},[208,3659,215],{"class":214},[208,3661,219],{"class":218},[208,3663,3664],{"class":210,"line":222},[208,3665,226],{"emptyLinePlaceholder":225},[208,3667,3668,3670,3672,3674,3676,3678,3680],{"class":210,"line":229},[208,3669,233],{"class":232},[208,3671,237],{"class":236},[208,3673,240],{"class":214},[208,3675,243],{"class":236},[208,3677,240],{"class":214},[208,3679,1570],{"class":236},[208,3681,256],{"class":214},[208,3683,3684],{"class":210,"line":259},[208,3685,226],{"emptyLinePlaceholder":225},[208,3687,3688,3690,3692,3694,3696,3698,3700,3702,3704],{"class":210,"line":264},[208,3689,267],{"class":232},[208,3691,288],{"class":218},[208,3693,240],{"class":214},[208,3695,243],{"class":218},[208,3697,240],{"class":214},[208,3699,1570],{"class":218},[208,3701,240],{"class":214},[208,3703,1843],{"class":218},[208,3705,256],{"class":214},[208,3707,3708],{"class":210,"line":283},[208,3709,226],{"emptyLinePlaceholder":225},[208,3711,3712,3714,3716,3718],{"class":210,"line":303},[208,3713,312],{"class":311},[208,3715,1856],{"class":236},[208,3717,318],{"class":311},[208,3719,1861],{"class":236},[208,3721,3722],{"class":210,"line":308},[208,3723,327],{"class":214},[208,3725,3726,3728,3730,3732,3734,3736],{"class":210,"line":324},[208,3727,607],{"class":311},[208,3729,610],{"class":311},[208,3731,1874],{"class":613},[208,3733,1877],{"class":214},[208,3735,1880],{"class":214},[208,3737,1883],{"class":232},[208,3739,3740],{"class":210,"line":330},[208,3741,623],{"class":214},[208,3743,3744,3746],{"class":210,"line":341},[208,3745,629],{"class":569},[208,3747,1894],{"class":214},[208,3749,3750,3752,3754,3756,3758,3760,3762],{"class":210,"line":346},[208,3751,1899],{"class":214},[208,3753,1902],{"class":646},[208,3755,643],{"class":214},[208,3757,1907],{"class":214},[208,3759,1340],{"class":214},[208,3761,1912],{"class":646},[208,3763,1915],{"class":214},[208,3765,3766],{"class":210,"line":353},[208,3767,1920],{"class":214},[208,3769,3770],{"class":210,"line":369},[208,3771,664],{"class":214},[208,3773,3774],{"class":210,"line":375},[208,3775,226],{"emptyLinePlaceholder":225},[208,3777,3778,3780,3782,3784,3786,3788],{"class":210,"line":400},[208,3779,607],{"class":311},[208,3781,610],{"class":311},[208,3783,1937],{"class":613},[208,3785,1877],{"class":214},[208,3787,1880],{"class":214},[208,3789,1883],{"class":232},[208,3791,3792],{"class":210,"line":561},[208,3793,623],{"class":214},[208,3795,3796,3798],{"class":210,"line":599},[208,3797,629],{"class":569},[208,3799,1894],{"class":214},[208,3801,3802,3804,3806,3808,3810,3812,3814],{"class":210,"line":604},[208,3803,1899],{"class":214},[208,3805,1960],{"class":646},[208,3807,643],{"class":214},[208,3809,1907],{"class":214},[208,3811,1340],{"class":214},[208,3813,1969],{"class":646},[208,3815,1915],{"class":214},[208,3817,3818],{"class":210,"line":620},[208,3819,1920],{"class":214},[208,3821,3822],{"class":210,"line":626},[208,3823,664],{"class":214},[208,3825,3826],{"class":210,"line":661},[208,3827,403],{"class":214},[156,3829,3830,3831,3833,3834,2235,3836,3838,3839,3841,3842,3844,3845,3847,3848,3850,3851,3853],{},"In this example, when a request is made to the ",[194,3832,1470],{}," endpoint, both ",[194,3835,1902],{},[194,3837,1960],{}," fields will be required. However, when a request is made to the ",[194,3840,849],{}," endpoint, only the ",[194,3843,1902],{}," field would be required, because there are no other rules defined in the ",[194,3846,1772],{}," method and the ",[194,3849,1902],{}," field is marked as required in the ",[194,3852,1765],{}," method.",[1740,3855,3857],{"id":3856},"defining-rules-for-relation-specific-operations","Defining rules for relation-specific operations",[156,3859,3860,3861,3863,3864,3863,3866,3863,3868,3863,3870,3863,3872,2626],{},"You can also define rules for relation specific endpoints: ",[194,3862,2018],{},", ",[194,3865,2022],{},[194,3867,2025],{},[194,3869,2028],{},[194,3871,2031],{},[194,3873,2034],{},[1448,3875,3876],{},[156,3877,3878,3879,3882,3883,3853],{},"Rules specified in these methods are ",[957,3880,3881],{},"NOT"," merged with rules from the ",[194,3884,1765],{},[1740,3886,3888],{"id":3887},"defining-rules-for-batch-operations","Defining rules for batch operations",[156,3890,3891,3892,3863,3894,2626],{},"You can also define rules for batch endpoints: ",[194,3893,2055],{},[194,3895,2058],{},[405,3897,3899],{"id":3898},"validation-messages","Validation Messages",[156,3901,3902],{},"Just like it is possible to configure the rules for specific endpoints, it is possible to customize their validation messages.",[1740,3904,3906,3907,2235,3909,3616],{"id":3905},"customizing-validation-messages-for-store-and-update-operations","Customizing validation messages for ",[194,3908,1470],{},[194,3910,849],{},[156,3912,3913,3914,2235,3916,3630,3918,3920,3921,2235,3923,3638],{},"To define common messages for both ",[194,3915,1470],{},[194,3917,849],{},[194,3919,2082],{}," method.\nIf you would like to define messages specific to an endpoint, you can use ",[194,3922,2086],{},[194,3924,2089],{},[1448,3926,3927],{},[156,3928,3929,3930,2235,3932,3934,3935,3651],{},"Messages for a particular field specified in the ",[194,3931,2086],{},[194,3933,2089],{}," methods overwrite messages from the ",[194,3936,2082],{},[1740,3938,3940],{"id":3939},"customizing-validation-messages-for-relation-specific-operations","Customizing validation messages for relation-specific operations",[156,3942,3943,3944,3863,3946,3863,3948,3863,3950,3863,3952,3863,3954,2626],{},"You can also customize messages for relation-specific endpoints: ",[194,3945,2112],{},[194,3947,2115],{},[194,3949,2118],{},[194,3951,2121],{},[194,3953,2124],{},[194,3955,2127],{},[1448,3957,3958],{},[156,3959,3960,3961,3963,3964,3853],{},"Messages specified in these methods are ",[957,3962,3881],{}," merged with messages from the ",[194,3965,2082],{},[1740,3967,3969],{"id":3968},"customizing-validation-messages-for-batch-operations","Customizing validation messages for batch operations",[156,3971,3972,3973,3863,3975,2626],{},"You can also customize messages for batch endpoints: ",[194,3974,2146],{},[194,3976,2149],{},[405,3978,3980],{"id":3979},"retrieving-request-data","Retrieving Request Data",[156,3982,3983,3984,3987,3988,3990],{},"By default, upon storing or updating entities, ",[677,3985,3986],{},"all"," request data is retrieved and passed into the ",[194,3989,2162],{}," method on a model.",[156,3992,3993,3994,3996,3997,2407,3999,4001],{},"However, it is possible to pass only the validated data. To do that, set ",[194,3995,2172],{}," to ",[194,3998,2176],{},[194,4000,2168],{}," config file.",[2178,4003,2180],{},{"title":204,"searchDepth":211,"depth":222,"links":4005},[4006,4007,4012],{"id":2211,"depth":222,"text":2212},{"id":2226,"depth":222,"text":2227,"children":4008},[4009,4010,4011],{"id":2394,"depth":229,"text":2395},{"id":2618,"depth":229,"text":2619},{"id":2867,"depth":229,"text":2868},{"id":3340,"depth":222,"text":3341,"children":4013},[4014,4015,4016],{"id":3606,"depth":229,"text":3607},{"id":3898,"depth":229,"text":3899},{"id":3979,"depth":229,"text":3980},"Learn about authentication, authorization, and validation.",{},"\u002Fguide\u002Fsecurity",{"title":118,"description":4017},"1.guide\u002F09.security","8sdxEJCwaW9yj_jBoHDgnTSInANQU1jYWBlCTH8coxU",1784394466686]