Laravel 5.7 通过控制器向视图传递变量, 视图无法获取 (已解决)

思路:
在中间件中获取用户登录状态.如果未登录,则跳转登录,若已登录,获取相关信息,传递给视图显示,所有控制器有个构造器,不过内容和中间件不冲突,就不提供了.
中间件代码,$admin_truename是我要传递的参数

public function handle($request, Closure $next)
{
    $response = $next($request);
    $admin=session('admin');
    if($admin==NULL){
        return redirect("service/login");
        die;
    }else{
        $admin_truename=$admin->truename;
        view()->share('admin_truename',$admin_truename);
    }
    return $response;
}

视图显示:
<title>{{$webName}} {{$admin_truename}}</title>
错误信息:

 ErrorException (E_ERROR)
Undefined variable: admin_truename

我看文档确实是这样写的,为什么就报错呢?

$response = $next($request);
我一直以为这个是获取请求并记录,直到
return $response;
才会去继续执行请求.
不知道脑子去哪里了

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
nfangxu
最佳答案

检测登录的操作应该限制在 $next($request) 之前, 未登录的时候, 不能让他走到 controller 里面;
如果写在这个后面, 他会在 controller 里处理完之后再回到中间件, 有可能会使你的业务出现不可预知的问题

4年前 评论
kofjjj (楼主) 4年前
nfangxu (作者) 4年前
讨论数量: 7
draven

这样试一下

handle
        $array= ['test'=>'test'];
        $request->attributes->add($array);

controller

        public function test(Request $request) {
            $request->get('test')
        }
4年前 评论
kofjjj (楼主) 4年前

直接在视图文件使用Auth::User()获取用户登录状态.例如需要获取用户名 Auth::User()->username

4年前 评论
kofjjj (楼主) 4年前
kangfq (作者) 4年前

这样试试

file

4年前 评论
kofjjj (楼主) 4年前
nfangxu

在生产 $next($request) 的时候, 视图已经解析完毕, 你可以打印一下 $response , 你这样写肯定会报错;

你可以在中间件里给 Response 添加参数, 在 view 中直接使用 request 去获得相关内容

4年前 评论
kofjjj (楼主) 4年前
nfangxu (作者) 4年前
kofjjj (楼主) 4年前
nfangxu

检测登录的操作应该限制在 $next($request) 之前, 未登录的时候, 不能让他走到 controller 里面;
如果写在这个后面, 他会在 controller 里处理完之后再回到中间件, 有可能会使你的业务出现不可预知的问题

4年前 评论
kofjjj (楼主) 4年前
nfangxu (作者) 4年前
nfangxu

忽然意识到, 你在 view 里直接读 session 不就行了吗

4年前 评论
kofjjj (楼主) 4年前
nfangxu

总结一下哈

  • 首先, 一个中间件做的应该只有一件事, 你在这个中间件里, 既检测登录, 又给视图传值, 是不合理的
  • 其次, 在 $next($request) 执行完之后, response 已经生成了, 也就是视图已经解析完毕了, 你在这之后对 view 的操作都是无意义的
  • 最后, 你既然不想在每个view里都写一个写一个 session ('admin')->name , 为什么要在每个页面都写一个 $admin_name 呢, 他们的本质上是没有区别的

以下是建议

  • 将中间件的功能独立开, 只检测登录, 数据的处理放在别的地方;
  • 将视图拆开, 使用继承, 在功能模板里使用 session('admin')->name; 这样也不会在每个 view 里调用
4年前 评论
kofjjj (楼主) 4年前
kofjjj (楼主) 4年前

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