Где разместить Blade:: extend

Я хочу добавить следующий код в свой проект laravel для поддержки разрыва и продолжения операторов в лезвии.

Это код:

Blade::extend(function($value)
{
  return preg_replace('/(\s*)@(break|continue)(\s*)/', '$1<?php $2; ?>$3', $value);
});

Я понятия не имею, где его разместить, любая помощь будет оценена?

Ответ 1

Нет необходимости сообщать вам, куда вы должны поместить код, вы могли бы даже поместить его в свой routes.php (что, конечно, немного беспорядочно). Вам нужно только убедиться, что он загружен, когда laravel обрабатывает просмотр страницы.

В этом случае создание нового файла blade_extensions.php где-то и включение его в start/global.php может быть хорошим решением.

PS: Обязательно очистите свои скомпилированные представления, поскольку Blade только перекомпилирует представления, если обнаруживает изменение, поэтому, если вы только что набрали этот код, он не будет работать, пока вы не очистите представления.

Ответ 2

Альтернатива Laravel 5

1) создать 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) в config/app.php добавить

<?php

return [

    // ...

    'providers' => [

        // ...

        'App\Providers\BladeServiceProvider',

3) запустите php artisan clear-compiled

4) в вашем шаблоне используйте @datetime($updated_at) или @eval($var = 1), @eval($var++) например

5) важное замечание

blade Шаблоны кэшированы, попытайтесь сделать ложное изменение в лезвии, таким образом laravel перекомпилит шаблон - sbedulin 9 февраля в 17:43

В дополнение к большому решению сбедулина для Laravel 5

a) может работать php artisan clear-compiled

b) Я изменил код для

$pattern = $compiler->createOpenMatcher('datetime');

и

return preg_replace($pattern, '$1<?php echo $2->format(\'m/d/Y H:i\')); ?>', $view);

, потому что пример из Laravel 5 Documentation не будет работать.

Теперь корректируется.

Пример удален.

Ответ 3

Обновление Laravel 5:

1) Возможно, вы захотите создать папку Extensions\BladeExtensions.php\файл на том же уровне, что и Models, Providers, Services папки

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

}