如何在Blade指令中定义和传递变量?

时间:2019-01-27 12:28:06

标签: laravel laravel-5 laravel-blade

这是我的问题;我正在尝试将刀片服务器模板中定义的变量传递给以相同方式接收数据的两个不同的指令。一个很好地解析了我的数据;另一个没有。

我是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讨厌具有变量,但我可以肯定这是正确的地方。这是模板,这个地方负责其变量。如果我有一个名称更改的复杂模板,那么我不想遍历模板很多次;我希望能够仅更改该变量。该变量是使用this question中的以下函数定义的。

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 }},我得到的只是$data的第二个成员中的字符串“'{{$ name}}''。我带走了报价?我得到了字符串{{ $name }}。奇怪的是,尽管它可以在我的@bemclass指令中完美解析,但是在我的@svg指令中却无法正常工作。

现在,我希望{{$ name}}总是解析,否则我将以完全错误的方式进行操作,它永远不会通过,但实际上,它确实以{{1 }}指令,而它不在@bemclass指令中。

0 个答案:

没有答案