【问题标题】:How to pass data to all views in Laravel 5.6?如何将数据传递给 Laravel 5.6 中的所有视图?
【发布时间】:2019-02-25 19:53:12
【问题描述】:

我有两个控制器。学生控制器和教师控制器。我有一个变量$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);
});

}

【问题讨论】:

  • 我相信 View::share 只有在服务提供商中使用时才有效。我只需在构造函数中使用您的数据设置 $this->chats 的属性,然后使用 with() 手动将其传递给控制器​​内的所有视图
  • 嗯,我知道那种方法,但想知道更简单的方法。
  • @Rob 将studentChat() 代码置于问题中
  • @J.Doe 现已添加。
  • @Rob 我认为你的查询返回 null,试试 DB::enableQueryLog(); studentChat(); dd(DB::getQueryLog()); - 这是你的原始 sql 查询,分析一下

标签: laravel


【解决方案1】:

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

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

<? $chats = studentChat(); ?>

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

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

{{ $chat->channel }}

【讨论】:

  • 好的,我明白你的意思了,但是{{ $chat-&gt;channel }} 是什么,我应该在哪里使用它?
  • @Rob 我更新了答案,{{ $chat-&gt;channel }} 这是你分享给学生/教学视图的变量
【解决方案2】:

与所有视图共享数据

有时,您可能需要与应用程序呈现的所有视图共享一条数据。您可以使用视图外观的 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()
    {
        //
    }

}

【讨论】:

  • 看到它有效,但$chat 在这里变空了,尽管它实际上并不是空的。为什么会抛出一个空数组?
  • 您是否尝试调试/转储 $chats 中的内容?请检查 dd($chats);
【解决方案3】:

所以,我所做的是在 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);

 });

【讨论】:

    【解决方案4】:

    您可以将数据传递给视图Like。

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

    更多详情请访问文章:Introduction to Routing in Laravel

    【讨论】:

    • 我知道这种方式。我想一次将这个变量传递给所有视图,而不是一个一个。
    【解决方案5】:

    在 appServiceProvider 的引导方法中编写您的查询,例如,

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

    【讨论】:

    • 好的,这样就可以了。但是,现在我有两个控制器。老师和学生的聊天是不同的。我怎样才能通过他们两个?我尝试过的内容已在上面的问题中更新。它不工作。有什么想法吗?
    • 您可以使用View::composer('*', function ($view) { $chat_teacher = Cache::remember('chat_teacher', 60,function () { return App\User::chat()-&gt;get(); }); $view-&gt;with('chat_teacher', $chat_teacher); });,并且您可以像$chat_teacher-&gt;chat一样获取老师聊天,同样适用于学生
    【解决方案6】:

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

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

    那么你有两个选择:

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

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

    【讨论】:

      猜你喜欢
      • 2015-04-20
      • 2016-04-14
      • 2018-04-09
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多