Как определить и передать переменные в директиве Blade? - PullRequest
0 голосов
/ 27 января 2019

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

Я новичок в Laravel и Blade, но в прошлом у меня был приятный опыт работы с компонентным рабочим процессом с Twig.Прыгнув в Laravel в свое свободное время, я попытался повторить этот подход, но оказалось, что это сложно.Не только это, но я получаю разные результаты в разных местах.Позвольте мне объяснить.

@define $name = 'motor-loader'

<div class=@bemclass('{{ $name }}')>
    <div class=@bemclass('{{ $name }}', 'coils')>@svg('components/motor-loader/images/motor-coils.svg', '{{ $name }}', 'svg')</div>
</div>

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

Blade::extend(function($value) {
    return $this->createBladeVariable($value);
});

и функции:

private function createBladeVariable(string $value) {
    return preg_replace('/\@define(.+)/', '<?php ${1}; ?>', $value);
}

В этот момент все начинает немного становитьсяфанк.Если вы видели директиву @bemclass, я добавил кавычки вокруг анализируемой переменной.Это было необходимо для передачи значения в виде строки;Моя директива @bemclass работает отлично.Вот как это выглядит:

Blade::directive('bemclass', function ($expression) {
    $data = explode(', ', $expression, 3);
    $block = $this->stripBladeParameterString($data[0]);
    isset($data[1]) ? $element = $this->stripBladeParameterString($data[1]) : $element = null;
    isset($data[2]) ? $modifiers = $this->stripBladeParameterStringArray($data[2]) : $modifiers = null;

    return $this->renderBladeClasses($block, $element, $modifiers);
});

Здесь происходит следующее: если я передаю {{ $name }}, значение не распознается как строка, и директива не выполняется.Если я передаю его как '{{ $name }}', то он передается в виде строки с кавычками, и мне нужно обрезать кавычки вокруг ввода, это то, что делает функция stripBladeParameterString.Это не самый красивый, но эта функция делает то, что задумано, и возвращает красиво отформатированные классы .motor-loader и .motor-loader__coils.

Теперь перейдем к директиве @svg ...

Blade::directive('svg', function ($expression) {
    $data = explode(', ', $expression, 4);
    $path = $this->stripBladeParameterString($data[0]);
    isset($data[1]) ? $block = $this->stripBladeParameterString($data[1]) : $class = null;
    isset($data[2]) ? $element = $this->stripBladeParameterString($data[2]) : $element = null;
    isset($data[3]) ? $modifiers = $this->stripBladeParameterStringArray($data[3]) : $modifiers = null;

    return $this->fetchSvg($path);
});

Теперь, когда я var_dump($data), я получаю свои параметры обратно;Они отлично разбиваются, однако на этот раз он не анализирует {{ $name }}, все, что я получаю, это строка "{{$ name}}" "во втором члене $data.Я уберу цитаты?Я получаю строку {{ $name }}.Это странно, потому что, хотя он отлично анализируется в моей директиве @bemclass, он не работает в моей директиве @svg.

Теперь я бы ожидал, что {{$ name}} всегда будет анализировать, илиЯ иду по этому совершенно неправильному пути, и он никогда не должен проходить, но в действительности он анализирует в директиве @bemclass, а не в директиве @svg.

...