dream_wu2015 2014-07-08 10:10
浏览 52
已采纳

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

I have searched a lot regarding this topic and didn't find much on the web so I started to research and create a complete article on this topic but I am unable to understand some things here, making basic custom tags in blade is easy like

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

but what if I want to do something like below

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

At present I am doing it like this

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

How to parse it to separate three parameters and get content between end and start tag? Your help is appreciated. Thanks for your responses.

  • 写回答

1条回答 默认 最新

  • duanban4769 2015-08-10 19:50
    关注

    This question is more than 1 year old now, but I'm sharing a solution if somebody else need it in the future.

    Using the first example:

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

    It's possible to do something like this:

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

    Explaining the code:

    1. We extend the pattern to match the content between @cache and @endcache. Note the use of s modifier in the expression. This way we can match multiple lines with a . (dot).
    2. Check if the expression matched something using count($matches) and assign it to $content.
    3. Finally we replace the blade tag by the function call. Since our pattern already matches the open and close tags and all content between them, we don't need to worry about replace the closing tag or something else.

    This way you can get the content between tags (@cache and @endcache) in your function:

    class PageCache {
      public static function cache($name, $num, $args, $content) {
        return stripslashes($content);
      }
    }
    

    Based on the example above you'll have:

    $name = 'sidebar';
    $num = 10;
    $args = [ $silver, $gold, $platinum ];
    

    I'm also simply returning the content in my example, but you can do something more interesting there.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥15 想问一下树莓派接上显示屏后出现如图所示画面,是什么问题导致的
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化