Laravel报错‘Trying to get property of non-object’问题排查求助
问题分析与解决方案
嘿,这个问题我之前踩过一模一样的坑,典型的数组与对象访问语法混淆导致的错误!
错误根源
你在控制器里把$args定义成了数组:
$args = array(); $args['name'] = "Robin"; $args['email'] = "asdasd@asdasd.net";
但在视图里却误用了对象的属性访问语法(->):
{{ $args->name }} {{ $args->email }}
PHP抛出“Trying to get property of non-object”错误,核心原因就是$args本质是数组,不是对象,自然不能用对象的方式访问元素。
至于循环部分能正常运行,是因为你用了正确的数组访问语法$args['activity'],和控制器里的赋值逻辑完全匹配,所以能正确拿到数据。
两种解决方案
方案1:保持数组结构,修改视图访问方式
控制器代码不用动,只需要把视图里的对象访问改成数组下标访问即可:
{{ $args['name'] }} {{ $args['email'] }} @if (isset($args['activity'])) @foreach ($args['activity'] as $act) {{$act->job_name}} @endforeach @endif
方案2:改用对象传递(更符合Laravel常用写法)
把控制器里的$args改成对象,这样视图里的->访问就合法了:
// 控制器代码修改 $args = new \stdClass(); $args->name = "Robin"; $args->email = "asdasd@asdasd.net"; $clientpayments = Payments::getPaymentByClient($id); $args->activity = $clientpayments; return view('clients.show',["args" => $args]);
或者更推荐Laravel的简洁写法,直接拆分变量用compact传递,避免打包成单个数组/对象,代码可读性更高:
// 控制器代码优化 $name = "Robin"; $email = "asdasd@asdasd.net"; $activity = Payments::getPaymentByClient($id); return view('clients.show', compact('name', 'email', 'activity'));
对应的视图代码也更清爽:
{{ $name }} {{ $email }} @if (isset($activity)) @foreach ($activity as $act) {{$act->job_name}} @endforeach @endif
内容的提问来源于stack exchange,提问作者user608207
相关产品推荐
相关产品推荐

