【问题标题】:Laravel 5.8, Auth::user() is not using User modelLaravel 5.8,Auth::user() 未使用用户模型
【发布时间】:2019-11-16 19:25:46
【问题描述】:

我的用户模型中有一个名为 isAdmin 的函数,如果数据库中的“Admin”设置为 1,则返回 true,否则返回 false。

这将如何与Auth::user() 一起使用?

当我执行Auth::user()->isAdmin() 时,它返回"Property [admin] does not exist on this collection instance."

这就是为什么我得出结论它可能不使用用户模型?

用户模型

public function isAdmin() {
   if($this->admin == 1) {
        return true;
     } else {
        return false;
   }
}
public function view () 
    {
        if(Auth::check() && Auth::user()->isAdmin()) {
            $user  = User::all();
            $post  = Post::all();
            $visit = Visits::all();


            return view('admin')->with('post', $post)->with('user', $user)->with('visit', $visit);
        } else {
            return redirect()->to('/');
        }
    }

【问题讨论】:

  • 使用 Auth::user()->isAdmin();
  • 抱歉,我的问题打错了。我已经在使用 Auth::user()->isAdmin())
  • @CunnertA 共享您的 isAdmin 方法中的代码,因为显然您正在检查集合实例上是否存在属性。
  • 我已经添加了我的代码
  • 您确定执行此操作时会出现错误吗?你有没有检查dd(Auth::user()->isAdmin()); 结果是什么?对我来说,您似乎正在User::all()->isAdmin(); 的某个地方尝试

标签: php laravel


【解决方案1】:

如果我可以建议,对于这个用例,您实际上可以在没有额外功能的情况下使用。你可以说auth()->user()->admin,特别是如果数据库中的'admin'列是布尔类型。

否则(即使管理员列不是布尔类型)你可以在模型中设置一个 mutator 方法,如下所示:

public function getIsAdminAttribute()
{
   return (bool) $this->admin;
}

然后检查您是否可以像这样访问它:Auth::user()->isAdminauth()->user()->isAdmin

更好的是,您可能想了解GatePolicies 以实现更强大的访问控制。 https://laravel.com/docs/5.7/authorization

【讨论】:

  • 调用is_adminadmin 并没有什么不同,OP 提到想要使用一个方法:) + 而不是像OP 那样强制转换它可以添加protected $casts = ['admin' => 'boolean']; 在模型,它会达到同样的效果。
  • @nakov 不错。 casts 数组是另一种强制转换方法,它满足了我的主要关注点(第一点),即有一个额外的方法。
  • 无论如何1 = true0 = false 在PHP 中,所以不需要强制转换,除非用户需要在某处显示truefalse :) 错误确实很明显,但是用户离开了:)
  • 谢谢!我把它变成了布尔值并改变了我的方法。干净多了:)
  • @CunnertA 我真的希望你教我这如何解决你在上面分享的问题:D
【解决方案2】:

建议,把代码改成这样:

public function isAdmin() {
    return $this->admin;
}

此代码与您上面的代码完全相同..

现在在您的admin.blade.php 中您正在使用:

$user->isAdmin();

但是在控制器中你有:

$user  = User::all();

返回集合。

您应该对其进行迭代,并检查每个用户实例是否是管理员:

$users  = User::all();

在视图中:

@foreach($users as $user)
 @if($user->isAdmin())
    {{ $user->name }} // some code here..
 @endif
@endforeach

【讨论】:

    【解决方案3】:

    不需要做任何事情,只需检查登录然后 auth()->check() 是否返回 true 然后 auth()->user() 返回用户

    public function view () 
        {
            if(auth()->check() && auth()->user()->isAdmin()) {
                $user  = User::all();
                $post  = Post::all();
                $visit = Visits::all();
    
    
                return view('admin')->with('post', $post)->with('user', $user)->with('visit', $visit);
            } else {
                return redirect()->to('/');
            }
        }
    
    public function isAdmin()
        {
            return $this->admin;
    
        }
    
    

    【讨论】:

    • tbh 我喜欢使用函数的方式,它对我来说更干净。
    • 我改了答案。请检查一下
    • view() 方法中不需要 else 块,因为在 if 块中使用了 return 语句,如果if 声明是正确的。如果if 语句为假,则执行将跳转到return redirect()->to('/');
    • 我只是修复他的功能& auth()->user()
    • @albus_severus else 块在这里没有任何意义。因为the return statement在函数内部调用时会立即终止函数的执行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 2020-05-20
    • 1970-01-01
    • 2020-03-05
    • 2023-04-04
    • 2016-08-18
    • 2020-04-22
    相关资源
    最近更新 更多