2017-08-24 48 views
1

我想顯示具有「管理員」角色的用戶的表單。我怎麼能做到這一點?現在,我總是假的。Laravel。顯示索引政策

政策

public function view(User $user) 
{ 
    foreach ($user->roles as $role) { 
     $role->name == 'admin'; 
    } 
    return true; 
} 

控制器

public function index() 
{ 
    $user = Auth::user(); 
    if($user->can('view', $user)) 
    { 
     $listSections = Section::all(); 
     return view('sections.index', compact('listSections')); 
    } 
    else 
    { 
     abort(403, 'Only admins can'); 
    } 
} 

查看

@can('view') 
    @include('sections.show') 
@endcan 

THX的幫助。

回答

1

您處於您嘗試授權不需要任何模型的操作的情況。讓我解釋。

從Laravel文檔:

附帶您的Laravel應用程序的用戶模型包括授權行動兩個有用的方法:可以和着

這意味着Laravel將通過實例用戶模型作爲每個「可以」操作方法的第一個參數(您的情況爲view())。因此,當您聲明操作方法(您的案例中爲view())時,第一個參數應始終爲User $user。你做了哪些。

但是,當您編寫$user->can('view', $user)時,第一個$user變量(對象運算符左側的箭頭)會引用view()方法的第一個參數。第二個$user變量 - can()方法的第二個參數 - 應該是view()方法的第二個參數。這是問題。你應該有:

public function view(User $authenticatedUser, User $user) 
{ 
    foreach ($user->roles as $role) { 
     $role->name == 'admin'; 
    } 

    return true; 
} 

但是這對你的情況完全沒用。

其實您的view()方法不需要任何模型。在這種情況下,您可以簡單地指定需要用於確定在授權操作時使用哪個策略的類名稱。你可以這樣做:

if ($user->can('view', Section::class)) { 
    $listSections = Section::all(); 
    return view('sections.index', compact('listSections')); 
} 

我建議你閱讀Laravel文檔的這些段落:

順便說一句:

您的view()方法將始終返回trueforeach是沒用的。也許嘗試使用Laravel的集合是這樣的:

public function view(User $user) 
{ 
    $isUserAdmin = user->roles->search(function($role) { 
     return $role->name === 'admin'; 
    }); 

    return ($isUserAdmin !== false) ? true : false; 
} 
+0

我用你的建議和工作,但方法'can()',它停止工作,因爲'是undefined':O。現在我用'$ this-> authorize('view',Section :: class);' 它好嗎? 非常感謝您提供詳盡的答案和幫助;) – funfelfonfafis

+0

您確定該用戶存在嗎?否則,'$ user'變量將爲空,並且'can()'方法將是未定義的。使用'authorize()'輔助工具是很好的,甚至是在控制器中工作時doc的建議;) – louisfischer

+0

ohh,我覺得內疚。 '$ this-> authorize('index',Section :: class);'我在方法'can()'之前忘記了註釋。 現在所有的作品。再次thx爲您的幫助。 – funfelfonfafis

-1

你有沒有在AuthServiceProvider註冊政策?

+0

是,'保護$政策= [ '應用\節'=> '應用程序\策略\ SectionPolicy', ]' – funfelfonfafis