0

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

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

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

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

未定义连接变量。

4

1 回答 1

2

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

1.使用BaseController

我喜欢设置的方式,我创建了一个BaseController扩展 Laravel 自己的类Controller,并在那里设置了各种全局的东西。然后,所有其他控制器都从BaseControllerLaravel 的控制器而不是 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. 使用 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");
    }
}

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

参考

于 2018-04-05T02:58:54.587 回答