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

Display different User Image in extended laravel blade template

我正在尝试在 Laravel 8 项目的 header 模板中显示用户图片。 基本上,我有不同类型的用户(管理员和讲师),他们有不同的中间件和页面。 我想继承相同的 header 并根据用户类型显示他们的头像。 到目前为止我所做的是: 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 变量时,Instructor 登录才能正常工作。 我还尝试对 if 和 elseif 条件进行不同的排序,但没有任何改变。 有人知道如何解决吗?

首先,永远不要在你的 Blade 模板中使用 @php。逻辑绝对不属于你的观点,它们完全是为了展示信息。如果您确实需要访问视图中的变量,请在控制器中分配它并 pass it to the view.

您的错误发生是因为您试图获取有关两个不同守卫的信息,而用户只会拥有一个或另一个。 Blade 提供了检查当前用户的守卫的能力 the @auth directive.

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

<!-- 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>