如何将数据从View Composer传递到Laravel中的View Components



我有一个大型导航,需要从数据库中提取数据。

我将导航分为3个组件,这样操作起来更容易。

<x-navigation.navigation/>
|
|
<x-navigation.desktop.nav-desktop/> (Needs DB Query activeCountries & activeSponsorCountries)
|
|
<x-navigation.mobile.nav-mobile/>  (Needs DB Query activeCountries & activeSponsorCountries)

我将Both Query添加到View Composer中,因为导航需要始终访问这些查询。

这是View Composer逻辑:(我可以在任何地方使用这些,但出于某种原因在组件内使用…?)

ViewComposer>ActiveCountriesComposer.php

class ActiveCountriesComposer {
public $activeCountries = [];
public function compose(View $view) {
$this->activeCountries = Country::where('active', 1)->get(['id',...]);
$view->with('activeCountries', $this->activeCountries);
}
}

ViewComposer>ActiveSponsorCountriesComposer.php

class ActiveSponsorCountriesComposer {
public $activeSponsorCountries = [];
public function compose(View $view) {
$this->activeSponsorCountries = Country::where('active', 1)
->whereHas('locations', function (Builder $query) {
$query->where('sponsorship_country', '=', 1);
})
->get(['id',...]);
$view->with('activeSponsorCountries', $this->activeSponsorCountries);
}
}

我需要知道如何访问内部的2个View Composer查询CCD_ 1&<x-navigation.mobile.nav-mobile/>


目前我有它在工作,但没有使用View Composer。。。我必须在视图组件中重复请求。

两个组件NavDesktop&NavMobile使用重复代码:(NavMobile完全相同)

class NavDesktop extends Component
{
public $activeCountries;
public $activeSponsorCountries;

public function __construct()
{
$this->activeCountries = Country::where('active', 1)->get(['id',...]);
$this->activeSponsorCountries = Country::where('active', 1)
->whereHas('locations', function (Builder $query) {
$query->where('sponsorship_country', '=', 1);
})
->get(['id',...]);
}
public function render()
{
return view('components.navigation.desktop.nav-desktop')->with('activeCountries','activeSponsorCountries');
}

有没有一种方法可以将View Composer查询传递给根级别组件<x-navigation.navigation/>,因此它将允许2个组件<x-navigation.desktop.nav-desktop/>&<x-navigation.mobile.nav-mobile/>使用View Composer中的这两个查询?

如有任何帮助,我们将不胜感激。

  • 使用Laravel 7+

我本应该更多地研究@Remul的建议。我以为它们是全球性的,但我错了。

我只是忘记在ComposerServiceProvider中注册导航。。


class ComposerServiceProvider extends ServiceProvider
{
public function boot()
{
View::composer(
['components.navigation.navigation'],
ActiveCountriesComposer::class
);
View::composer(
['components.navigation.navigation'],
ActiveSponsorCountriesComposer::class
);

现在我可以将数据传递给我的组件,如下所示:

<x-navigation.navigation :activeCountries="$activeCountries" :activeSponsorCountries="$activeSponsorCountries"/>

‍♂️所以吸取了教训。制作单个ViewComposer文件时。不要忘记在ComposerServiceProvider中注册它们。

最新更新