Laravel正确编写web.php路由实现母版页访问控制器数据
问题原因
当前代码存在两类问题:
- 路由语法错误:将控制器路由配置和闭包逻辑混写,
[LayoutController::class, 'home']后直接拼接花括号不符合Laravel路由语法规范 - 数据作用域问题:如果仅给
home视图传参,母版页默认无法直接读取变量,需要通过视图继承或全局共享的方式传递数据。
正确实现方式
方案1:控制器处理逻辑(官方推荐写法)
首先修正web.php路由定义,移除路由文件中的业务逻辑,仅保留路由和控制器的映射关系:
// 文件顶部引入对应类的命名空间 use App\Http\Controllers\LayoutController; use Illuminate\Support\Facades\Route; Route::get('/', [LayoutController::class, 'home']);
随后在app/Http/Controllers/LayoutController.php中编写home方法逻辑:
<?php namespace App\Http\Controllers; use Illuminate\Support\Facades\DB; class LayoutController extends Controller { public function home() { $abouts = DB::table('home_abouts')->first(); return view('home', compact('abouts')); } }
注意:需要在home.blade.php文件顶部添加@extends('master')声明继承母版页,继承后母版页可直接读取传递的$abouts变量
方案2:闭包路由写法(不推荐,业务逻辑不应耦合在路由文件)
如果不使用控制器,直接在路由文件中写处理逻辑,修正后的web.php代码如下:
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\DB; Route::get('/', function () { $abouts = DB::table('home_abouts')->first(); return view('home', compact('abouts')); });
方案3:全局数据共享(适配母版页全站通用场景)
如果$abouts数据是所有页面都需要展示的公共内容,不需要每个路由单独传参,可以在app/Providers/AppServiceProvider.php的boot方法中做全局视图共享:
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\View; public function boot() { View::share('abouts', DB::table('home_abouts')->first()); }
配置完成后,所有视图文件(包括master.blade.php)都可以直接调用$abouts变量,无需单独传参。
其他修正点
你提供的母版页代码存在HTML标签闭合错误:<h2>About Us</strong></h2> 中h2标签内部多了一个strong闭合标签,建议修正为<h2>About Us</h2>,避免页面结构异常。
内容的提问来源于stack exchange,提问作者SK Sabbir
相关产品推荐
相关产品推荐

