2017-03-04 2 views
0

私はここで読む:https://laravel.com/docs/5.3/authorization#writing-policiesLaravel 5.3で許可ポリシーを実行するにはどうすればよいですか?

そして、私はこの

マイ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ですこのように:

012私はお気に入りのリストを表示するには、私のシステムを実行すると

は、このようなエラーが存在する:

おっと、何かが間違っていたように見えますが。

1/1 Handler.php行のHttpException 115:この操作は、 が承認されていません。

認可ポリシーの実装は正しいですか?

ビューメソッド(FavoritePolicy)でdd($user)を試してみると、ユーザーデータがログに記録されます。それは本当です

しかし、私は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 
} 
+0

'dd($ favorite)'の出力は正確に何ですか? – Tek

+0

あなたの質問にそのdd()の出力を追加することをお勧めします。あなたのコメントではそれはまったく読めません。 – nvisser

答えて

1

あなたのアップデートで追加の情報をお寄せいただきありがとうございます!

したがって、ある特定のFavoriteエンティティの詳細ページを表示したいのですが、ユーザーがこのエンティティの所有者である場合にのみ表示しますか?

まず、マイナーな「問題」:通常、特定のエンティティの詳細を示すコントローラメソッドは、indexではなくshowと呼ばれます。 indexは、エンティティのリストを表示するメソッドの名前です(例では、お気に入りのリスト)。あなたの問題について


あなたのポリシーチェック現在のユーザーでログインした場合には、(あなたのポストの更新でdd($favorite)の出力を参照)、空の$favoriteを表示することができます。つまり、indexメソッドでは$favoriteも設定されていません。idの値がパラメータとしてごindex方法に注入されていることを

Route::get('favorite/{id}', '[email protected]'); 

このことは、ではなく、Favoriteエンティティ:私は推測

、あなたはこれに類似した定義されたルートを持っています。 Favoriteエンティティを照会するには、このメソッドで行う必要があります。

だから、あなたの方法は、より次のようになります。助け

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

希望を!そうでない場合は、コメントを追加してください!

+0

素晴らしい。できます。ありがとう –

+0

Btwこれはダンキーな方法です。コントローラーを呼び出す必要はありません。 –

関連する問題