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

4 浏览
0 Comments

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

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

我试图搜索这个问题,但只能找到Laravel 4 的结果。我已经阅读了文档“在所有视图中共享数据”这里,但我不知道该把以下代码放在哪里

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

感谢您的帮助。

admin 更改状态以发布 2023年5月21日
0
0 Comments

你可以创建自己的服务提供者(通常命名为ViewServiceProvider),或者使用现有的AppServiceProvider

在你选择的提供者中,在boot方法中放置你的代码。

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

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

如果你更喜欢使用facade而不是帮助程序,请将view()->更改为View::,但不要忘记在文件顶部添加use View;

0
0 Comments

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

1. 使用BaseController

我喜欢设置这样的方式,我创建一个BaseController类来继承Laravel自己的Controller,并在其中设置一些全局的内容,然后其他所有控制器都会扩展自BaseController而不是Laravel的Controller。

class BaseController extends Controller
{
  public function __construct()
  {
    //its just a dummy data object.
    $user = User::all();
    // Sharing is caring
    View::share('user', $user);
  }
}

2. 使用Filter

如果你确定想要在整个应用程序的每个请求中为视图设置一些内容,还可以通过在请求之前运行的过滤器来实现 - 这是我在Laravel中处理用户对象的方式。

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. 使用中间件

使用middlewareView::share

Route::group(['middleware' => 'SomeMiddleware'], function(){
  // routes
});
class SomeMiddleware {
  public function handle($request)
  {
    \View::share('user', auth()->user());
  }
}

4. 使用View Composer

View Composer还可以以不同的方式将特定数据绑定到视图中。您可以直接将变量绑定到特定视图或所有视图。例如,您可以根据需求创建自己的目录来存储视图组成文件。这些视图组成文件通过服务提供商与视图交互。

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

之后,在"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");
    }
}

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

参考资料

Laravel文档

欲了解详细信息,请参见Laracast Episode

如果还有不清楚的地方,请让我知道。

0