【问题标题】:How do I use a controller for a "partial" view in Laravel?如何在 Laravel 中将控制器用于“部分”视图?
【发布时间】:2017-10-05 05:26:40
【问题描述】:

这是我的情况。我有一个layout.blade.php,我的大部分页面都使用它。在这个文件中,我包含了一些部分片段,例如@include('partials.header')。我正在尝试使用控制器将数据发送到我的header.blade.php 文件,但我对这将如何工作感到困惑,因为它包含在扩展layout.blade.php 的每个视图中。

我要做的是在我的数据库中检索任何Game 的记录,该记录具有今天的日期(如果存在),并在标题中使用刀片显示详细信息。

我怎样才能做到这一点?

【问题讨论】:

  • Laravel 为此提供了一个名为 slots 的东西。
  • @ceejayoz 这很方便,我肯定会使用它,但我不明白如何从我的数据库中提取数据来使用它。
  • \App\Game::whereDate('date_field', \Carbon\Carbon::now())->first()?

标签: php laravel oop laravel-5 blade


【解决方案1】:

我认为将这些 Game 定义为全局共享是可行的方法。

在您的 AppServiceProvider 启动方法中

public function boot()
{

    view()->composer('partials.header', function ($view) {
        view()->share('todayGames', \App\Game::whereDay('created_at', date('d')->get());
    });

    // or event view()->composer('*', Closure) to share $todayGames accross whole blade
}

像往常一样渲染你的刀片,partial.header 刀片

@foreach ($todayGames as $game)
  // dostuffs
@endforeach

【讨论】:

  • 谢谢!视图作曲家正是我所需要的。 :)
【解决方案2】:

虽然您检索到的属于所选游戏的值不同,但您可以执行以下操作:

控制器

$data = Game::select('id', 'name', 'published_date')->first();
return view('game')->with(compact('data'));

layout.blade.php

<html><head></head><body>
{{ $date }}
</body></html>

game.blade.php

@extend('layout')
@section('date', $data->date)
@section('content')

@endsection

【讨论】:

    【解决方案3】:

    在 Laravel 中,您可以创建一个像控制器一样的服务类方法,并使用 @inject 指令在您的局部视图中访问它。这意味着您不需要在 boot() 中创建全局变量,或者将变量传递给每个控制器,或者通过基本视图 layout.blade.php。

    resources/views/header.blade.php:
    @inject('gamesToday', 'App\Services\GamesTodayService')
    @foreach ($gamesToday->getTodayGames() as $game)
      // display game details
    @endforeach
    

    【讨论】:

      【解决方案4】:

      更好的解决方案是这样

      在您的应用文件夹下创建一个名为 yourClassNameFacade 的类。你的课看起来像这样。

      class yourClassNameFacade extends Facade
      {
          protected static function getFacadeAccessor()
          {
              return 'keyNameYouDecide';
          }
      }
      

      然后到文件app/Providers/AppServiceProvider.php中添加注册函数

      public function register()
          {
              $this->app->bind('keyNameYouDecide', function (){
                  //below your logic, in my case a call to the eloquent database model to retrieve all items.
                  //but you can return whatever you want and its available in your whole application.
                  return \App\MyEloquentClassName::all();
              });
          }
      

      然后在您的视图或您希望在应用程序中的任何其他位置执行此操作以引用它。

      查看是以下代码:

      {{ resolve('keyNameYouDecide') }}
      

      如果您想检查其中的内容,请执行以下操作:

      {{ ddd(resolve('keyNameYouDecide')) }}
      

      您可以在代码中的任何其他地方执行以下操作:

      resolve('keyNameYouDecide'))
      

      【讨论】:

        猜你喜欢
        • 2011-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多