5.8
之前,模型和策略之間的關係需要顯示的進行註冊
// /app/Providers/AuthServiceProvider.php
protected $policies = [
'App\User' => 'App\Policies\UserPolicy',
];
5.8
引入模型策略自動發現機制,但需要遵循一定的規範,即策略類都必須位於模型類所在目錄的Policies
目錄中。例如App\User
對應 App\Policies\UserPolicy
,如果是 App\Models\User
的話,就需要對應 App\Models\Policies\UserPolicy
。
有的人習慣將模型和策略的目錄都放在 app
下,即 App\Policies
對應策略,App\Models
對應模型,這樣做是不符合 5.8
支援的解析規範的。這種情況下,可以通過 Gate::guessPolicyNamesUsing
來進行自定義解析
// /app/Providers/AuthServiceProvider.php
use Illuminate\Support\Facades\Gate;
public function boot()
{
$this->registerPolicies();
Gate::guessPolicyNamesUsing(function($modelName){
$name = class_basename($modelName).'Policy';
return "App\\Policies\\{$name}";
});
}