如何将数据传递给Laravel 5中的所有视图?

Rag*_*son 111 php laravel laravel-5

我想在Laravel 5应用程序的所有视图中都可以访问一些默认数据.

我试图搜索它,但只找到Laravel 4的结果.我在这里阅读了文档"与所有视图共享数据" ,但我无法理解该怎么做.下面的代码应该放在哪里?

View::share('data', [1, 2, 3]);
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助.

Saf*_*dar 192

这个目标可以通过不同的方法实现,

1.使用BaseController

我喜欢设置的方式,我创建了一个BaseController扩展Laravel自己的课程Controller,并在那里设置了各种全球性的东西.然后所有其他控制器都从BaseControllerLaravel的Controller 扩展而来.

class BaseController extends Controller
{
  public function __construct()
  {
    //its just a dummy data object.
    $user = User::all();

    // Sharing is caring
    View::share('user', $user);
  }
}
Run Code Online (Sandbox Code Playgroud)

2.使用过滤器

如果您知道在整个应用程序中为每个请求设置了视图的事实,您也可以通过在请求之前运行的过滤器来实现 - 这就是我在Laravel中处理User对象的方式.

App::before(function($request)
{
  // Set up global user object for views
  View::share('user', User::all());
});
Run Code Online (Sandbox Code Playgroud)

要么

您可以定义自己的过滤器

Route::filter('user-filter', function() {
    View::share('user', User::all());
});
Run Code Online (Sandbox Code Playgroud)

并通过简单的过滤器调用来调用它.

根据版本5更新.*

3.使用中间件

使用View::sharewithmiddleware

Route::group(['middleware' => 'SomeMiddleware'], function(){
  // routes
});



class SomeMiddleware {
  public function handle($request)
  {
    \View::share('user', auth()->user());
  }
}
Run Code Online (Sandbox Code Playgroud)

4.使用View Composer

View Composer还有助于以不同方式绑定特定数据以进行查看.您可以直接将变量绑定到特定视图或所有视图.例如,您可以根据需要创建自己的目录来存储视图编辑器文件.而这些视图通过Service提供的composer文件提供了与视图的交互.

查看composer方法可以使用不同的方式,第一个例子可以看起来很相似:

您可以创建一个App\Http\ViewComposers目录.

服务提供者

namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ViewComposerServiceProvider extends ServiceProvider {
    public function boot() {
        view()->composer("ViewName","App\Http\ViewComposers\TestViewComposer");
    }
}
Run Code Online (Sandbox Code Playgroud)

之后,将此提供程序添加到"providers"部分下的config/app.php.

TestViewComposer

namespace App\Http\ViewComposers;

use Illuminate\Contracts\View\View;

class TestViewComposer {

    public function compose(View $view) {
        $view->with('ViewComposerTestVariable', "Calling with View Composer Provider");
    }
}
Run Code Online (Sandbox Code Playgroud)

ViewName.blade.php

Here you are... {{$ViewComposerTestVariable}}
Run Code Online (Sandbox Code Playgroud)

此方法仅对特定View有所帮助.但是如果您希望将ViewComposer触发到所有视图,我们必须将此单个更改应用于ServiceProvider.

namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ViewComposerServiceProvider extends ServiceProvider {
    public function boot() {
        view()->composer('*',"App\Http\ViewComposers\TestViewComposer");
    }
}
Run Code Online (Sandbox Code Playgroud)

参考

Laravel文档

进一步澄清Laracast插曲

如果我身边还有不清楚的地方,请告诉我.

  • 这不是一个好主意,视图作曲家为每个单独的视图创建作曲家实例,这意味着如果你运行1000次循环,将创建1000个作曲家实例,并且1000次触发事件被处理,这不是你想要的. (5认同)
  • @RezaShadman是正确的!我很难学到这一点。在安装了laravel-debugbar工具进行调查之前,我的应用程序运行得如此缓慢。然后,我意识到所有8个查询在单个页面加载中都要执行大约15次。这是因为将为包含的每个刀片文件调用视图编辑器。那就是如果您使用星号`*`。如果您不使用`*`,那应该没问题。 (2认同)

Mar*_*lln 60

