Как передать данные в макеты, не передавая данные на каждый контроллер страницы? - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть пользовательский макет с многоуровневым меню навигации и 2 страничный , расширяющий макет. Я хочу создать боковое навигационное меню, которое l oop через данные. Поэтому, если я создал новую навигацию по сторонам, мне не нужно портить макет.

Но проблема в том, что я не знаю, передать ли данные самому макету.

Пока я просто передаю данные на каждый контроллер страницы, который у меня есть. Я думаю, что было бы лучше, если бы я просто передавал данные в макет и вызывал любую страницу, которая расширяет макет, без повторной передачи данных на каждом контроллере страницы.

макетная пластина (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);
    }
}

@ Решение Энди Сонга

<?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 голосов
/ 14 февраля 2020

вы можете использовать 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']);
        });
    }
}

, добавив символ звездочки (*), это означает, что он доступен везде.

0 голосов
/ 14 февраля 2020

Вместо того, чтобы возвращать переменные отовсюду, используйте View::share() в одном месте (возможно, в index()):

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


Примечание : не забудьте включить просмотр в начале файла.

use View;
...