Laravel在哪里将数据库功能包括在所有页面(路由)中?

时间:2018-07-25 05:56:47

标签: laravel

我有一个laravel应用程序,该应用程序已经具有多个路由,一些控制器以及这些控制器中的某些功能。

我要做的是从数据库中获取一些数据,并希望在所有页面(路由)中使用这些数据。

function getNotifications() 
{
    $notifications = Notification::all();
    return $notifications;
}

我想在所有页面(路线)中使用 $ notifications 。我应该在哪里放置该功能?我也想遵循DRY原则。因此,我将该功能放入了中间件,并且可以正常工作。但我看到建议不要将中间件用于这种目的。我认为辅助功能也不可行。

有什么主意吗?

希望您能理解我的问题。我首先写了所有其他功能,最后写了通知功能。通知需要显示在所有页面中。

2 个答案:

答案 0 :(得分:2)

您需要的是Laravel View作曲家

class UserComposer
{
    public function compose(View $view)
    {
        $user = Auth::user();

        $view->with([
            'user' => $user,
            'notifications' => $user ? $user->unreadNotifications : null,
        ]);
    }
}

在ComposerServiceProvider中的启动方法中

View::composer(
    '*',
    \App\Http\ViewComposers\UserComposer::class
);

现在您可以在所有视图中访问$ notifications

更多文档帮助 https://laravel.com/docs/5.6/views#view-composers

答案 1 :(得分:1)

我希望在路由中使用中间件是最好的选择。首先创建一个中间件

php artisan make:middleware GetNotification

它将在app / http / middleware和内部处理方法中创建GetNotification.php,

public function handle($request, Closure $next)
{
    $notifications = Notification::all();
    Session::put('notifications', $notifications);

    return $next($request);
}

现在您必须在$ routeMiddleware内的app / http / kernel.php中注册它,例如

'getnotification'=> \App\Http\Middleware\GetNotification::class,

现在您可以在名为web.php的路由中使用,将所有路由放入内部

Route::group(['middleware' => ['getnotification']], function () {
....................
.......all routes here
});

您可以通过以下任何方式访问任何视图或刀片文件中的会话:

@if(Session::has('notifications'))
echo {{ Session::get('notifications')}}
@endif

希望有帮助。