Reputation: 331
I want to add the following code to my laravel project to support the break and continue statements in blade.
This is the code:
Blade::extend(function($value)
{
return preg_replace('/(\s*)@(break|continue)(\s*)/', '$1<?php $2; ?>$3', $value);
});
I have no idea however where to place it, any help would be appreciated?
Upvotes: 21
Views: 18062
Reputation: 441
1) create app/Providers/BladeServiceProvider.php
<?php namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class BladeServiceProvider extends ServiceProvider
{
public function boot()
{
/* @datetime($var) */
\Blade::extend(function($view, $compiler)
{
$pattern = $compiler->createOpenMatcher('datetime');
return preg_replace($pattern, '$1<?php echo $2->format(\'m/d/Y H:i\')); ?>', $view);
});
/* @eval($var++) */
\Blade::extend(function($view)
{
return preg_replace('/\@eval\((.+)\)/', '<?php ${1}; ?>', $view);
});
}
public function register()
{
//
}
}
2) in config/app.php
add
<?php
return [
// ...
'providers' => [
// ...
'App\Providers\BladeServiceProvider',
3) run php artisan clear-compiled
4) in your template use @datetime($updated_at)
or @eval($var = 1)
, @eval($var++)
for example
5) important remark
blade
templates are cached, try to make a dummy change in blade, this way laravel will recompile the template – sbedulin Feb 9 at 17:43
a) run php artisan clear-compiled
might be helpful
b) I changed the code for
$pattern = $compiler->createOpenMatcher('datetime');
and
return preg_replace($pattern, '$1<?php echo $2->format(\'m/d/Y H:i\')); ?>', $view);
because the example from the Laravel 5 Documentation will not work.
The example is corrected now.
The example was removed.
Upvotes: 34
Reputation: 4342
Laravel 5 update:
1) You may want to create Extensions\BladeExtensions.php
folder\file on the same level as Models, Providers, Services
folders
2) BladeExtensions.php
<?php namespace App\Extensions;
class BladeExtensions {
public static function register()
{
\Blade::extend(function($view, $compiler)
{
$pattern = $compiler->createMatcher('datetime');
return preg_replace($pattern, '$1<?php echo $2->format(\'m/d/Y H:i\'); ?>', $view);
});
}
}
3) AppServiceProvider.php
// ...
use App\Extensions\BladeExtensions;
class AppServiceProvider extends ServiceProvider
{
// ...
public function register()
{
// ...
BladeExtensions::register();
}
}
Upvotes: 8
Reputation: 5213
There's no requirement telling you where you should put the code, you could even put it in your routes.php
(which is a bit messy of course). You only have to make sure that it's loaded when laravel processes a page view.
In this case, creating a new file blade_extensions.php
somewhere and including it in start/global.php
might be a good solution.
PS: Be sure to clear out your compiled views, as Blade only recompiles the views if it detects a change, so if you've just plonked in this code it won't work until you clear out the views.
Upvotes: 19