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?
@extends lets you "extend" a template, which defines its own sections etc. A template that you can extend will define its own sections using @yield , which you can then put your own stuff into in your view file. Now you could create another view which extends the same template, but provides its own sections.
In Laravel, @yield is principally used to define a section in a layout and is constantly used to get content from a child page unto a master page.
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.
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.
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();
}
}
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