Помеченный компонент Blade с именем переменной - PullRequest
0 голосов
/ 04 мая 2020

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

@if( $a['type'] == 'component' )
    "<x-{$a['name']} />"
@endif

Но я не могу найти, как это сделать правильно, потому что использование браслетов {{ }} также напечатает их на странице (до и после компонента).

Класс компонента также имеет некоторую вызываемую функцию, поэтому директива @component решит только часть проблемы.

1 Ответ

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

Я мог бы найти решение, и я опубликую его здесь для справки. В настоящее время это работает, но я не могу сказать, что это не доставит мне некоторых проблем позже. Если вы найдете лучший подход, я буду рад взглянуть.

После создания нескольких компонентов лезвия как обычно

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 () используются, чтобы избежать отправки неполных представлений пользователю в случае возникновения любой ошибки .

Надеюсь, это кому-нибудь поможет

...