Laravel - 在数据可用时与所有视图共享数据

时间:2018-04-05 02:34:35

标签: laravel laravel-authorization laravel-views

我正在使用Laravel 5.6编写Web应用程序。我需要在所有视图中列出当前会话用户拥有的所有连接。 我试过这样的事情

View::share('connections', Connection::getList(Auth::id()))

我将此代码放在AppServiceProvider的启动函数中。但是当用户尚未登录时会出现问题,因为此时Auth::id()设置为空。

用户登录时不会生成连接列表。这会引发以下错误:

  

未定义连接变量。

1 个答案:

答案 0 :(得分:1)

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

<强> 1。使用BaseController

我喜欢设置的方式,我创建了一个RT_LIBS_PATH=-L/usr/local/Cellar/libre/0.5.7/lib类,扩展了Laravel自己的BaseController,并在那里设置了各种全局事物。然后所有其他控制器都从Controller而不是Laravel的Controller扩展。

BaseController

<强> 2。使用过滤器

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

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

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

您可以定义自己的过滤器

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

并通过简单的过滤器调用来调用它。

根据第5版进行更新。*

第3。使用View Composer

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

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

您可以创建一个Route::filter('user-filter', function() { View::share('user', User::all()); }); 目录。

服务提供商

App\Http\ViewComposers

之后,将此提供程序添加到&#34; provider&#34;下的config / app.php中。部分。

TestViewComposer

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

ViewName.blade.php

namespace App\Http\ViewComposers;

use Illuminate\Contracts\View\View;

class TestViewComposer {

    public function compose(View $view) {
        $view->with('ViewComposerTestVariable', "Calling with View Composer Provider");
    }
}

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

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

Reference