首页 > 解决方案 > 为未登录的人创建门

问题描述

我正在尝试使用 Laravel 创建一个网页。我有 3 种类型的用户:用户、成员、管理员。当有人注册时,他们就成为了用户。有一些限制区域只能由会员和管理员看到。我可以通过在刀片页面中使用门和@can 来使其发挥这些限制。但是在某些部分,我需要更改内容。例如,我想向访问者和用户显示横幅,同时在同一个 div 中向成员和管理员显示消息。为了实现这一点,我想我需要两件事的帮助:

  1. 如何为没有登录的人创建一个门(我们称他们为访客)?我为访客尝试了以下替代方案,显然它们都不起作用,所以我来了。如果我显示 Auth::check() 它在我登录时返回 1。我真的不明白为什么 !=1 不起作用。

    Gate::define('visitors', function()
    {
        return Auth::user() == false;
        return Auth::user() == null;
        return Auth::check() == false;
        return Auth::check() == null;
        return Auth::check() != 1;
    });
    
  2. 如何将访问者和用户合并到一个门中。因为几乎在每一个实例中,访问者和用户都可以看到相同的内容。我找不到任何方法来合并访问者和用户。我尝试像 @can('visitors', 'users') ... 一样一起传递两个,并创建两个具有相同名称的不同门,如下所示,但它们不起作用。顺便说一句,用户的 role_id 为 NULL。这是唯一可以用来将他们与成员和管理员区分开来的数据。

    Gate::define('visitors', function()
    {
        return Auth::user() == false;
    });
    Gate::define('visitors', function()
    {
        return is_null($user->role_id);
    });
    

感谢您的帮助。

编辑:经过 2 天的挣扎,原来我的问题的第一部分很容易解决。我只需要像这样包装内容:

@geust
   <div>Something nice</div>
@endauth

第二部还在继续。我需要同时使用@guest 和@can('users')。

标签: laravel

解决方案


我找到了答案,我想在这里分享给那些可能需要的人。

  1. 事实证明,答案非常简单。像这样包装你的内容。

    @geust
       <div>Something nice</div>
    @endauth
    
  2. 我所需要的只是创建一个逻辑来结合访问者和用户

    @if (Auth::user() && is_null(Auth::user()->role_id) || Auth::guest()) {
        <div>Something nice</div>
    @endif
    

奖励:我还设法创建了自定义刀片指令。如果您要寻找类似的东西,这是我的示例。

    //AppServiceProvider.php

    use Auth;
    use Illuminate\Support\Facades\Blade;
    ...
    public function boot()
    {
        Blade::if('EveryoneElse', function(){
            return Auth::user() && is_null(Auth::user()->role_id) || Auth::guest();
        });
    }

在刀片模板文件中。

    @EveryoneElse
        <div>Something nice</div>
    @endEveryoneElse

推荐阅读