本节加载子视图哪里,似乎少了一个Auth::user()的传入

教程中的show.blade.php

本节加载子视图哪里,似乎少了一个Auth::user()的传入

访问用户信息 host/users/3 会提示Use Model类的isFollowing方法未定义,无论id是多少都是一样的

本节加载子视图哪里,似乎少了一个Auth::user()的传入

解决办法
传递要给Auth::user()过去就好了

本节加载子视图哪里,似乎少了一个Auth::user()的传入

本节加载子视图哪里,似乎少了一个Auth::user()的传入

这里面的子视图有点局部变量的味道。
引入的子视图传递过去的话,似乎就无法捕捉这种认证过的user信息

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 12

同学你好
最近新人好像多起来了:smile:
这个地方是不需要传参 $user 的,因为 Laravel 的视图之间是可以继承共享变量的,如果子视图没有 $user,代表引用子视图的父视图也没有 $user,你可以在 show.blade.php 打印一下 $user,看看是否能正常访问。

3年前 评论

感谢你的意见。但是我核实 了一下教程,发现教程上这一小结_follow_form.blade.php 并没有写继承,而是在show.blade.php里面直接引入的这个文件。下面是教程上的截图 file

file

3年前 评论
MArtian 3年前
MArtian 3年前

下面的截图就是 show.blade.php 我的代码

file

下面是我 _follow_form.blade.php 的代码

file


在上图 show.blade.php 的第17行,教程上的代码如下

@include('users._follow_form')

当我按照教程上的代码访问的时候,提示错误信息 file

我也赞同你的说法,应该是在子视图里面可以访问到Auth::user() 这个模型类的。但是他的确报错了。

然后我查询我第一次刷教程一的时候写的代码,在show.blade.php中是这样写的,参见下方代码。没有引入Auth::user() 不会报错

@if (Auth::check())
      @include('users._follow_form')
    @endif

后来我比对了文件,没有任何的差别。因此我认为将 Auth::user() 传递到子视图中会是一个好的做法

3年前 评论
MArtian 3年前
MArtian 3年前
sinmu (作者) (楼主) 3年前
sinmu (作者) (楼主) 3年前

@sinmu 有结论了
你的 User.php 模型没有 isFollowing 方法,打开你的 User.php 模型,到 98 行,方法名写错了,你写的是 isFolllowing,多写了一个 l,改一下就解决了。

最后再说一下这里的业务逻辑,以及为什么不能传 Auth::user() 变量给 _follow_form.blade.php,还有为什么你传了之后就不报错了。

仔细看

@include('users._follow_form',['user' => Auth::user()])

你是这么写的,然后就不报错了,这是为什么呢?

我们来看 _follow_form.blade.php 模板

@can('follow', $user)   
// 看到这个 $user 了吗?它是继承自 `show.blade.php` 的,是控制器传递给它的变量,这个 $user 可以是任何用户,不是当前登录用户!!! 比如访问的路由地址是:/users/2 ,就是 id 为 2 的用户, /100 就是 id 100 这个用户,这个 $user 和 Auth::user() 要分清楚, $user 是你要查看的用户, Auth::user() 是当前登录的用户
  <div class="text-center mt-2 mb-4">
    @if (Auth::user()->isFollowing($user->id))

然后当你给 _follow_form 传递 ['user' => Auth::user()] ,这个操作就是把 _follow_form 继承自 show.blade.php$user 给覆写了, _follow_form$user 本来是继承自 show.blade.php 的 id 为 2 的用户,但是被你这么一传,$user 就变成当前登录的用户了。

但是你得出的结论是这样是没问题的,这样写就不报错了,确实不报错了,为什么呢?再来看 _follow_form

@can('follow', $user)

这里判断的是当前登录用户能不能 关注 当前访问的这个 $user,但是 $user 被你覆写成当前登录用户了,因为我们在 policy 中定义了 follow 策略,自己当然不能关注自己了,其实后面的代码都没有执行,所以没报错。

3年前 评论
MArtian (作者) 3年前
sinmu (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!