【问题标题】:Do I have to return header data from database in every controller in laravel?我是否必须从 laravel 中每个控制器的数据库中返回标头数据?
【发布时间】:2021-07-27 16:48:55
【问题描述】:

我是来自 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>

【问题讨论】:

  • 我想你可能想看看 traits 的概念(比如 StandardHeaderTrait):) 或者接口(比如 NormalPageInterface)
  • 请您添加您的头刀片文件。
  • 确定我已经更新了详细信息@Rwd
  • @Martij 我发现了一些关于使用 ServicesProviders View::composer() 方法将数据共享给所有视图的方法
  • 仅供参考,您可以调用-&gt;first() 而不是-&gt;get(),这样您就不必遍历用户来获取一个。其次,您可以简单地使用auth()-&gt;user(),然后获取公司:auth()-&gt;user()-&gt;companies,而不是使用第二个查询来加载用户。

标签: php laravel


【解决方案1】:

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

您的查询也有点不对劲。您将获得所有Users,但只能使用某个 ID。这可以重写为:

User::find($id)

或者在你的情况下

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

另外,您可以只使用\Auth::user()。我是一只老狗,但我想auth()-&gt;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

【讨论】:

  • 是的,Auth 外观和auth() 有用的功能都应该做同样的事情。唯一的区别是您可以将 $guard 传递给辅助函数,而不必显式调用 guard() 方法(但如果您愿意,您仍然可以这样做)。
  • @Dave 感谢您的帮助,我不知道我们可以直接在刀片文件中使用模型。` `
【解决方案2】:

我个人选择使用view composers

View::composer('header', function ($view) {
     $users = User::with('companies')
          ->where('id' , auth()->user()->id)->get();
    $view->with('users',$users);
    
});

这将确保此视图在组合时始终获得所需的数据。

【讨论】:

    猜你喜欢
    • 2018-12-29
    • 2019-11-21
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多