【问题标题】:How to declare global variables available to all Blade Files? [duplicate]如何声明所有刀片文件都可用的全局变量? [复制]
【发布时间】:2021-10-08 13:36:40
【问题描述】:

我的数据库中有产品,基本上每个页面都使用这些产品。不必查询数据库,像这样:

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

然后将其传递到视图中:

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

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

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

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

【问题讨论】:

标签: laravel


【解决方案1】:

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

中间件

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);
    });

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

【讨论】:

    【解决方案2】:

    您可以在AppServiceProvider的启动方法中添加以下代码

    public function boot()
    {
        if (!$this->app->runningInConsole()) {
            $products = DB::table("products")->get();
            \View::share('products', $products);
        }
    }
    

    阅读更多来自here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-24
      • 1970-01-01
      • 2014-10-30
      • 2010-10-30
      相关资源
      最近更新 更多