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

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

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

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

谢谢你的帮助。

144433 次浏览

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

1. 使用 BaseController

按照我喜欢的设置方式,我创建了一个 BaseController类,它扩展了 Laravel 自己的 Controller,并在那里设置了各种全局设置。然后,所有其他控制器从 BaseController而不是 Laravel 的控制器扩展。

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

middleware一起使用 View::share

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






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

4. 使用视图编写器

ViewComposer 还有助于以不同方式将特定数据绑定到视图。可以直接将变量绑定到特定视图或所有视图。例如,您可以根据需要创建自己的目录来存储视图编写器文件。这些视图编写器文件通过服务提供与视图的交互。

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

您可以创建一个 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 的“  提供程序”部分。

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 文件

进一步澄清

如果我还有什么不明白的地方,请告诉我。

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

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

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

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

如果希望使用 facade 而不是 helper,请将 view()->更改为 View::,但不要忘记在文件的顶部使用 use View;

在文件中:

通常,您会在服务中调用 share 方法 提供程序的引导方法。您可以将它们添加到 AppServiceProvider 或生成一个单独的服务提供商 他们。

我同意 Marwelln 的观点,只要把它放在 AppServiceProvider中的引导函数:

public function boot() {
View::share('youVarName', [1, 2, 3]);
}

我建议为变量使用特定的名称,以避免与其他没有“全局”变量的混淆或错误。

我认为最好的方法是使用 View Composers。如果有人来到这里,想找到如何能做到这一点与视图作曲家的方式,阅读我的答案 = > 如何在所有视图中共享一个变量?

我发现这是最简单的一个。创建一个新的提供程序并使用 '*'通配符将其附加到所有视图。也可以在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()
{
//
}
}

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

使用 "*"进行组合时出现的问题:

考虑以下方法:

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


$viewFacrory->compose('*', GlobalComposer::class);

以刀片视图为例:

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

会发生什么?

  • GlobalComposer类使用 App::make.
  • 处理事件 composing:some_partial_view_to_display_i 1000次。
  • GlobalComposer类中的 compose函数被调用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());
}
}

更新

如果您使用的是通过中间件管道计算的内容,那么您可以简单地将 听着转换为适当的 事件,或者将视图共享中间件放在管道的最后一个底部。

文件在这里 https://laravel.com/docs/5.4/views#view-composers,但我将分解它 1. 在根目录中查找目录 Provider,并创建包含内容的 for ComposerServiceProvider.php

文件是听到 https://laravel.com/docs/5.4/views#view-composers,但我将分解它

  1. 在应用程序的根目录中查找目录 应用程序提供商,并创建文件 ComposerServiceProvider.php,将下面的文本复制并过滤到其中,然后保存它。

    <?php
    namespace App\Providers;
    use Illuminate\Support\Facades\View;
    use Illuminate\Support\ServiceProvider;
    
    
    class ComposerServiceProvider extends ServiceProvider
    {
    /**
    * Register bindings in the container.
    *
    * @return void
    */
    public function boot()
    {
    // Using class based composers...
    View::composer(
    'profile', 'App\Http\ViewComposers\ProfileComposer'
    );
    
    
    // Using Closure based composers...
    View::composer('dashboard', function ($view) {
    //
    });
    }
    
    
    /**
    * Register the service provider.
    *
    * @return void
    */
    public function register()
    {
    //
    }
    }
    
  2. From the root of your application open Config/app.php and look for the Providers section in the file and copy and past this 'App\Providers\ComposerServiceProvider', to the array.

By doing this, we have created the Composer Service Provider. When you run your application with the view Profile like so http://yourdomain/something/profile, the service provider ComposerServiceProvider is called and the class App\Http\ViewComposers\ProfileComposer is instantiated calling the method Composer due to the code below inside the boot method or function.

 // Using class based composers...
View::composer(
'profile', 'App\Http\ViewComposers\ProfileComposer'
);
  1. 如果刷新应用程序,您将得到一个错误,因为类 视图作曲器概要文件作曲器还不存在。现在让我们创建它。

转到目录路径 app/Http

  • 创建名为 < em > ViewComposers 的目录

  • 创建文件 ProfileComposer.php

    class ProfileComposer
    {
    /**
    * The user repository implementation.
    *
    * @var UserRepository
    */
    protected $users;
    
    
    /**
    * Create a new profile composer.
    *
    * @param  UserRepository  $users
    * @return void
    */
    public function __construct(UserRepository $users)
    {
    // Dependencies automatically resolved by service container...
    $this->users = $users;
    }
    
    
    /**
    * Bind data to the view.
    *
    * @param  View  $view
    * @return void
    */
    public function compose(View $view)
    {
    $view->with('count', $this->users->count());
    }
    }
    

Now go to your view or in this case Profile.blade.php and add

\{\{ $count }}

这将显示用户的个人资料页面计数。

显示所有页面更改的计数

// Using class based composers...
View::composer(
'profile', 'App\Http\ViewComposers\ProfileComposer'
);

// Using class based composers...
View::composer(
'*', 'App\Http\ViewComposers\ProfileComposer'
);

在你的 config 文件夹中,你可以创建一个 php 文件名,例如“ variable.php”,内容如下:

<?php


return [
'versionNumber' => '122231',
];

现在在所有的视图中,您可以像这样使用它

config('variable.versionNumber')

Laravel 5.6方法: https://laravel.com/docs/5.6/views#passing-data-to-views

例如,将模型集合共享给所有视图(AppServiceProvider.php) :

use Illuminate\Support\Facades\View;
use App\Product;


public function boot()
{
$products = Product::all();
View::share('products', $products);


}

1) In (app Provider AppServiceProvider.php)

// in boot function
view()->composer('*', function ($view) {
$data = User::messages();
$view->with('var_messages',$data);
});

2)在你的用户模型

  public static function messages(){ // this is just example
$my_id = auth()->user()->id;
$data= Message::whereTo($my_id)->whereIs_read('0')->get();
return $data; // return is required
}

3)你的观点

 \{\{ $var_messages }}

你有两个选择:

1. 通过 BootApp\Providers\AppServiceProvider的功能分享:

public function boot()
{
view()->share('key', 'value');
}

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

请记住,您不能在这里访问当前的 SessionAuthRoute数据。只有当您想要共享静态数据时,此选项才是好的。假设您希望基于当前用户、路由或任何您无法使用此方法执行的自定义会话变量共享一些数据。

2. 辅助类的使用:

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

 'aliases' => [
...,
'Helper' => App\HelperClass\Helper::class,
],

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

namespace App\HelperClass;
    

class Helper
{
public static function Sample()
{
//Your Code Here
}
}

然后像 Helper::Sample()一样进入任何地方。

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

例如,您可以将数据库中所有表的列表返回给 Controller 的所有视图 像这样:

public function __construct()
{
$tables = DB::select('SHOW TABLES'); // returns an array of stdObjects
view()->share('tables', $tables);
}

在 Laravel5及以上版本中,您可以在 Php 访问所有视图中的变量

public function boot()
{
\View::composer('*', function($view){
$view->with('key', 'value');
});
}

“键”表示要设置的变量的名称,以便以后可以在任何。Php 文件和“ value”表示变量表示的值... 例如:

//设置所有 blade.php 文件访问的用户角色

public function boot(){
//
View::composer('*', function($view){
view->with('role', Auth::user()->infouser->role);
});
}

如果你使用 Laravel 8你可以这样做,

class Controller extends BaseController{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;


public function __construct(){
$categories = Category::where('show_menu', '=', 1)->where('status', '=', 'approved')->get();
view()->share('categories', $categories);
}}