You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 12:18:20