当特定角色通过身份验证时让按钮消失

Let button disappear when certain role is authenticated

我有两个不同的表,其中存储了两种不同类型的用户。

第一个是门户用户,第二个是员工。

现在我有一个所有帖子的概览页面,Portal 用户应该可以在其中使用部门的筛选按钮。

员工也应该能够使用它,如果他们的角色不是“FBL”的话。

所以我用这段代码试了一下:

@if(auth()->user()->Rolle != 'FBL')
                <div class="text-left mb-4 h-12">
                    <select name="abteilung" id="abteilung" class="h-full w-full flex justify-center bg-white bg-opacity-95 rounded focus:ring-2 border border-gray-300 focus:border-indigo-500 text-base
                                outline-none text-gray-700 text-lg text-center leading-8">

                        <option selected="true" disabled="false">Abteilung</option>
                        @foreach($abteilungs as $abteilung)
                            <option value="{{ $abteilung->abteilung_name }}">{{ $abteilung->abteilung_name }}</option>
                        @endforeach
                        <option value="alle">Alle Abteilungen</option>
                    </select>
                </div>
                @endif

但是当没有人通过身份验证时,访客正在使用该页面,我得到一个错误 Attempt to read property "Rolle" on null - 这是有道理的,因为没有人通过身份验证。

但我也试过把它放在 @if:

之前
@auth('web')
   @auth('portal')
      @auth('guest')

我有两个守卫,一个是默认 laravel 守卫,第二个是我为门户用户自定义的 portal守卫。

我有什么方法可以使它起作用,以便当来宾、门户用户和没有“Rolle = FBL”的员工时按钮可用,但当具有此特定角色的人登录时该按钮消失在?

您需要在尝试访问用户对象之前检查用户是否已登录。

要让 Rolle 而非 FBL 的来宾和用户看到它,请使用:

@if( ! auth()->check() || auth()->user()->Rolle != 'FBL')

https://laravel.com/docs/8.x/authentication#determining-if-the-current-user-is-authenticated

您需要使用嵌套的 if 语句,即

// 检查用户是来宾、门户用户还是员工

if user == guest 

{

// write the code here for what guest should see

}

// so user is not guest

else 

{

// check if user is employee or portal user

    if user == employee

     {

     // write the code here for what employee should see

     }

     // user is not employee so user is portal user

     else

     {
    
      // write the code here for what portal use should see
     
     }
}

我认为,在你的情况下,最好的解决方案是:

1:检查用户是否登录

2:检查角色,但我不会写太多“如果”,而是这样做(按照您的代码)

//In your folder providers->AppServiceProvider.php -> method "boot"

    public function boot()
        {
            Blade::if('notfbl', function (User $user) { // you name it as you want I named it "notfbl", the parameter is the logged user
                return $user->id == auth()->user()->role_id != 1; // Here I assumed that the id of the FBL role is 1, you adjust it
            });
        }

// 在你的 blade 文件中,你可以在你需要的每个部分使用“@notfbl($user)”,还可以创建更多

        @auth // Everything inside "@auth" will be shown ONLY if the user is authenticated. If you want to do something for unauthenticated users you should write your html/code inside the "@guest @endguest" tags
            @notfbl($user) // It will be shown ONLY for users with role different to FBL
                <div class="text-left mb-4 h-12">
                    <select name="abteilung" id="abteilung" class="h-full w-full 
                       flex justify-center bg-white bg-opacity-95 rounded focus:ring-2 border border-gray-300 focus:border-indigo-500 text-base outline-none text-gray-700 text-lg text-center leading-8">
                        <option selected="true" disabled="false">Abteilung</option>
                            @foreach($abteilungs as $abteilung)
                                <option value="{{ $abteilung->abteilung_name }}">{{ $abteilung->abteilung_name }}</option>
                            @endforeach
                        <option value="alle">Alle Abteilungen</option>
                    </select>
                </div>
            @endnotfbl
        @endauth