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

Laravel 8:如何为路由存储自定义属性?

Laravel 8 路由自定义元数据(页面标题等)的实用方案

给路由加页面标题这类自定义键值对,不用绕弯路,下面这几种方法直接靠谱,完全满足需求:

一、自定义路由宏(链式调用友好)

你之前想的路由宏思路是对的,大概率是写法有问题导致不可行。按下面步骤来:

  1. 在App\Providers\RouteServiceProvider的boot方法里定义宏:
use Illuminate\Routing\Route;

public function boot()
{
    parent::boot();

    // 定义metadata宏,支持链式调用
    Route::macro('metadata', function (array $data) {
        // 合并已有元数据(如果有的话)
        $this->attributes['metadata'] = array_merge($this->attributes['metadata'] ?? [], $data);
        // 一定要返回$this,保证链式调用不中断
        return $this;
    });
}
  1. 路由里直接链式调用:
Route::get('/themetest', [MyController::class, 'list'])
    ->name('themetest')
    ->metadata(['title' => 'Page Title', 'description' => '主题测试页']);
  1. 调用元数据的方式:
  • 控制器里:
$routeMetadata = request()->route()->getAction()['metadata'];
// 拿标题:$routeMetadata['title']
  • 视图里:
{{ request()->route()->getAction()['metadata']['title'] }}

二、直接给路由Action加字段(无需宏,最简)

不想定义宏的话,直接在路由定义时给action数组加自定义字段就行,完全原生支持:

Route::get('/themetest', [
    'uses' => [MyController::class, 'list'],
    'metadata' => ['title' => 'Page Title']
])->name('themetest');

获取元数据的方式和上面完全一样,直接从路由的action数组里取。

三、中间件全局共享(适合全站统一处理)

如果需要把路由元数据自动共享给所有视图,写个中间件更省心:

  1. 创建中间件:
php artisan make:middleware ShareRouteMetadata
  1. 编辑中间件app/Http/Middleware/ShareRouteMetadata.php:
namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\View;

class ShareRouteMetadata
{
    public function handle(Request $request, Closure $next)
    {
        // 取出路由元数据,没有的话返回空数组
        $metadata = $request->route()->getAction()['metadata'] ?? [];
        // 共享给所有视图
        View::share('routeMetadata', $metadata);

        return $next($request);
    }
}
  1. 在app/Http/Kernel.php的web中间件组里注册这个中间件:
protected $middlewareGroups = [
    'web' => [
        // ...其他中间件
        \App\Http\Middleware\ShareRouteMetadata::class,
    ],
];
  1. 之后在任何视图里直接用:
<title>{{ $routeMetadata['title'] ?? '默认标题' }}</title>

为什么不推荐用default()?

你担心的没错,default()是用来设置路由参数的默认值,会直接影响控制器方法的参数注入,用来存自定义元数据完全是误用,别这么干。

内容的提问来源于stack exchange,提问作者asdflkadslkfadsfjasdadsfsad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 19:30:53