如何在不将数据传递到每个页面控制器的情况下将数据传递到布局?

时间:2020-02-14 09:16:01

标签: laravel laravel-5

我有一个自定义的布局刀片,它具有多级导航菜单和 2页刀片,用于扩展布局。我想创建一个通过数据循环的侧面导航菜单。因此,如果创建了新的侧面导航,则不必弄乱布局。

但是问题是,我不知道将数据传递给布局本身。

现在,我只是将数据传递到我拥有的每个页面控制器上。我认为最好将数据传递到布局并调用任何扩展布局的页面,而不必在每个页面控制器上再次传递数据。

布局刀片(user.blade.php)

<li class="nav-item has-treeview">
   <a href="#" class="nav-link">
      <i class="nav-icon fas fa-wifi"></i>
      <p>
         Hotspot Voucher
         <i class="right fas fa-angle-left"></i>
      </p>
   </a>
   <ul class="nav nav-treeview">
      <li class="nav-item has-treeview">
         <a href="#" class="nav-link">
            <i class="far fa-circle nav-icon"></i>
            <p>
               Floors
               <i class="right fas fa-angle-left"></i>
            </p>
         </a>
         <ul class="nav nav-treeview floorlist">
            @foreach ($floors as $floor)
            <li class="nav-item">
               <a href="{{ route('home.floor.submit', $floor->floor_id) }}" class="nav-link">
                  <i class="far fa-dot-circle nav-icon"></i>
                  <p>{{ ucwords($floor->floor_name) }}</p>
               </a>
            </li>
            @endforeach
         </ul>
       </li>
    </ul>
 </li>

家用刀片(home.blade.php)

@extends('layouts.user')

@section('content')
    <!-- Content Header (Page header) -->
    <div class="content-header">
        <div class="container-fluid">
            <div class="row mb-2">
                <div class="col-sm-6">
                    <h1 class="m-0 text-dark">Dashboard</h1>
                </div><!-- /.col -->
                <div class="col-sm-6">
                    <ol class="breadcrumb float-sm-right">
                        <li class="breadcrumb-item">
                            <a href="{{ route('home') }}">Home</a>
                        </li>
                        <li class="breadcrumb-item active">Dashboard</li>
                    </ol>
                </div><!-- /.col -->
            </div><!-- /.row -->
        </div><!-- /.container-fluid -->
    </div>
    <!-- /.content-header -->
    <!-- Main content -->
    <section class="content">
        <div class="container-fluid">
            <div class="row">
                <div class="col-md-8 col-md-offset-2">
                    <div class="panel panel-default">   
                        <div class="panel-body">
                            @component('components.who')
                            @endcomponent
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </section>
    <!-- /.content -->
@endsection

地板刀片(floor.blade.php)

@extends('layouts.user')

@section('content')
    <!-- Content Header (Page header) -->
    <div class="content-header">
        <div class="container-fluid">
            <div class="row mb-2">
                <div class="col-sm-6">
                    <h1 class="m-0 text-dark">{{ ucwords($get_floor_name) }}</h1>
                </div><!-- /.col -->
                <div class="col-sm-6">
                    <ol class="breadcrumb float-sm-right">
                        <li class="breadcrumb-item">
                            <a href="{{ route('home') }}">Home</a>
                        </li>
                        <li class="breadcrumb-item">
                            <a href="{{ route('home') }}">Dashboard</a>
                        </li>
                        <li class="breadcrumb-item active">{{ ucwords($get_floor_name) }}</li>
                    </ol>
                </div><!-- /.col -->
            </div><!-- /.row -->
        </div><!-- /.container-fluid -->
    </div>
    <!-- /.content-header -->
    <!-- Main content -->
    <section class="content">
        <div class="container-fluid">
            <div class="row">
                <div class="col-md-8 col-md-offset-2">
                    <div class="panel panel-default">   
                        <div class="panel-body">
                            @foreach ($get_rooms as $get_room)
                                {{ ucwords($get_room->rooms_name) }}
                            @endforeach
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </section>
    <!-- /.content -->
@endsection

HomeController

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Auth;
use App\Floor;

class HomeController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');
    }

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $floors = Floor::select(
                'floors.id AS floor_id', 
                'floors.name AS floor_name'
                )
                ->where('floors.co_id', Auth::user()->co_id)
                ->get();

        return view('home')->with('floors', $floors);
    }
}

FloorController

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Auth;
use App\Floor;
use App\Room;

class FloorController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');
    }

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */
    public function index($fid)
    {

       $floors = Floor::select(
                'floors.id AS floor_id', 
                'floors.name AS floor_name'
                )
                ->where('floors.co_id', Auth::user()->co_id)
                ->get();

        $get_floor_details = Floor::where(['floors.co_id' => Auth::user()->co_id, 'id' => $fid])->get();

        foreach($get_floor_details as $get_floor)
        {
            $get_floor_name = $get_floor->name;
        }        

        $get_rooms = Room::select(
            'rooms.id AS room_id', 
            'rooms.name AS rooms_name',
            'floors.name AS get_floor_name'
            )
            ->join('floors', 'floors.id', '=', 'rooms.floor_id')
            ->where(['rooms.co_id' => Auth::user()->co_id, 'rooms.floor_id' => $fid])
            ->get();

        $data = [
                'floors' => $floors,
                'get_floor_name' => $get_floor_name,
                'get_rooms' => $get_rooms
        ];

        return view('floor')->with($data);
    }
}

@Andy Song解决方案

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use View;
use Auth;
use App\Floor;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        View::composer('layouts.user', function ($view) 
        {
            $floors = Floor::select(
                'floors.id AS floor_id', 
                'floors.name AS floor_name'
                )
                ->where(['co_id' => Auth::user()->co_id])
                ->get();
            $view->with('floors', $floors);
        });
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

2 个答案:

答案 0 :(得分:0)

不是从各处返回变量,而是在一个位置(也许在View::share()中)使用index()

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


注意:请不要忘记在文件的开头添加视图。

use View;

答案 1 :(得分:0)

您可以使用View composers,然后放入AppServiceProvider

<?php

namespace App\Providers;

use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    .......
    public function boot()
    {
        View::composer('*', function ($view) {
            $view->with('foo', ['bar', 'baz']);
        });
    }
}

通过添加星号(*)字符,这意味着它在任何地方都可以使用。