首页 > 解决方案 > 我是否必须从 laravel 中每个控制器的数据库中返回标头数据?

问题描述

我是来自 PHP 核心的 Laravel 新手,我正在尝试从 app.blade.php 中包含的 header.blade.php 中的数据库加载数据。

我是否必须在每个视图中返回标头数据变量?我是否必须在每个返回视图的控制器函数中编写相同的代码?

如果有其他方法可以实现,请告诉我。

目前,我已将数据加载到我的仪表板,但它仅适用于仪表板。请帮帮我。

class DashboardController extends Controller
{
    function index()
    {   
        
          $users = User::with('companies')
          ->where('id' , auth()->user()->id)
          ->get();

        return view('dashboard')
        ->with('users',$users);
    }
}

这是 header.blade.php

<nav class="navbar navbar-expand-md navbar-dark bg-dark shadow-sm clear-fix">
<div class="container-fluid">
    @guest
        <a class="navbar-brand" href="{{ url('/') }}">
            {{ config('app.name', '') }}
        </a>
    @endguest

    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent"
        aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="{{ __('Toggle navigation') }}">
        <span class="navbar-toggler-icon"></span>
    </button>

    <div class="collapse navbar-collapse" id="navbarSupportedContent">
        <!-- Left Side Of Navbar -->
        @auth
            <ul class="navbar-nav mr-auto">
                <li class="nav-item active">
                    <div class="dropdown open">
                        <button class="btn btn-secondary dropdown-toggle" type="button" id="triggerId"
                            data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                           Companies
                        </button>
                        <div class="dropdown-menu" aria-labelledby="triggerId">
                            @foreach ($users as $user)
                                @foreach ($user->copmanies as $company)
                                    <a class="dropdown-item" href="#">{{ $company->name }}</a>
                                @endforeach
                            @endforeach
                        </div>
                    </div>
                </li>
                <li class="nav-item active">
                    <a class="nav-link" href="{{ route('dashboard') }}">Dashboard <span
                            class="sr-only">(current)</span></a>
                </li>
                <li class="nav-item dropdown">
                    <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown"
                        aria-haspopup="true" aria-expanded="false">
                        Business
                    </a>
                    <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
                        <a class="dropdown-item" href="#">Short-term cash-flow</a>
                        <a class="dropdown-item" href="#">Business snapshot</a>
                        <hr>
                        <a class="dropdown-item" href="{{ route('invoices.view', '1') }}">Invoices</a>
                        <a class="dropdown-item" href="{{ route('quotes.view', '1') }}">Quotes</a>
                        <a class="dropdown-item" href="{{ route('sales_overview', '1') }}">Sales Overview</a>
                        <hr>
                        <a class="dropdown-item" href="{{ route('bills.view', '1') }}">Bills</a>
                        <a class="dropdown-item" href="{{ route('purchaseorders.view', '1') }}">Purchase Orders</a>
                        <a class="dropdown-item" href="{{ route('purchases_overview', '1') }}">Purchase Overview</a>
                        <hr>
                        <a class="dropdown-item" href="#">Expense claim</a>
                        <a class="dropdown-item" href="#">Products and srevices</a>
                        <a class="dropdown-item" href="#">Pay run</a>
                        <a class="dropdown-item" href="#">Cheques</a>
                    </div>
                </li>
                <li class="nav-item dropdown">
                    <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown"
                        aria-haspopup="true" aria-expanded="false">
                        Accouting
                    </a>
                    <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
                        <a class="dropdown-item" href="#">Bank Account</a>
                        <a class="dropdown-item" href="#">Reports</a>
                        <a class="dropdown-item" href="#">Advance</a>
                        <hr>
                        <p><i class="fas fa-star"></i> Reports</p>
                        <a class="dropdown-item" href="#">Accounts Transactions</a>
                        <a class="dropdown-item" href="#">Aged Payable Summary</a>
                        <a class="dropdown-item" href="#">Aged Reciveable Summary</a>
                        <a class="dropdown-item" href="#">Balance Sheet</a>
                        <a class="dropdown-item" href="#">Profit And Loss</a>
                        <a class="dropdown-item" href="#">Sales Tax Report</a>
                        <hr>
                        <p><i class="fas fa-star"></i> Advance</p>
                        <a class="dropdown-item" href="#">Chart of accounts</a>
                        <a class="dropdown-item" href="#">Find and record</a>
                        <a class="dropdown-item" href="#">Fixed assets</a>
                        <a class="dropdown-item" href="#">Manual journals</a>

                    </div>
                </li>
                <li class="nav-item dropdown">
                    <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown"
                        aria-haspopup="true" aria-expanded="false">
                        Projects
                    </a>
                    <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
                        <a class="dropdown-item" href="#">All Projects</a>
                        <a class="dropdown-item" href="#">Time entries</a>
                        <a class="dropdown-item" href="#">Staff Time Overview</a>
                        <a class="dropdown-item" href="#">Staff Cost Rate</a>
                    </div>
                </li>
                <li class="nav-item dropdown">
                    <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown"
                        aria-haspopup="true" aria-expanded="false">
                        Contacts
                    </a>
                    <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
                        <a class="dropdown-item" href="#">All Contacts</a>
                        <a class="dropdown-item" href="#">Customers</a>
                        <a class="dropdown-item" href="#">Suppliers</a>
                        <a class="dropdown-item" href="#">Employees</a>
                        <hr>
                        <a class="dropdown-item" href="#">Traning Customers</a>
                    </div>
                </li>
            </ul>
        @endauth


        <!-- Right Side Of Navbar -->
        <ul class="navbar-nav ml-auto">
            <!-- Authentication Links -->
            @guest
                @if (Route::has('login'))
                    <li class="nav-item">
                        <a class="nav-link" href="{{ route('login') }}">{{ __('Login') }}</a>
                    </li>
                @endif

                @if (Route::has('register'))
                    <li class="nav-item">
                        <a class="nav-link" href="{{ route('register') }}">{{ __('Register') }}</a>
                    </li>
                @endif
            @else
                <li class="nav-item dropdown">
                    <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown"
                        aria-haspopup="true" aria-expanded="false">
                        <i class="fas fa-plus"></i>
                    </a>
                    <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
                        <a class="dropdown-item" href="{{ route('invoices.new', '1') }}">Invoice</a>
                        <a class="dropdown-item" href="{{ route('invoices.new_repeating', '1') }}">Repeating
                            Invoice</a>
                        <a class="dropdown-item" href="{{ route('quotes.new', '1') }}">Qoute</a>
                        <a class="dropdown-item" href="{{ route('creditnotes.new', '1') }}">Credit Note</a>
                        <a class="dropdown-item" href="{{ route('bills.new', '1') }}">Bill</a>
                        <a class="dropdown-item" href="{{ route('purchaseorders.new', '1') }}">Purchase Order</a>
                        <a class="dropdown-item" href="#">Expense</a>
                        <a class="dropdown-item" href="#">Manual Journal</a>
                        <a class="dropdown-item" href="#">Spend Money</a>
                        <a class="dropdown-item" href="#">Recive Money</a>
                        <a class="dropdown-item" href="#">Transfer Money</a>
                        <a class="dropdown-item" href="#">Contact</a>
                    </div>
                </li>
                <li class="nav-item dropdown">
                    <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown"
                        aria-haspopup="true" aria-expanded="false">
                        <i class="fa fa-search" aria-hidden="true"></i>
                    </a>
                    <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
                        <a class="dropdown-item" href="#">Action</a>
                        <a class="dropdown-item" href="#">Another action</a>
                        <a class="dropdown-item" href="#">Something else here</a>
                    </div>
                </li>
                <li class="nav-item dropdown">
                    <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown"
                        aria-haspopup="true" aria-expanded="false">
                        <i class="fa fa-bell" aria-hidden="true"></i>
                    </a>
                    <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
                        <a class="dropdown-item" href="#">Action</a>
                        <a class="dropdown-item" href="#">Another action</a>
                        <a class="dropdown-item" href="#">Something else here</a>
                    </div>
                </li>
                <li class="nav-item dropdown">
                    <a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button"
                        data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>
                        {{ Auth::user()->name }}
                    </a>

                    <div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdown">
                        <a class="dropdown-item" href="{{ route('logout') }}" onclick="event.preventDefault();
                                                             document.getElementById('logout-form').submit();">
                            {{ __('Logout') }}
                        </a>

                        <form id="logout-form" action="{{ route('logout') }}" method="POST" class="d-none">
                            @csrf
                        </form>
                    </div>
                </li>
            @endguest
        </ul>
    </div>
</div>

标签: phplaravel

解决方案


我经常只是为小型项目内联这些东西。

您的查询也有点偏离。你得到所有User的 s 但只有一个特定的 ID。这可以重写为:

User::find($id)

或者在你的情况下

User::with('companies')->find($id)

此外,您可以只使用\Auth::user(). 我是一只老狗,但我想它auth()->user()的工作原理完全一样。

所以我会在你的标题中内联所有这些:

<div class="dropdown-menu" aria-labelledby="triggerId">
    @foreach (\Auth::user()->companies as $company)
        <a class="dropdown-item" href="#">{{ $company->name }}</a>
    @endforeach
</div>

如果你真的需要大量使用它或者它变得更复杂,你可以谷歌查看作曲家

https://laravel.com/docs/8.x/views#view-composers

如果您在加载用户时也总是需要公司,则可以默认使用受保护的$with变量进行预加载:

https://laravel.com/docs/8.x/eloquent-relationships#eager-loading-by-default


推荐阅读