Laravel 5.2嵌套雄辩关系
问题描述:
我有一个用户是类型的球员,有几个设备Laravel 5.2嵌套雄辩关系
我想请求一台设备,看看用户是它的主人将其返回给用户之前。如果他们不拥有它,他们将得到一个未经授权的响应
这里有关系,我对型号:
应用程序\ user.php的class User extends Authenticatable
{
protected $table = 'user';
public function player()
{
return $this->hasOne(Player::class);
}
}
应用程序\ Player.php
class Player extends Model
{
protected $table = 'player';
public function equipment()
{
return $this->hasMany(Equipment::class);
}
public function user()
{
return $this->belongsTo(User::class);
}
}
应用\ Equipment.php
class Equipment extends Model
{
protected $table = 'equipement';
public function player()
{
return $this->belongsTo(Player::class);
}
}
EquipmentController.php
随着我尝试这是工作......菊st非常丑陋。
class EquipmentController extends Controller
{
public function show($id)
{
$equipment = Equipment::find($id);
if (! $equipment) {
return 'Equipment does not exist');
}
// my attempt
$test = Equipment::with('player.user')->findOrFail($id);
if ($test->toArray()['player']['user']['id'] != Auth::user()->id){
return 'Unauthorized';
}
//
return $equipment;
}
}
有没有更好的方法来做到这一点?
我想在控制器喜欢的东西可读:
if(!$equipment->ownedBy(Auth::user())){
return 'Unauthorized';
}
或者一些类似的为可读。
一旦找到关系,我不确定逻辑应该放在哪里。它应该在设备模型中吗? 任何帮助将不胜感激!
答
在你Equipment
型号:
public function authorized()
{
return ($this->player->user->id == auth()->user()->id())
}
然后从你的控制器,请尝试:
$equipment->authorized() //returns true or false
这工作完全谢谢。只是另一个疑问,它是否从设备模型的[SRP](https://en.wikipedia.org/wiki/Single_responsibility_principle)中拿走?应该把它放在设备[策略](https://laravel.com/docs/5.1/authorization#policies)类中,并使用Gate类在控制器中授权它? – crwh05
有很多方法可以解决这个问题。这只是一种方法。通过这种方式,您可以在应用中的任何位置使用此功能。即使在刀片视图中。 –