Php 对成员函数can()的调用为null

Php 对成员函数can()的调用为null,php,laravel,Php,Laravel,我正在使用Laravel5.7,我正在遵循文档 我得到了错误 对成员函数的调用不能为空 我以为can方法总是可用的?当然,我不必在每次测试gate之前检查auth->user是否为null?如果用户返回null,在这种情况下,很可能是因为用户未经身份验证/注销。 试一试 ,而不是直接在用户模型上调用它们。它在您的示例中中断,因为没有经过身份验证的用户,所以您在null上调用can 实际上,错误是Auth::user函数无法找到已登录的用户…如果您已登录,并且再次出现错误,则意味着确保会话是否已过

我正在使用Laravel5.7,我正在遵循文档

我得到了错误

对成员函数的调用不能为空


我以为can方法总是可用的?当然,我不必在每次测试gate之前检查auth->user是否为null?

如果用户返回null,在这种情况下,很可能是因为用户未经身份验证/注销。 试一试

,而不是直接在用户模型上调用它们。它在您的示例中中断,因为没有经过身份验证的用户,所以您在null上调用can


实际上,错误是Auth::user函数无法找到已登录的用户…如果您已登录,并且再次出现错误,则意味着确保会话是否已过期。因为有时候我们在认真工作的时候忘记了会议的结束时间。
为了避免这种情况,请在控制器中也使用auth中间件来保护路由。因此,如果会话已过期,并且您正在点击查看页面,它将自动将您带到登录屏幕

当然,如果在auth->user上调用can,则必须验证是否返回了用户。为什么总是可以使用?因为文档说,当然,该方法可以在Auth::user对象上始终可用。并不意味着对象总是可用的。如果您想要未经授权的用户可以看到的视图,请使用@auth/@else/@endauth来显示某些部分。文档中说auth->user->can始终可用的地方是哪里?API文档声明用户可以返回null或可验证的实例:所以每次需要测试一个gate时,我需要用optionalauth->user->can'update-properties'将其包装起来?@auth更好
@if(auth()->user()->can('update-properties') and $child_types)
     {!! Form::select('type_2', $type_2_options, null, ['placeholder' => __('places.none'), 'class' => 'custom-select custom-select-sm w-50']) !!}
@else
  @if(!Auth::guest()) 

    @if(auth()->user()->can('update-properties') and $child_types)
     {!! Form::select('type_2', $type_2_options, null, ['placeholder' => __('places.none'), 'class' => 'custom-select custom-select-sm w-50']) !!}
    @else

     (rest of code here)

  @endif
// Map directly to a model policy
@can('update', $property)
    //
@endcan

// Use custom action
@can('update-properties)
    //
@endcan