ОБНОВЛЕНИЕ: Я создал пакет, добавляющий функцию слотов с заданной областью в Blade.Ваша проблема - идеальный вариант использования слотов с заданной областью действия, и ее можно легко решить, используя их. Проверьте это .
Я столкнулся с той же проблемой и, наконец, нашел способ "передать" переменные из компонента в слот.Хитрость заключается в том, чтобы использовать директиву @verbatim
, которая не позволяет компилировать блейд-код.Поэтому мы можем передать блейд-код в слот, а затем скомпилировать его в нашем компоненте.Однако есть только одно условие - имя переменной, используемой в цикле foreach
, должно совпадать с именем, используемым в слоте.(Как показано в примере ниже - в слоте slide
используется переменная $entity
, как и в цикле foreach
в компоненте)
index.blade.php
@component('slider', ['entities' => [0, 1, 2]])
@slot('title')
Slider title
@endslot
@slot('slide')
@verbatim
Slide {{ $entity }}
@if ($entity === 0) {{-- Directives also work! --}}
<strong>Special slide</strong>
@endif
@endverbatim
@endslot
@endcomponent
slider.blade.php
<h1>{{ $title }}</h1>
<ul>
@foreach($entities as $entity)
<li>{!! eval('?>'.Blade::compileString($slide)) !!}</li>
@endforeach
</ul>
Это немного «хакерское» решение проблемы, но самое главное, оно выполняет свою работу, как вы можете видеть наскриншот ниже.