0

我在这里读到: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();
    }
}

当我运行我的系统以显示最喜欢的列表时,存在如下错误:

哎呀,看起来像出事了。

Handler.php 第 115 行中的 1/1 HttpException:此操作未经授权。

授权策略的执行是正确的?

我尝试dd($user)查看方法(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
}
4

1 回答 1

1

感谢您在更新中提供的附加信息!

那么,您想显示一个特定Favorite实体的详细信息页面,但前提是用户是该实体的所有者?

首先是一个小“问题”:通常在 Laravel 中,显示特定实体详细信息的控制器方法被称为show,而不是indexindex是显示实体列表的方法的名称(在您的示例中:收藏夹列表)。

关于您的问题:
您的策略检查当前登录的用户是否可以查看空白$favorite(请参阅dd($favorite)帖子更新中的输出)。这意味着,这$favorite也没有在您的index方法中设置。

我想,你有一个类似这样定义的路线:

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

这意味着, 的值作为参数id注入到您的方法中,而不是实体。查询实体是您需要在方法中执行的操作。indexFavoriteFavorite

所以,你的方法应该更像这样:

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

希望有帮助!如果没有,请添加评论!

于 2017-03-05T10:32:55.507 回答