Laravel 5 - 所有模板中可用的全局 Blade 视图变量

Laravel 5 - global Blade view variable available in all templates

如何在 Laravel 5 中创建全局变量,使其在所有 Blade 模板中可用?

您可以使用 view composers 执行此操作。加载模板时执行视图组合器。您可以为该视图传入一个具有附加功能的闭包。使用视图作曲家,您可以使用通配符。要为每个视图制作视图编辑器,只需使用 *.

View::composer('*', function($view)
{
    $view->with('variable','Test value');
});

您也可以在不关闭的情况下执行此操作,如您在文档中所见。

View::composer('*', 'App\Http\ViewComposers\ProfileComposer');

配置文件编写器 class 必须具有编写方法。

视图合成器在渲染视图时执行。 Laravel 也查看了创建者。这些在实例化视图时执行。

您还可以选择将 BaseController 与 setupLayout 方法结合使用。然后,您将加载的每个视图都通过添加一些额外数据的 setupLayout 方法加载。但是,通过使用视图组合器,您可以非常确定代码已执行。但是使用 BaseController 方法你有更大的灵活性,因为你可以跳过额外数据的加载。

编辑:如 Nic Gutierrez 所述,您还可以使用视图共享。

Create a new Service Provider as suggested in here

将您的新服务提供商添加到配置文件 (config/app.php)。

在您的新服务提供商的启动方法中使用:

View::share( 'something_cool', 'this is a cool shared variable' );

现在您可以在所有视图中使用 $something_cool。

希望对您有所帮助。

选项 1:

您可以像这样使用 view::share()

<?php namespace App\Http\Controllers;

use View;

//You can create a BaseController:

class BaseController extends Controller {

    public $variable1 = "I am Data";

    public function __construct() {

       $variable2 = "I am Data 2";


       View::share ( 'variable1', $this->variable1 );
       View::share ( 'variable2', $variable2 );
       View::share ( 'variable3', 'I am Data 3' );
       View::share ( 'variable4', ['name'=>'Franky','address'=>'Mars'] );
    }  

}

class HomeController extends BaseController {

    //if you have a constructor in other controllers you need call constructor of parent controller (i.e. BaseController) like so:

    public function __construct(){
       parent::__construct();
    }

    public function Index(){
      //All variable will be available in views
      return view('home');
    }

}

选项 2: 使用作曲家:

  1. app\Composers\HomeComposer.php
  2. 创建作曲家文件

注意:如果 app\Composers 不存在则创建

<?php namespace App\Composers;

class HomeComposer
{

    public function compose($view)
    {
        //Add your variables
        $view->with('variable1',      'I am Data')
             ->with('variable2',      'I am Data 2');
    }
}

然后您可以通过执行此操作将作曲家附加到任何视图

<?php namespace App\Http\Controllers;

use View;

class HomeController extends Controller{


    public function __construct(){

        View::composers([
            'App\Composers\HomeComposer'  => ['home'] //attaches HomeComposer to home.blade.php
        ]);

    }

    public function Index(){
        return view('home');
    }

}

选项 3: 将 Composer 添加到服务提供商,在 Laravel 5 我更喜欢让我的 Composer 在 App\Providers\ViewServiceProvider

  1. app\Composers\HomeComposer.php

  2. 创建一个作曲家文件
  3. 将 HomeComposer 添加到 App\Providers\ViewServiceProvider

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use View;
use App\Composers\HomeComposer;
use Illuminate\Support\Facades\Blade;

class ViewServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
 *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //add to all views
        view()->composer('*', HomeComposer::class);
        //add to only home view 
        //view()->composer('home', HomeComposer::class);
    }
}

你可以把它烧录到session中,你可以在.env文件中定义它(静态变量)

正在搜索同一问题的解决方案,并在 Laravel 文档中找到了最佳解决方案。只需像这样在 AppServiceProvider 中使用 View::share

View::share('key', 'value');

详情here.

此外,您可以在 Route.php 文件中执行此操作:

view()->share('variableName', $variable);

您可以在Controller.php文件中添加:

use App\Category;

然后:

class Controller extends BaseController {
     public function __construct() {
        $categories = Category::All();
        \View::share('categories', $categories);
     }
}

而且你可以给数组,而不仅仅是 View::share('key', 'value'); 可以像 View::share(['key'=>'value','key'=>'value'])

这样的数组

我宁愿将中间件与 view() 外观助手一起使用。 (Laravel 5.x)

中间件更易于维护,并且不会在控制器 class 树中造成混乱。

步骤

创建中间件

/app/Http/Middleware/TimezoneReset.php

要创建中间件,您可以 运行 php artisan make:middleware GlobalTimeConfig

share()您需要分享的资料

 <?php

    namespace App\Http\Middleware;

    use Closure;

    class GlobalTimeConfig
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            $time_settings = [
                'company_timezone' => 'UTC',
                'company_date_format' => 'Y-m-d H:i:s',
                'display_time' => true,
            ];

            view()->share('time_settings', $time_settings);

            return $next($request);
        }
    }

注册新创建的中间件

按照下面的示例将中间件添加到您的中间件路由组

/app/Http/Kernel.php

    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\GlobalTimeConfig::class,
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

        'api' => [
            'throttle:60,1',
            'bindings',
        ],
    ];

从模板访问数据

在 View::share() 方法调用中使用给定键从任何模板访问数据

例如:

    Company timezone: {{ $time_settings['company_timezone'] }}

编辑: Nic Gutierrez 的服务提供商回答可能是更好(或最好)的解决方案。