Laravel 7 - Компонент без вида - PullRequest
0 голосов
/ 08 мая 2020

Я хочу создать Компонент, который предоставляет только данные без представления.

Например:

<x:wg.items.listing :items="$items->items()" :filter="$obj->settings['filter']">
    @foreach($items as $item)
        {{ $item->title }}
    @endforeach     
</x:wg.items.listing>

Компонент Blade получает коллекцию :items и :filter . Между тегами должна быть доступна отфильтрованная коллекция.

Listing. php:

class Listing extends Component
{

    public $items;
    public $filter;

    /**
     * Create a new component instance.
     *
     * @return void
     */
    public function __construct($filter="0", $items="0")
    {
        $this->filter = $filter;
        $this->items = $items;
    }

    /**
     * Get the view / contents that represent the component.
     *
     * @return \Illuminate\View\View|string
     */
    public function render()
    {
        $this->items = app()->make("App\\Http\\Controllers\\Frontend\\BlogController")->generateList($this->items, $this->filter);

        /*return view('components.wg.items.list');*/

    }
}

Listing.php не должен отображать представление, потому что коллекция элементов доступна только в components.wg.items.list, а не между тегами Blade x выше.

Это вообще возможно? Заранее спасибо!

1 Ответ

0 голосов
/ 21 мая 2020

Вы не можете этого сделать; Каждая переменная, которую вы объявляете в компоненте, доступна только в самом компоненте.

... Если вы не хотите делать это реально грязным способом. Затем вы можете использовать глобальные переменные:

<x:wg.items.listing :items="$items->items()" :filter="$obj->settings['filter']">
    @php
        global $filtered_items;
    @endphp
    @foreach($filtered_items as $item)
        {{ $item->title }}
    @endforeach     
</x:wg.items.listing>
    public function render()
    {
        global $filtered_items;
        $filtered_items = app()->make("App\\Http\\Controllers\\Frontend\\BlogController")->generateList($this->items, $this->filter);

        return "{{ $slot }}";

    }

PS: И, кстати, вы не должны помещать ваш лог c фильтрации внутри вашего контроллера. За это должна отвечать модель.

...