我有一个大型导航,需要从数据库中提取数据。
我将导航分为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中注册它们。