Как я могу выполнять политику авторизации в Laravel 5.3?

Я читаю здесь: https://laravel.com/docs/5.3/authorization#writing-policies

И я попытался это сделать

Моя FavoritePolicy выглядит так:

<?php namespace App\Policies; use App\User; use App\Models\Favorite; use Illuminate\Auth\Access\HandlesAuthorization; class FavoritePolicy { use HandlesAuthorization; public function view(User $user, Favorite $favorite) { return $user->id === $favorite->user_id; } } 

Мой FavoriteController выглядит следующим образом:

 <?php use App\Models\Favorite; ... class FavoriteController extends ApiController { ... public function index(Favorite $favorite) { $this->authorize('view', $favorite); return view('profile.favorite'); } } 

Мой AuthServiceProvider выглядит так:

 <?php namespace App\Providers; use App\Models\Favorite; use App\Policies\FavoritePolicy; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; class AuthServiceProvider extends ServiceProvider { protected $policies = [ 'App\Model' => 'App\Policies\ModelPolicy', Favorite::class => FavoritePolicy::class, ]; public function boot() { $this->registerPolicies(); } } 

Когда я запускаю свою систему для отображения избранного списка, существуют такие ошибки:

Упс, похоже, что-то пошло не так.

1/1 HttpException в строке Handler.php 115: это действие является неавторизованным.

Какова правильность политики авторизации?

Я пытаюсь dd($user) метод dd($user) in view (FavoritePolicy), результат отображает данные пользователя. Это правда

Но я пытаюсь использовать dd($favorite) , результат не отображает избранные данные пользователя, который в настоящее время зарегистрирован. В то время как я проверяю таблицу, существуют любимые данные пользователя, который в настоящее время зарегистрирован

Как я могу решить эту проблему?

Обновить

Результат dd($favorite) :

 Favorite {#498 ▼ #fillable: array:3 [▶] #connection: null #table: null #primaryKey: "id" #keyType: "int" #perPage: 15 +incrementing: true +timestamps: true #attributes: [] #original: [] #relations: [] #hidden: [] #visible: [] #appends: [] #guarded: array:1 [▼ 0 => "*" ] #dates: [] #dateFormat: null #casts: [] #touches: [] #observables: [] #with: [] +exists: false +wasRecentlyCreated: false } 

Спасибо за дополнительную информацию в вашем обновлении!

Итак, вы хотите показать страницу с подробной информацией о конкретном объекте Favorite , но только если пользователь является владельцем этого объекта?

Во-первых, незначительная проблема: обычно в Laravel метод контроллера, который показывает детали определенного объекта, называется show , а не index . index – это имя для методов, отображающих список сущностей (в вашем примере: список избранных).

Что касается вашей проблемы:
Ваша политика проверяет, может ли текущий пользователь, зарегистрированный в системе, просмотреть пустой $favorite (см. Вывод dd($favorite) в вашем пост-обновлении). Это означает, что $favorite также не установлен в вашем методе index .

Наверное, у вас есть маршрут, подобный этому:

 Route::get('favorite/{id}', 'FavoriteController@index'); 

Это означает, что значение id вводится в ваш index метод в качестве параметра, но не в Favorite . Чтобы запросить объект « Favorite – это то, что вам нужно сделать в методе.

Итак, ваш метод должен выглядеть следующим образом:

 public function index($favoriteId) { $favorite = Favorite::findOrFail($favoriteId); $this->authorize('view', $favorite); return view('profile.favorite')->with('favorite', $favorite); } 

Надеюсь, это поможет! Если нет, добавьте комментарий!