首页 > 解决方案 > 如何声明对所有刀片文件可用的全局变量?

问题描述

我在数据库中有产品,这些产品基本上用于每个页面。不必查询数据库,而是这样:

$products = DB::table("products")->get();

然后将其传递到视图中:

return view("site.products", array(
   'products' => $products,
)); 

我不想对每个视图都这样做。相反,我希望 $products 默认情况下可用于所有模板......这样我就可以这样做:

@foreach ($products as $product) 
 ... etc

我将如何以全局方式声明它以实现这一目标?

标签: laravel

解决方案


推荐的方法是添加一个中间件,将其应用于您想要影响的所有路由。

中间件

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

class GlobalVariablesMiddleware
{
    $myVariable = "Value For Everyone";
    View::share(['globalValue' => $myVariable]);
}

将其添加到 Http 文件夹中的 kernel.php

protected $routeMiddleware = [
        ...
        'myMiddleware' => \App\Http\Middleware\ GlobalVariablesMiddleware::class,
];

设置完成后,您可以轻松地将其应用于单个路线或分组路线,以实现您所寻找的

// Routes that will have the middleware    
Route::middleware(['myMiddleware'])->group(function () {
    
        // My first route that will have the global value
        Route::resource('/profile', App\Http\Controllers\ProfileController::class);

        // My second route that will have the global value
        Route::resource('/posts', App\Http\Controllers\PostController::class);
    });

通过这种方式,如果您选择不让数据全局化,您可以在未来轻松控制数据。


推荐阅读