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


Laravel extend blade and pass array as parameter

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

@search @endsearch or @title('something')

但是如果我想在

下面做些什么呢?
@cache('sidebar',10,[$silver,$gold,$platinum])
  html tags come here
@endcache

目前我是这样做的

@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);

如何解析它分开三个参数和结束和开始标签之间的内容?谢谢你的帮助。谢谢您的回复。

这个问题已经有1年多了,但是如果将来有人需要的话,我在这里分享一个解决方案。

使用第一个例子:

@cache('sidebar', 10, [ $silver, $gold, $platinum ])
    html tags come here
@endcache

可以这样做:

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;
});

解释代码:

  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);
  }
}
根据上面的例子,你将得到:
$name = 'sidebar';
$num = 10;
$args = [ $silver, $gold, $platinum ];

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