Where to place Blade::extend

前端 未结 3 1286
眼角桃花
眼角桃花 2020-12-05 18:29

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(functio         


        
相关标签:
3条回答
  • 2020-12-05 19:15

    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();
        }
    
    }
    
    0 讨论(0)
  • 2020-12-05 19:16

    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.

    0 讨论(0)
  • 2020-12-05 19:18

    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.

    0 讨论(0)
提交回复
热议问题