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