Laravel 8:如何为路由存储自定义属性?
Laravel 8 路由自定义元数据(页面标题等)的实用方案
给路由加页面标题这类自定义键值对,不用绕弯路,下面这几种方法直接靠谱,完全满足需求:
一、自定义路由宏(链式调用友好)
你之前想的路由宏思路是对的,大概率是写法有问题导致不可行。按下面步骤来:
- 在
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; }); }
- 路由里直接链式调用:
Route::get('/themetest', [MyController::class, 'list']) ->name('themetest') ->metadata(['title' => 'Page Title', 'description' => '主题测试页']);
- 调用元数据的方式:
- 控制器里:
$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数组里取。
三、中间件全局共享(适合全站统一处理)
如果需要把路由元数据自动共享给所有视图,写个中间件更省心:
- 创建中间件:
php artisan make:middleware ShareRouteMetadata
- 编辑中间件
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); } }
- 在
app/Http/Kernel.php的web中间件组里注册这个中间件:
protected $middlewareGroups = [ 'web' => [ // ...其他中间件 \App\Http\Middleware\ShareRouteMetadata::class, ], ];
- 之后在任何视图里直接用:
<title>{{ $routeMetadata['title'] ?? '默认标题' }}</title>
为什么不推荐用default()?
你担心的没错,default()是用来设置路由参数的默认值,会直接影响控制器方法的参数注入,用来存自定义元数据完全是误用,别这么干。
内容的提问来源于stack exchange,提问作者asdflkadslkfadsfjasdadsfsad
相关产品推荐
相关产品推荐

