如何在 Laravel 中为 "partial" 视图使用控制器?
How do I use a controller for a "partial" view in Laravel?
这是我的情况。我的大部分页面都使用 layout.blade.php
。在此文件中,我包含了一些部分内容,例如 @include('partials.header')
。我正在尝试使用控制器将数据发送到我的 header.blade.php
文件,但我对它的确切工作方式感到困惑,因为它包含在扩展 layout.blade.php
的每个视图中。
我想做的是在我的数据库中检索日期为今天的任何 Game
的记录(如果存在),并在 blade 中显示详细信息=24=].
我怎样才能完成这项工作?
我认为将这些 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
}
照常渲染您的 blade,partial.header blade
@foreach ($todayGames as $game)
// dostuffs
@endforeach
虽然您检索到的属于所选游戏的值不同,但您可以这样做:
控制器
$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
在 Laravel 中,您可以创建一个服务 class 方法,其作用类似于控制器,并使用 @inject 指令在局部视图中访问它。这意味着您不需要在 boot() 中创建全局变量,或将变量传递到每个控制器,或通过基本视图 layout.blade.php.
resources/views/header.blade.php:
@inject('gamesToday', 'App\Services\GamesTodayService')
@foreach ($gamesToday->getTodayGames() as $game)
// display game details
@endforeach
更好的解决方案是这样
在您的应用程序文件夹下创建一个名为 yourClassNameFacade 的 class。您的 class 看起来像这样。
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'))
这是我的情况。我的大部分页面都使用 layout.blade.php
。在此文件中,我包含了一些部分内容,例如 @include('partials.header')
。我正在尝试使用控制器将数据发送到我的 header.blade.php
文件,但我对它的确切工作方式感到困惑,因为它包含在扩展 layout.blade.php
的每个视图中。
我想做的是在我的数据库中检索日期为今天的任何 Game
的记录(如果存在),并在 blade 中显示详细信息=24=].
我怎样才能完成这项工作?
我认为将这些 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
}
照常渲染您的 blade,partial.header blade
@foreach ($todayGames as $game)
// dostuffs
@endforeach
虽然您检索到的属于所选游戏的值不同,但您可以这样做:
控制器
$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
在 Laravel 中,您可以创建一个服务 class 方法,其作用类似于控制器,并使用 @inject 指令在局部视图中访问它。这意味着您不需要在 boot() 中创建全局变量,或将变量传递到每个控制器,或通过基本视图 layout.blade.php.
resources/views/header.blade.php:
@inject('gamesToday', 'App\Services\GamesTodayService')
@foreach ($gamesToday->getTodayGames() as $game)
// display game details
@endforeach
更好的解决方案是这样
在您的应用程序文件夹下创建一个名为 yourClassNameFacade 的 class。您的 class 看起来像这样。
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'))