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

2022-08-30 06:52:42

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

我试图搜索它,但只找到Laravel 4的结果。我已经阅读了文档“与所有视图共享数据”,但我不明白该怎么做。以下代码应放置在哪里?

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

感谢您的帮助。


答案 1

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

1. 使用基本控制器

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

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::sharemiddleware

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



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

4. 使用视图编辑器

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

之后,将此提供程序添加到“提供程序”部分下的配置/应用.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");
    }
}

视图名称.边栏选项卡.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");
    }
}

参考

拉拉维尔文档

为了进一步澄清Laracast剧集

如果我仍然不清楚,请告诉我。


答案 2

您可以创建自己的服务提供商(名称是通用的),也可以使用现有的 .ViewServiceProviderAppServiceProvider

在所选提供程序中,将代码放在引导方法中。

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

这将使变量在所有视图中都可访问。$data

如果您更想使用外观而不是帮助程序,请将 view()-> 更改为 View:: 但不要忘记在文件顶部使用 View;


推荐