Laravel 5.8 模型策略自動解析

心智極客發表於2019-04-23

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}";
    });
}

相關文章