【问题标题】:Update user roles in Laravel在 Laravel 中更新用户角色
【发布时间】:2021-12-06 08:52:03
【问题描述】:

我有三个用户角色:学生、教师、管理员。

如果用户是学生,我想在下拉菜单中显示将他们提升为教师或管理员的选项,对于其他角色也是如此,例如。教师获得管理员和学生选项。

目前看起来是这样的:

索引

@if ($user->role == 'admin')
    <form action="/admin/users/{{ $user->id }}" method="POST">
        @csrf

        @method('PATCH')

        <input class="hidden" name="role" value="user">

        <button>Make User</button>
    </form>
@else
    <form action="/admin/users/{{ $user->id }}" method="POST">
        @csrf

        @method('PATCH')

        <input class="hidden" name="role"value="teacher">

        <button>Make Teacher</button>
    </form>
@endif

控制器

public function update(User $user)
{
    $attributes = request()->validate([
        'role' => ['required', Rule::exists('users', 'role')]
    ]);

    $user->update($attributes);

    return back()->with('success', 'User Updated!');
}

我如何能够执行 if 语句来列出除分配给用户的当前角色之外的所有角色,或者在控制器中这样做更好?

是否可以将角色放在一个 slug 中,然后运行一个 foreach,这样我就不会重复代码?

我是新的顶级 Laravel,所以任何帮助将不胜感激 :) 谢谢

【问题讨论】:

    标签: php laravel jetstream


    【解决方案1】:
    1. 为您的页面提供所有角色。
    2. 如果不存在则添加到用户hasRole() 方法。
    3. 使用FormRequest 进行验证。
    4. 不要忘记使用$user 获取角色,以避免使用User::with('roles')-&gt;find($id) 进行n+1 次查询。
    @foreach($allRoles as $role)
        @if(! $user->hasRole($role)) 
            Your form
        @endif
    @endforeach
    

    【讨论】:

    • 感谢您的建议。如何向我的页面提供“$allRoles”?您能否为控制器中的“hasRoles()”提供代码?抱歉,我对 Laravel 还很陌生,但仍然理解它。
    • 在您的控制器中:view('your.path.to.page.index', ['allRoles' =&gt; Role::all()]);
    • hasRole() 方法应该在您的 User 类中,并且根据访问控制系统的实现方式,检查其中是否存在角色。
    • 例如如果你有一个一对多的关系:public function hasRole($role) { return $this-&gt;role-&gt;id === $role-&gt;id; }但是如果这个关系是多对多的,那么你需要用另一种方式检查它
    • 好的,我相信我通过在控制器中将角色作为数组传递来对 allRoles 问题进行了排序。目前我有一个名为 CheckRole.php 的中间件,它检查用户角色并在导航中显示正确的视图。我没有使用 hasRoles() 方法对用户进行身份验证。
    猜你喜欢
    • 2018-11-04
    • 2016-12-08
    • 2017-08-10
    • 2021-08-22
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多