如何在Laravel 5.6中将数据传递给所有视图?

时间:2018-07-27 10:48:04

标签: laravel

我有两个控制器。 StudentController和TeacherController。我有一个变量$chat,我想在StudentController和TeacherController的所有视图中传递该变量。 $chat将为这两个控制器包含不同的数据。

我搜索并找到了方法,但是我得到的是空数据。我是这样做的。

<?php
namespace App\Http\Controllers;
use View;
class StudentController extends Controller {



public function __construct()
{

    $this->middleware('auth')->except(['home']);

    $this->middleware('access')->except(['home']);

    $chats = studentChat();

    View::share('chats', $chats);

}

所以,这里我正在打印,它返回一个空数组,但是当我在函数中使用它时,该数组将包含数据。怎么了谁能帮忙吗?

我尝试过的:

  public function boot()
{

  View::composer('*', function ($view) {

  $chats = Cache::remember('chats', 60, function () {

  if(Auth::user()->user_type() == config('constant.student'))
  {
    return studentChat();

  }
  else
  {
    return teacherChat();

  }

  });

 $view->with('chats', $chats);
});

}

6 个答案:

答案 0 :(得分:1)

如果您使用View::share共享数据到所有视图,则需要将数据添加到几个不同的视图中,您可以这样做:

创建刀片文件(对于您的情况为chat.blade.php),然后放置变量:

<? $chats = studentChat(); ?>

将此文件包含在您需要此“全局”变量的视图的开头:

//begin of your blade file
@include('chat')
//some code

{{ $chat->channel }}

答案 1 :(得分:0)

使用所有视图共享数据

有时,您可能需要与应用程序呈现的所有视图共享一条数据。您可以使用视图外观的share方法来实现。通常,您应该在服务提供商的启动方法中发出要共享的调用。您可以随意将它们添加到AppServiceProvider或生成单独的服务提供商来容纳它们:

<?php

namespace App\Providers;

use Illuminate\Support\Facades\View;

class AppServiceProvider extends ServiceProvider
{

    public function boot()
    {
         $chats = studentChat();

         View::share('chats', $chats);
    }


    public function register()
    {
        //
    }

}

答案 2 :(得分:0)

您可以将数据传递给“赞”视图。

return View::make('demo')->with('posts', $posts);

有关更多详细信息,请访问文章:Introduction to Routing in Laravel

答案 3 :(得分:0)

在appServiceProvider的启动方法中编写查询,例如

View::composer('*', function ($view) {
    $share_query = Cache::remember('share_query', 60,function () {
        return App\User::all();
    });
     $view->with('share_query', $share_query);
});

答案 4 :(得分:0)

所以,我所做的是在AppServiceProvider类中,在启动函数中添加了它。

      View::composer('*', function ($view) {


  if(!\Auth::check())
  {

      return;

  }

  $userType = \Auth::user()->user_type ;



  if($userType == config('constant.student'))
  {
    $chats = studentChat();

  }
  else if($userType == config('constant.teacher'))
  {
    $chats = teacherChat();

  }


 $view->with('chats', $chats);

 });

答案 5 :(得分:0)

您的最终解决方案还可以,但不是最干净的。 这是我会做的。

使用包含您的逻辑的单个函数定义一个类并返回$ chats,这样您将正确封装逻辑并保持服务提供者启动方法的清洁。

那么您有2个选择:

  • 将您的类注入所使用的服务提供者的boot()方法中,然后调用其函数并使用View :: share。应该看起来像:
public function boot(ChatResolver $chatResolver)
{
    $chats = $chatResolver->getChats();
    View::share(compact('chats));
}

如果仅在签名视图或部分视图(如布局的一部分)中使用$ chats变量,则还可以直接在视图中注入您定义的类。 这是指向Laravel doc的链接。 在某些情况下,这可能是最简单的解决方案。