Программный рендеринг компонента Laravel 7

У меня есть компонент Laravel 7, который выглядит так

class Input extends Component
{
    public $name;
    public $title;
    public $value;
    public $type = 'text';

    /**
     * Create a new component instance.
     *
     * @return void
     */
    public function __construct($name, $title)
    {
        $this->name = $name;
        $this->title = $title;
        $this->value = \Form::getValueAttribute($name);
    }

    /**
     * Get the view / contents that represent the component.
     *
     * @return \Illuminate\View\View|string
     */
    public function render()
    {
        return view('components.fields.input');
    }
}

Я могу визуализировать поле в моем компоненте Blade следующим образом:

<x-input name="name" :title="__('My field')" />

У меня есть требование создать и отобразить поле в коде, я пробовал следующее:

$field = new Input('name', 'My field');
$field->render();

Это возвращает ошибку:

Undefined variable: title

Я вижу, что вызывается функция рендеринга, но публичные свойства не доступны для представления. Как мне отрендерить компонент с общедоступными свойствами?


person Dan    schedule 28.04.2020    source источник
comment
как зовут ваш класс?   -  person TEFO    schedule 29.04.2020
comment
Класс называется Input   -  person Dan    schedule 29.04.2020
comment
Никакого вреда в тесте, поэтому обновите свой laravel до 7.9, и ваш код будет таким: ‹x-input name = name: title = {{__ ('My field')}} /› если это не сработало, удалите двоеточие перед заголовком   -  person TEFO    schedule 29.04.2020
comment
Поле отлично отображается в шаблоне Blade, мне нужно знать, как его отображать программно. Я создаю систему, позволяющую пользователю создавать свои собственные поля, и мне нужно отображать их из кода, а не из фиксированного шаблона.   -  person Dan    schedule 29.04.2020


Ответы (3)


Попробуйте это, у меня это работает в laravel 8, и я проверил, что функция data существует в laravel 7

$field = new Input('name', 'My field');
$field->render()->with($field->data());

** функции данных включают методы, свойства и атрибуты Компонента.

person Huynh Trinh    schedule 06.04.2021

Вручную добавьте переменные в представление. Иначе не получится

Я сообщил об этом, но это не считается проблемой:

https://github.com/laravel/framework/issues/32429

person lalo    schedule 18.05.2020

Просто добавьте свойства для просмотра вручную, и все заработает. Если не сделать свойства частными, но это не должно влиять на это. Просто моя реализация.

     /**
     * Get the view / contents that represent the component.
     *
     * @return \Illuminate\View\View|string
     */
    public function render()
    {
        return view(
            'components.fields.input',
            ['name' => $this->name, 'title' => $this->title]
        );
    }
person Marek Barta    schedule 13.01.2021