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.
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:
@cache
and @endcache
. Note the use of s
modifier in the expression. This way we can match multiple lines with a .
(dot).count($matches)
and assign it to $content
.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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With