2017-09-25 18 views
1

「更新 - 投稿」の権限を持つユーザーがデータベース内の投稿を編集できるLaravelゲートのチュートリアルに従っています。さらに、権限に関係なく、どのユーザーでも投稿した投稿を編集できます。/AuthServiceProvider.php自分の投稿を更新するLaravelユーザーの権限

アプリ/プロバイダ:

Gate::define('update-post', function ($user, \App\Post $post) { 
    return $user->hasAccess(['update-post']) or $user->id == $post->user_id; 
}); 

ルート/ web.php:

Route::get('/edit/{post}', '[email protected]') 
    ->name('edit_post') 
    ->middleware('can:update-post,post'); 

Route::post('/edit/{post}', '[email protected]') 
    ->name('update_post') 
    ->middleware('can:update-post,post'); 

私が探している新しい権限を追加する方法である、「アップデートを言いますその権限を持つユーザーだけが自分の投稿を編集することができます。

たとえば、モデレータは、すべての投稿を編集できる権限 'update-post'を持っています。通常のユーザーは、 'update-own-post'という新しい権限が割り当てられていても、現在実装されているすべてのユーザーに割り当てられていない場合にのみ、自分の投稿を編集することができます。

この変更を自分のコードに実装するにはどうすればよいですか?

ユーザーの種類を確認したいので、次のいずれかに該当する場合、彼らは編集することができるはず門で

答えて

0

  1. $user->hasAccess(['update-post'])
  2. $user->id == $post->user_id
  3. $user->isModerator()

あなたのユーザタイプの設定方法はわかりませんが、ユーザモデルにユーザのタイプをチェックするメソッドを追加することをお勧めします。ユーザーの名前が「モデレータ」であるか、あなたが選んだ名前であればtrueを返します。

あなたはのようなものが残されることになる

Gate::define('update-post', function ($user, \App\Post $post) { 
    return $user->hasAccess(['update-post']) || $user->id == $post->user_id || $user->isModerator(); 
}); 

編集 - あなたのコメントに基づいてコメント

からの回答あなたがそうのようにそれを達成することができ、ここでは、クリーンアップコードは次のとおりです。

Gate::define('update-post', function ($user, \App\Post $post) { 
    return ($user->id == $post->user_id && $user->hasAccess(['update-own-post'])) || $user->hasAccess(['update-post']); 
}); 

{first condition} OR {second condition}が基準を満たしているかどうかを確認する理由があります。最初のブロックが真であれば、2番目のブロックは実行されません。しかし、最初のブロックが真でない場合は、最初のブロックが真であるかどうかを確認するために2番目のブロックをチェックします。

+0

私に正しい方向を指摘していただきありがとうございます。私はゲートを以下のように変更することで必要なものを達成することができました: 'Gate :: define( 'update-post'、function($ user、\ App \ Post $ post){ if(($ user-> id trueを返します; else if($ user-> hasAccess(['update-post']) ) true; return }); 'しかし、よりクリーンなコードをいただければ幸いです。 –

+0

私はあなたが持っていることがうれしいです、あなたが持っているもののよりクリーンなバージョンのために私のコードをチェックしてください。また、PHPでOR( '' || '')を調べることをお勧めします。これは余分な条件チェックを取り除くのに役立ちます。 http://php.net/manual/en/language.operators.logical.php – kyle

関連する問題