Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Where to place Blade::extend

Tags:

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?

like image 419
Vincent Avatar asked Aug 20 '13 07:08

Vincent


People also ask

Why we use extends in Laravel?

@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.

What is @yield in Laravel?

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.


3 Answers

Laravel 5 alternative

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

In addition to sbedulin's great solution for Laravel 5

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.

like image 91
slp Avatar answered Oct 21 '22 12:10

slp


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.

like image 26
ciruvan Avatar answered Oct 21 '22 12:10

ciruvan


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

}
like image 30
sbedulin Avatar answered Oct 21 '22 12:10

sbedulin