php - 在扩展 laravel blade 模板中显示不同的用户图像

我正在尝试在 Laravel 8 项目中包含的标题模板中显示用户图片。基本上,我有不同类型的用户(管理员和讲师),他们有不同的中间件和页面。我想继承相同的标题并根据用户类型显示他们的头像图片。到目前为止我所做的是: header.blade.php

@php
          $instructor =  DB::table('instructors')->where('id', Auth::guard('instructor')->user()->id)->first();
          $admin =  DB::table('admins')->where('id', Auth::guard('admin')->user()->id)->first();

      @endphp
      <!-- User Account-->
      <li class="dropdown user user-menu">  
        <a href="#" class="waves-effect waves-light rounded dropdown-toggle p-0" data-toggle="dropdown" title="User">
            @if ($admin)
            <img src="{{ (!empty($admin->image))? url('upload/admin_images/'.$admin->image) : url('upload/no_image.jpg') }}" alt="">
            @elseif ($instructor)
            <img src="{{ (!empty($instructor->image))? url('upload/admin_images/'.$instructor->image) : url('upload/no_image.jpg') }}" alt="">
            @else
            <img src="{{ asset('images/1.jpg') }}" alt="">
            @endif

给我的错误是:

Trying to get property 'id' of non-object

仅当我尝试以讲师身份登录时才会显示此错误。两种用户类型的中间件、登录控制器基本相同。仅当我从 header.blade.php 中完全删除 $admin 变量时,讲师登录才能完美运行。我还尝试对 if 和 elseif 条件进行不同的排序,但没有任何改变。有没有人知道如何解决它?

回答1

首先,永远不要在 Blade 模板中使用 @php。逻辑绝对不属于您的观点,它们仅用于显示信息。如果您确实需要访问视图中的变量,请在控制器中分配它并https://stackoverflow.com/questions/18341792/how-to-pass-data-to-view-in-laravel

您的错误正在发生,因为您试图获取有关两个不同警卫的信息,而用户只会拥有一个或另一个。 Blade 提供了使用https://laravel.com/docs/9.x/blade#authentication-directives 检查当前用户警卫的能力。

您可以指定特定的守卫,但这无关紧要,因为条件的每个分支内都有相同的代码

<!-- User Account-->
<li class="dropdown user user-menu">  
    <a href="#" class="waves-effect waves-light rounded dropdown-toggle p-0" data-toggle="dropdown" title="User">
        @auth
        <img src="{{ url('upload/admin_images/' . Auth::user()->image ?? '../no_image.jpg') }}" alt="">
        @endauth
        @guest
        <img src="{{ asset('images/1.jpg') }}" alt="">
        @endguest
    </a>
</li>

但是,如果您需要检查特定的警卫,请使用以下语法:

<div>
Welcome, you are authenticated as 
@auth('admin')
an administrator
@auth('instructor')
an instructor
@endauth
</div>

相似文章