Laravel应用中array_merge报错:参数为对象而非数组的解决办法
解决Laravel 8中array_merge报错及视图变量未定义问题
问题根源
你遇到的两个错误本质是同一个问题:$this->site_settings是Eloquent模型对象,不是数组:
- 直接用
array_merge($this->site_settings, [...])报错,因为array_merge要求参数必须是数组; - 改成
[$this->site_settings]后,站点配置被包裹成二维数组,Blade模板里$site_name自然找不到,因为它嵌套在数组的第一个元素对象里。
具体解决方法
方法1:将模型对象转为数组后合并
在ArticlesController的index方法里,用toArray()把site_settings转成数组,再和文章数组合并:
public function index() { $articles = Article::all(); // 你的文章查询逻辑 $siteSettings = $this->site_settings->toArray(); // 转成数组 return view('articles.index', array_merge($siteSettings, ['articles' => $articles])); }
传递到视图后,$site_name这类配置变量就能直接在layout.blade.php里调用。
方法2:直接传递对象+文章数据(更简洁)
如果不想转数组,也可以直接把对象和文章数据分开传递,在视图里通过对象访问属性:
public function index() { $articles = Article::all(); return view('articles.index', [ 'site_settings' => $this->site_settings, 'articles' => $articles ]); }
然后在layout.blade.php里用{{ $site_settings->site_name }}调用配置项。
方法3:全局共享站点配置(推荐)
既然是全站通用的配置,没必要在每个控制器里单独传递,可以在AppServiceProvider的boot方法里全局共享:
use App\Models\Setting; public function boot() { $siteSettings = Setting::first(); // 假设settings表仅存一条全站配置 view()->share('site_settings', $siteSettings); // 也可以转成数组后共享,直接用变量名调用 // view()->share($siteSettings->toArray()); }
这样所有视图里都能直接访问$site_settings对象,或者如果转成数组共享,就能直接用$site_name这类变量,无需在每个控制器重复处理。
内容的提问来源于stack exchange,提问作者Razvan Zamfir
相关产品推荐
相关产品推荐

