Расширяем возможности шаблонизатора Laravel

 

Шаблонизатор Laravel Blade предоставляет нам возможность отделять php от html кода в шаблонах проектов благодаря использованию предопределенных директив - специальных вставок в шаблоны проекта, которые заменяют php код.

Если базового набора предопределенных директив нам не достаточно, то можно написать любые свои директивы.

Чтобы стало понятнее все вышеописанное рассмотрим следующий пример:

Допустим наш проект работает с большими числами (миллионы, миллиарды и тд) и чтобы не загромождать экран лишними нолями и для удобства отображения нужно сделать возможность автозамены нулей на суффиксы "млн", "млрд", и т.д. Нам нужно создать в шаблоне новую директиву @price($number), которая будет проверять является ли переменная $number числом и автоматически заменять нули в этом числе на суффиксы.

Для реализации этой задачи нам нужно перейти в сервис-провайдер и прописать там новую директиву Blade в функцию boot():

    //файл /app/Providers/AppServiceProvider.php
    
  public function boot()
  {
    Blade::directive('price', function ($expression) {
      return "<?php
        echo $expression;
      ?>";
    });
  }
  

 

Чтобы конструкция работала нужно не забыть прописать синоним для Blade в начале файла сервис провайдера в список синонимов.

    //файл /app/Providers/AppServiceProvider.php
    
   use Illuminate\Support\Facades\Blade;
  

 

Данная запись позволит нам выводить нашу переменную $number в шаблоне с помощью директивы @price. Т.е. если в любом файле .blade мы пропишем @price($number) то получим просто значение переменной $number. Но перед тем как это начнет работать нужно почистить кэш. Чтобы любые изменения в сервис-провайдере Laravel вступили в силу нужно чистить кэш вьюеров.

  //вызывается из консоли (SSH)
   
   php artisan view:clear     //удаляет кэш вьюеров
  

 

Теперь наш проект умеет понимать что такое директива @price() в блейдах и выполняет по этой директиве заданную нами логику, т.е. просто выводит переменную через echo. Осталось только прописать логику функционала и вставить ее в эту директиву.

логика функционала выглядеть будет так:

 
  if (is_numeric($number)) {
    if ($number/1000000000000 >= 1 || $number/1000000000000 <= -1) {
      echo $number/1000000000000.' трлн';
    } elseif ($number/1000000000 >= 1 || $number/1000000000 <= -1) {
      echo $number/1000000000.' млрд';
    } elseif ($number/1000000 >= 1 || $number/1000000 <= -1) {
      echo $number/1000000.' млн';
    } else {
      echo $number;
    }
  } else {
    echo $number;
  }
   
  

 

Чтобы вставить логику функционала в директиву мы вставляем полученный код в нашу заранее подготовленную функцию в сервис-провайдере.

   //файл /app/Providers/AppServiceProvider.php

  public function boot()
  {
    Blade::directive('price', function ($expression) {
      return "<?php
        if (is_numeric($expression)) {
          if ($expression/1000000000000 >= 1 || $expression/1000000000000 <= -1) {
            echo $expression/1000000000000.' трлн';
          } elseif ($expression/1000000000 >= 1 || $expression/1000000000 <= -1) {
            echo $expression/1000000000.' млрд';
          } elseif ($expression/1000000 >= 1 || $expression/1000000 <= -1) {
            echo $expression/1000000.' млн';
          } else {
            echo $expression;
          }
        } else {
          echo $expression;
        }
      ?>";
    });
  }
   
  

 

Осталось не забыть почистить кэш вьюеров. Как это сделать - было уже описано ранее. Теперь наша директива @price($number) будет преобразовывать число в нужный нам формат с нужным нам суффиксом.

Кейсы