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

2019-05-10 10:49发布

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

我试图寻找,但只找到Laravel 4.结果我已经阅读文档“数据共享与全视图” 在这里 ,但我不明白该怎么做。 应该在哪里下面的代码放在哪里?

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

谢谢你的帮助。

Answer 1:

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

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用户对象。

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

View Composer的还有助于绑定具体数据以不同方式查看。 您可以直接绑定变量以特定视图或所有视图。 例如,你可以创建自己的目录,根据需要来存储您的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");
    }
}

在此之后,添加在“供应商”部分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集

如果仍东西从我身边不清楚,让我知道。



Answer 2:

您可以创建自己的服务提供商 ( ViewServiceProvider名字是常见的),或者你可以使用现有的AppServiceProvider

在您选择的供应商,把你的代码中的引导方法。

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

这将使$data变量在所有的意见进行访问。

如果您更愿意使用的门面,而不是帮手,变化的view()->View::但是不要忘记在use View; 在你的文件的顶部。



Answer 3:

我发现这是一个最简单的。 创建一个新的提供者和用户的'*'通配符将其连接到所有的意见。 工程在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()
    {
        //
    }
}


Answer 4:

最好的办法将共享使用变量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类使用实例1000App::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());
  }
}

更新

如果你正在使用的东西,计算在中间件管道,你可以简单地正确的事件或将视图份额中间件在管道的最后一个底部。



Answer 5:

在文档:

通常情况下,你会地方服务提供商的引导方法中的份额的方法调用。 你可以自由地将其添加到AppServiceProvider或生成一个独立的服务提供商来容纳它们。

我同意Marwelln,只是把它放在AppServiceProvider在开机功能:

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

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



Answer 6:

该文档是听到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. 从你的应用程序中打开配置/ app.php并查找文件中的供应商部分,并复制和过去的这个“应用程序\供应商\ ComposerServiceProvider”,到阵列的根源。

通过这样做,我们已经创建了作曲服务提供商。 当您运行,象这样的查看资料您的应用程序的http:// YOURDOMAIN /事/ profile文件 ,服务提供商ComposerServiceProvider被称为和类应用软件\ HTTP \ ViewComposers \ ProfileComposer被实例化调用方法作曲家由于下面的代码中的引导方法或功能。

 // Using class based composers...
 View::composer(
   'profile', 'App\Http\ViewComposers\ProfileComposer'
 );
  1. 如果刷新您的应用程序,因为该类应用程序\ HTTP \ ViewComposers \ ProfileComposer尚不存在,你会得到一个错误。 现在,让我们创建它。

进入目录路径应用程序/ HTTP

  • 创建目录名为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()); } } 

现在去你的看法或在这种情况下Profile.blade.php并添加

{{ $count }}

并且将显示的个人资料页上的用户数。

要显示计数的所有网页上更改

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

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


Answer 7:

我认为最好的办法是View Composers 。 如果有人来到这里,想找到如何与景观作曲家的方式做到这一点,看我的答案=> 如何分享所有视图的变量?



Answer 8:

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

<?php return [ 'versionNumber' => '122231', ];

现在所有的意见里面,你可以使用config('variable.versionNumber')来调用这个变量。



Answer 9:

该文件是在这里https://laravel.com/docs/5.4/views#view-composers但我将其分解为1.Look在你的根目录的目录供应商,并创建了ComposerServiceProvider.php与内容



Answer 10:

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

}


文章来源: How to pass data to all views in Laravel 5?