Я читаю здесь: 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); }
Надеюсь, это поможет! Если нет, добавьте комментарий!