Laravel扩展刀片并传递数组作为参数

Imr*_*bal 6 php blade laravel-4

我已经搜索了很多关于这个主题的内容并且没有在网上找到太多内容所以我开始研究并创建一篇关于这个主题的完整文章但是我无法理解这里的一些内容,在刀片中制作基本的自定义标签很容易

@search @endsearch or @title('something')
Run Code Online (Sandbox Code Playgroud)

但如果我想做下面的事情怎么办?

@cache('sidebar',10,[$silver,$gold,$platinum])
  html tags come here
@endcache
Run Code Online (Sandbox Code Playgroud)

目前我这样做

@cache('sidebar_',10,function() use ($silver_sidebar,$gold_sidebar))

@endcache

$pattern = Blade::createOpenMatcher('cache');
$replace = "<?php echo PageCache::cache$2 { ?>";
$view = preg_replace($pattern, $replace, $view);

// Replace closing tag
$view = str_replace('@endcache', '<?php }); ?>', $view);
Run Code Online (Sandbox Code Playgroud)

如何解析它以分离三个参数并获得end和start标记之间的内容?非常感谢您的帮助.谢谢你的回复.

Gus*_*ube 3

这个问题已经存在一年多了,但如果其他人将来需要它,我正在分享一个解决方案。

使用第一个例子:

@cache('sidebar', 10, [ $silver, $gold, $platinum ])
    html tags come here
@endcache
Run Code Online (Sandbox Code Playgroud)

可以这样做:

Blade::extend(function ($view) {
  $pattern = Blade::createOpenMatcher('cache');
  $pattern = rtrim($pattern, '/') . '(.*?)@endcache/s';

  $matches = [];
  preg_match($pattern, $view, $matches);
  $content = '';

  if (count($matches) > 3) {
    $content = addslashes($matches[3]);
  }

  $replace = "<?php echo PageCache::cache$2, '{$content}'); ?>";
  $view = preg_replace($pattern, $replace, $view);

  return $view;
});
Run Code Online (Sandbox Code Playgroud)

解释一下代码:

  1. 我们扩展模式以匹配@cache和之间的内容@endcache。请注意表达式中s修饰符的使用。这样我们就可以用一个.(点)来匹配多行。
  2. 检查表达式是否与使用的内容匹配count($matches)并将其分配给$content.
  3. 最后我们用函数调用替换blade标签。由于我们的模式已经匹配开始和结束标签以及它们之间的所有内容,因此我们不需要担心替换结束标签或其他内容。

这样您就可以在函数中获取标签 (@cache和) 之间的内容:@endcache

class PageCache {
  public static function cache($name, $num, $args, $content) {
    return stripslashes($content);
  }
}
Run Code Online (Sandbox Code Playgroud)

根据上面的示例,您将拥有:

$name = 'sidebar';
$num = 10;
$args = [ $silver, $gold, $platinum ];
Run Code Online (Sandbox Code Playgroud)

我也只是返回示例中的内容,但您可以在那里做一些更有趣的事情。