如何在我的项目的每个刀片中包含的侧边栏中注入数据

Posted

技术标签:

【中文标题】如何在我的项目的每个刀片中包含的侧边栏中注入数据【英文标题】: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];
);

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

【问题讨论】:

laravel.com/docs/7.x/views#sharing-data-with-all-views 【参考方案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

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

【讨论】:

以上是关于如何在我的项目的每个刀片中包含的侧边栏中注入数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的侧边栏中悬停时进行动态下拉?

Openlayers - 侧边栏中的复选框事件

切换侧边栏时如何在导航栏中移动/动画文本值

如何使用 html、css、php 将项目设置为在侧边栏中激活

如何在刀片模板中使用 React js

在 laravel 8 的侧边栏中显示记录数