Я мог бы найти решение, и я опубликую его здесь для справки. В настоящее время это работает, но я не могу сказать, что это не доставит мне некоторых проблем позже. Если вы найдете лучший подход, я буду рад взглянуть.
После создания нескольких компонентов лезвия как обычно
php artisan make:component MyComponent1
php artisan make:component MyComponent2
php artisan make:component MyComponent3
и, объявив все необходимые свойства и методы, вы можете либо включить компоненты в представление обычным способом
<html>
<head></head>
<body>
@if($somethingHappens)
<x-my-component1 a="" b="" :c="$c" class="" />
@elseif ($somethingElseHappens)
<x-my-component2 a="" b="" :c="$c" class="" />
@else
<x-my-component3 a="" b="" :c="$c" class="" />
@endif
</body>
</html>
, либо, если вам требуется более гибкое решение какой компонент следует использовать во время выполнения и генерировать теги компонентов где-то еще за пределами представления, я нашел это решение
//some code.....
return('myview')->with([
'type' => 'component',
'component' => '<x-my-component3 a="" b="" :c="$vars[\'c\']" class="" />',
'vars' => [ 'c' => 'somevalue' ]
]);
#################
//myview.blade.php
<html>
<head></head
<body>
@php
if($type == 'component')
echo compileStringComponent(
$component,
$__env,
$vars
);
@endphp
</body>
</html>
################
//file containing the function
use Illuminate\View\Factory as ViewFactory;
//This function takes the whole tagged component as string and returns the corresponding html
function compileStringComponent(string $component, ViewFactory $__env, $vars = null )
{
$compiled = Blade::compileString($component);
ob_start();
try {
eval('?>'.$compiled);
} catch (\Exception $e){
ob_get_clean();
throw( $e);
}
$content = ob_get_clean();
return $content;
}
Несколько замечаний:
1) Blade :: compileString возвращает a скомпилированная строка для оценки, и внутри кода есть несколько ссылок на переменную $ __ env, которая является экземпляром Illuminate \ View \ Factory и уже существует внутри представления. Это означает, что если функция вызывается вне представления, переменная $ __ env должна быть передана вызывающей стороне
2) Массив $ vars необходим, если данные передаются компоненту через атрибуты: для та же причина, что и выше, потому что эти переменные не будут существовать внутри вызывающей стороны и должны быть переданы ему
3) ob_start () и ob_get_clean () используются, чтобы избежать отправки неполных представлений пользователю в случае возникновения любой ошибки .
Надеюсь, это кому-нибудь поможет