【问题标题】:How do I inject data in my sidebar that is included in every single blade of my project如何在我的项目的每个刀片中包含的侧边栏中注入数据
【发布时间】:2020-12-19 16:48:24
【问题描述】:

我正在使用布局系统,我的侧边栏包含在我的母版中,我的母版页是我所有刀片的布局

//master.blade.php
<div clas="main-wrapper" id="app">
    @include('layout.sidebar')
    <div class="page-wrapper">
      @include('layout.header')
      <div class="page-content" >
        @yield('content')
      </div>
    </div>
  </div>

我想在侧边栏项目上显示属于经过身份验证的用户的项目名称。

所以我尝试了第一个解决方案,即使用这样的路由功能:

 //web.php
 Route::any('/home',function(){
  $p = DB::table('projets')
      ->join('users', 'users.id', '=', 'projets.ID_chercheur')
      ->select('projets.nom', 'users.name', 'users.prenom')
      ->where('projets.ID_chercheur','=',Auth::user()->id)
      ->get();
      return view('dashboard')->with(['projets' => $p]);    
  });

这个解决方案的问题是它只在我的仪表板视图中有效,任何其他视图都不起作用它会给我以下错误:

ErrorException

    Undefined variable: projets (View: C:\laragon\www\Labo1\resources\views\layout\sidebar.blade.php)

我明白错误的含义,但我不知道如何解决它,我试过了:

//web.php
Route::match(['get', 'post', 'PUT', 'PATCH','DELETE'], '/', function () {
  $p = DB::table('projets')
      ->join('users', 'users.id', '=', 'projets.ID_chercheur')
      ->select('projets.nom', 'users.name', 'users.prenom')
      ->where('projets.ID_chercheur','=',Auth::user()->id)
      ->get();
      return ['projets' => $p];
});

但它也不起作用,谁能告诉我我可以使用什么解决方案?

【问题讨论】:

标签: php laravel layout routes nested


【解决方案1】:

使用 View Composer 来解决问题。 View Composer 是在渲染视图时调用的回调或类方法。如果您希望在每次呈现视图时将数据绑定到该视图,则视图编辑器可以帮助您将该逻辑组织到一个位置。

实施

步骤 1 创建服务提供者

php artisan make:provider ViewServiceProvider

第二步注册服务商

您需要将服务提供者添加到config/app.php 配置文件中的providers 数组中。

例如将这个App\Providers\ViewServiceProvider::class, 添加到providers 数组,然后运行config:cache 以清除缓存并重新生成配置。

第 3 步在 Provider 的引导方法中写入逻辑

<?php

namespace App\Providers;

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

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

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        

        // Using Closure based composers...
        View::composer('layout.sidebar', function ($view) {
            $p = DB::table('projets')
            ->join('users', 'users.id', '=', 'projets.ID_chercheur')
            ->select('projets.nom', 'users.name', 'users.prenom')
            ->where('projets.ID_chercheur','=',Auth::user()->id)
            ->get();

                $view->with('projets', $p);
        });
    }
}

然后您可以在刀片中访问projets,例如{{projets}} 和上面的foreach 或其他。

Further Refer to Documentation

【讨论】:

    【解决方案2】:

    我认为你想要的是你的一个服务提供者(例如 AppServiceProvider)中的类似的东西

    View::composer('layout.sidebar', function ($view) {
    $p = DB::table('projets')
      ->join('users', 'users.id', '=', 'projets.ID_chercheur')
      ->select('projets.nom', 'users.name', 'users.prenom')
      ->where('projets.ID_chercheur','=',Auth::user()->id)
      ->get();
    
                    $view->with('projets', $p);
                });
    

    我自己没有试过。但我认为它也应该适用于部分。

    【讨论】:

    • 想法是与视图 layouts.sidebar 共享您的数据
    【解决方案3】:

    另一种方法

    如果您在所有视图中访问的数据有限,例如只有 projects 数据,那么肯定选择 view composers,但如果您认为将来必须访问多个外部数据,那么您可以单独创建一个 helper file并在那里编写代码,例如 make functions,然后在您的刀片中简单地调用这些函数。

    实施

    在您的 app 文件夹中创建一个 helpers.php 文件并使用 composer 加载它,例如:

    "autoload": {
        "classmap": [
            ...
        ],
        "psr-4": {
            "App\\": "app/"
        },
        "files": [
            "app/helpers.php" // <---- ADD THIS
        ]
    },
    

    将其添加到您的 composer.json 文件后,运行以下命令:

    composer dump-autoload

    如果您不喜欢将helpers.php 文件保存在app 目录中(因为它不是PSR-4 命名空间类文件),您可以执行laravel.com 网站所做的操作:存储helpers.php in the bootstrap directory。记得在你的composer.json file 中设置它:

    "files": [
        "bootstrap/helpers.php"
    ]
    

    然后在你的helpers.php 文件中创建一个函数

    <?php
    
    function getProjects()
    {
    
      $p = \DB::table('projets')
                ->join('users', 'users.id', '=', 'projets.ID_chercheur')
                ->select('projets.nom', 'users.name', 'users.prenom')
                ->where('projets.ID_chercheur','=',Auth::user()->id)
                ->get();
    
       return $p;
    
    }
    
    

    并在刀片中访问它,例如 {{ getProjects() }}

    【讨论】:

      【解决方案4】:

      大家好,非常感谢您的回答,但我找到了解决问题的简单方法 我不熟悉 laravel 中的 php 语法,所以我的朋友帮助了我,这个解决方案似乎对我有帮助:

      @php
      $projets=DB::table('projets')
             ->join('users', 'users.id', '=', 'projets.chefProjet')
             ->select('projets.nom', 'users.name', 'users.prenom')
             ->where('projets.chefProjet','=',Auth::user()->id)
             ->get();
      @endphp
      

      ...

      我将这段代码放在我的 sidebar.blade.php 的顶部,现在我可以在同一个页面中处理数据,并且数据也可以与其他刀片一起加载

       if(count($projets)>0)
                @foreach ($projets as $p)
                <li class="nav-item {{ active_class(['forms/*']) }}">
                  <a class="nav-link" data-toggle="collapse" href="#forms" role="button" aria-expanded="{{ is_active_route(['forms/*']) }}" aria-controls="forms">
                    <i class="link-icon" data-feather="trello"></i>
                    <span class="link-title" name="monspan">{{$p->nom}} </span>
                    <i class="link-arrow" data-feather="chevron-down"></i>
                  </a>
           </li>
      ....
                @endforeach
           @elseif(count($projets)==0)
                 <li class="nav-item">
                    <p class="text-muted">Aucun projet active</p>
                 </li>
           @endif
      

      我必须从您的回答中了解提供者,所以再次感谢您的宝贵时间

      【讨论】:

        猜你喜欢
        • 2013-09-28
        • 2019-04-02
        • 2014-02-07
        • 2014-09-20
        • 1970-01-01
        • 1970-01-01
        • 2019-09-23
        • 1970-01-01
        • 2019-01-04
        相关资源
        最近更新 更多