【问题标题】:How can I Pass data from View Composer to View Components in Laravel?如何将数据从 View Composer 传递到 Laravel 中的 View Components?
【发布时间】:2024-04-14 09:20:01
【问题描述】:

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

我将导航分成 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 查询 &lt;x-navigation.desktop.nav-desktop/&gt; & &lt;x-navigation.mobile.nav-mobile/&gt;


目前我可以使用它,但不能使用 View Composer...我必须在 View Components 中发出重复请求。

组件 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 查询传递给根 级别组件&lt;x-navigation.navigation/&gt; 所以它将允许 2 个组件 &lt;x-navigation.desktop.nav-desktop/&gt; & &lt;x-navigation.mobile.nav-mobile/&gt; 使用 View Composer 中的这两个查询?

任何帮助将不胜感激。

  • 使用 Laravel 7+

【问题讨论】:

  • 您将两个视图作曲家附加到哪些视图?
  • @Remul 我没有将它们附加到任何东西上。它们只是全球性的,我可以通过执行@foreach($activeCountries as $ac) ... 之类的操作访问站点中的任何位置

标签: laravel eloquent components laravel-7


【解决方案1】:

我应该更多地研究@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 中注册它们。

【讨论】:

    最近更新 更多