一尘不染

如何在Laravel 5中将数据传递到所有视图?

php

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

我尝试搜索它,但仅找到Laravel 4的结果。我在这里阅读了文档“使用所有视图共享数据”
但我不知道该怎么做。以下代码应放在哪里?

View::share('data', [1, 2, 3]);

谢谢你的帮助。


阅读 548

收藏
2020-05-26

共1个答案

一尘不染

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

1.使用BaseController

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

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

    // Sharing is caring
    View::share('user', $user);
  }
}

2.使用过滤器

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

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

要么

您可以定义自己的过滤器

Route::filter('user-filter', function() {
    View::share('user', User::all());
});

并通过简单的过滤器调用对其进行调用。

根据版本5更新。*

3.使用中间件

View::share一起使用middleware

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



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

4.使用View Composer

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

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

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

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

ViewName.blade.php

Here you are... {{$ViewComposerTestVariable}}

此方法仅对特定视图有用。但是,如果要触发ViewComposer到所有视图,我们必须将此单个更改应用于ServiceProvider。

namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ViewComposerServiceProvider extends ServiceProvider {
    public function boot() {
        view()->composer('*',"App\Http\ViewComposers\TestViewComposer");
    }
}
2020-05-26