您可以创建自己的服务提供商(ViewServiceProvider名称很常见),也可以使用现有服务提供商AppServiceProvider.

在您选择的提供程序中,将您的代码放在引导方法中.

public function boot() {
    view()->share('data', [1, 2, 3]);
}
Run Code Online (Sandbox Code Playgroud)

这将使$data您的所有视图中都可以访问变量.

如果您更愿意使用Facade而不是帮助程序,请更改view()->View::但不要忘记use View;在文件的顶部.

  • 请注意,如果您正在获取数据库记录,这将无效,因为在执行迁移之前会调用它.所以你基本上是在数据库记录存在之前尝试获取它们.至少对我来说似乎就是这种情况. (10认同)
  • 如果你只有一两件东西可以分享,把它放在`AppServiceProvider`中就可以了,但是如果你有更多的东西,你应该考虑创建一个新的提供者. (2认同)

Sta*_*ers 8

我发现这是最简单的一个.创建一个新的提供程序并使用'*'通配符将其附加到所有视图.也适用于5.3 :-)

<?php

namespace App\Providers;

use Illuminate\Http\Request;
use Illuminate\Support\ServiceProvider;

class ViewServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     * @return void
     */
    public function boot()
    {
        view()->composer('*', function ($view)
        {
            $user = request()->user();

            $view->with('user', $user);
        });
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 将此提供程序添加到您的配置/应用程序“App\Providers\ViewServiceProvider::class”中的提供程序数组中 (2认同)

Rez*_*man 8

最好的方法是使用 View::share('var', $value);

使用撰写问题"*"

考虑以下方法:

<?php
// from AppServiceProvider::boot()
$viewFactory = $this->app->make(Factory::class);

$viewFacrory->compose('*', GlobalComposer::class);
Run Code Online (Sandbox Code Playgroud)

从示例刀片视图:

  @for($i = 0; $i<1000; $i++)
    @include('some_partial_view_to_display_i', ['toDisplay' => $i])
  @endfor
Run Code Online (Sandbox Code Playgroud)

怎么了?

  • GlobalComposer类实例化1000采用倍 App::make
  • 该事件composing:some_partial_view_to_display_i被处理 1000次。
  • 类中的compose函数GlobalComposer被调用1000次。

但是局部视图some_partial_view_to_display_i与由组成的变量无关,GlobalComposer但会大大增加渲染时间。

最好的方法?

View::share与分组中间件一起使用。

Route::group(['middleware' => 'WebMiddleware'], function(){
  // Web routes
});

Route::group(['prefix' => 'api'], function (){

});

class WebMiddleware {
  public function handle($request)
  {
    \View::share('user', auth()->user());
  }
}
Run Code Online (Sandbox Code Playgroud)

更新资料

如果您使用的是通过中间件管道计算的内容,则可以简单地侦听适当的事件,或者将视图共享中间件放在管道的最后。


小智 5

您有两个选择:

\n

1. 通过 \xe2\x80\x8dBoot函数分享App\\Providers\\AppServiceProvider

\n
public function boot()\n{\n  view()->share('key', 'value');\n}\n
Run Code Online (Sandbox Code Playgroud)\n

并访问$key任何视图文件中的变量。

\n

Note:请记住,您无法在此处访问当前Session, Auth,Route数据。仅当您想共享静态数据时,此选项才适用。假设您想要基于当前用户、路线或任何自定义会话变量共享一些数据,您将无法执行此操作。

\n

2.辅助类的使用:

\n

在应用程序中的任何位置创建一个辅助类,并将其注册到文件夹app.php中文件的Alias 数组中config

\n
 'aliases' => [ \n   ...,\n  'Helper' => App\\HelperClass\\Helper::class,\n ],\n
Run Code Online (Sandbox Code Playgroud)\n

Helper.php并在 App 文件夹内的 HelperClass 文件夹中创建:

\n
namespace App\\HelperClass;\n    \nclass Helper\n{\n    public static function Sample()\n    {\n        //Your Code Here\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

并在任何地方访问它,例如Helper::Sample().

\n

您不会restricted在这里使用AuthRouteSession或任何其他类。

\n