我有两个控制器。 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);
});
}
答案 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个选择:
public function boot(ChatResolver $chatResolver)
{
$chats = $chatResolver->getChats();
View::share(compact('chats));
}
如果仅在签名视图或部分视图(如布局的一部分)中使用$ chats变量,则还可以直接在视图中注入您定义的类。 这是指向Laravel doc的链接。 在某些情况下,这可能是最简单的解决方案。