Moon шаблонизатор

Moon — это основной шаблонизатор Imhotep. Он предоставляет чистый и выразительный синтаксис для работы с шаблонами. Файлы шаблонов хранятся с расширением .moon.php.

Создание простого шаблона

Создайте файл resources/views/welcome.moon.php со следующим содержимым:

<!DOCTYPE html>
<html>
<head>
    <title>Добро пожаловать</title>
</head>
<body>
    <h1>Привет, {{ $name ?? 'гость' }}!</h1>
    <p>Добро пожаловать в Imhotep.</p>
</body>
</html>
HTML

После создания, вы можете отобразить это шаблон через контроллер следующим образом:

use Imhotep\Facades\View;

class WelcomeController
{
    public function index()
    {
        // Через фасад
        return View::make('welcome', ['name' => 'Пользователь']);
        
        // Или через глобальную функцию
        return view('welcome', ['name' => 'Пользователь']);
    }
}
PHP

Именование шаблонов

В Moon шаблонизаторе для указания пути к шаблону используется точечная нотация (dot notation). Слэши (/) в пути заменяются на точки (.).

Примеры преобразования

Путь к файлу Имя шаблона
resources/views/welcome.moon.php welcome
resources/views/pages/about.moon.php pages.about
resources/views/admin/dashboard/index.moon.php admin.dashboard.index
resources/views/partials/header.moon.php partials.header

Примеры использования

// Файл: resources/views/pages/about.moon.php
return view('pages.about', ['title' => 'О нас']);

// Файл: resources/views/admin/dashboard/index.moon.php
return View::make('admin.dashboard.index', $data);

// Файл: resources/views/partials/header.moon.php
@include('partials.header')
PHP

Отображение данных

<!-- Экранированный вывод (безопасный) -->
<p>{{ $user->name }}</p>

<!-- Сырой вывод (без экранирования) -->
<p>{!! $user->bio !!}</p>

<!-- Комментарии (не выводятся в HTML) -->
{{-- Этот текст не увидит пользователь --}}
HTML

Условные конструкции

@if / @else / @endif

@if ($user->isActive())
    <span class="active">Активен</span>
@else
    <span class="inactive">Неактивен</span>
@endif
HTML

@elseif

@if ($role === 'admin')
    <span>Администратор</span>
@elseif ($role === 'manager')
    <span>Менеджер</span>
@else
    <span>Пользователь</span>
@endif
HTML

@unless (противоположность @if)

@unless ($user->isBanned())
    <p>Доступ разрешен</p>
@endunless
HTML

@isset / @empty

@isset($user)
    <p>Пользователь найден</p>
@endisset

@empty($items)
    <p>Корзина пуста</p>
@endempty
HTML

@auth / @guest (проверка аутентификации)

{{-- Проверка, что пользователь авторизован --}}
@auth
    <p>Добро пожаловать, {{ auth()->user()->name }}!</p>
@elseauth
    <p>Пожалуйста, войдите в систему</p>
@endauth

{{-- Проверка, что пользователь не авторизован --}}
@guest
    <p>Пожалуйста, войдите или зарегистрируйтесь</p>
@elseguest
    <p>Вы уже авторизованы</p>
@endguest

{{-- С указанием guard --}}
@auth('admin')
    <p>Панель администратора</p>
@endauth

@guest('api')
    <p>API аутентификация не выполнена</p>
@endguest
HTML

@csrf (защита от CSRF)

<form method="POST" action="/submit">
    @csrf
    <!-- Будет сгенерировано: <input type="hidden" name="_csrf" value="..."> -->
    <input type="text" name="name">
    <button type="submit">Отправить</button>
</form>
HTML

@error (ошибки валидации)

@error('email')
    <div class="alert alert-danger">{{ $message }}</div>
@enderror

{{-- Для нескольких полей --}}
@error('name')
    <span class="error">{{ $message }}</span>
@enderror
@error('email')
    <span class="error">{{ $message }}</span>
@enderror
HTML

@switch / @case / @default

@switch($status)
    @case('pending')
        <span>Ожидает</span>
        @break
    @case('approved')
        <span>Одобрено</span>
        @break
    @default
        <span>Неизвестный статус</span>
@endswitch
HTML

Циклы

@for

@for ($i = 0; $i < 5; $i++)
    <p>Итерация: {{ $i }}</p>
@endfor
HTML

@foreach

@foreach ($users as $user)
    <div class="user">
        <h3>{{ $user->name }}</h3>
        <p>{{ $user->email }}</p>
    </div>
@endforeach
HTML

@while

@php $condition = true; @endphp
@while ($condition)
    <p>Пока условие истинно</p>
    @php $condition = false; @endphp
@endwhile
HTML

@continue / @break

<ul>
@for ($i = 0; $i < 10; $i++)
    @if ($i == 1)
        @continue
    @endif

    <li>{{ $i }}</li>

    @if ($i == 5)
        @break
    @endif
@endfor
</ul>
HTML

Альтернативный вариант:

<ul>
@for ($i = 0; $i < 10; $i++)
    @continue($i == 1)

    <li>{{ $i }}</li>

    @break($i == 5)
@endfor
</ul>
HTML

HTML-атрибуты

Условные классы

<div @class([
    'user-card',
    'active' => $user->isActive(),
    'admin' => $user->isAdmin(),
])>
    {{ $user->name }}
</div>
HTML

Условные атрибуты

<input type="checkbox" @checked($user->agreed)>
<option @selected($selected === $value)>{{ $label }}</option>
<button @disabled($isProcessing)>{{ $text }}</button>
<input @required($isRequired)>
<input @readonly($isReadonly)>
HTML

Работа с PHP

Вставка PHP-кода

@php
    $items = ['apple', 'banana', 'orange'];
    $count = count($items);
@endphp

<p>Всего {{ $count }} фруктов</p>
HTML

Отключение обработки блоков

@verbatim
    <p>{{ $this_will_not_be_processed }}</p>
    <p>@if ($condition) Это не обработается @endif</p>
@endverbatim
HTML

Включение под-шаблонов

{{-- Включение шаблона --}}
@include('partials.header')
@include('partials.footer')

{{-- С передачей данных --}}
@include('partials.user-card', ['user' => $user])

{{-- Проверка существования шаблона --}}
@if (view()->exists('admin.dashboard'))
    @include('admin.dashboard')
@endif
HTML

Работа с макетами

Макеты позволяют создать общую структуру для всех страниц вашего приложения.

Создание макета

Пример шаблон макета resources/views/layouts/app.moon.php:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@yield('title', 'Главная')</title>
    <link rel="stylesheet" href="/css/app.css">
</head>
<body>
    <header>
        @yield('header')
    </header>
    
    <main>
        @yield('content')
    </main>
    
    <footer>
        &copy; 2026 Все права защищены
    </footer>
    
    @yield('scripts')
</body>
</html>
HTML

Использование макета

На примере шаблона страницы resources/views/about.moon.php:

@extends('layouts.app')

@section('title', 'О нас')

@section('header')
    <h1>О нашей компании</h1>
@endsection

@section('content')
    <p>Мы работаем с 2020 года...</p>
    
    @foreach ($team as $member)
        <div class="member">
            <h3>{{ $member->name }}</h3>
            <p>{{ $member->position }}</p>
        </div>
    @endforeach
@endsection

@section('scripts')
    <script src="/js/about.js"></script>
@endsection
HTML

Дополнительные возможности макетов

{{-- Переопределение секции с сохранением содержимого родителя --}}
@section('content')
    <h1>Новое содержимое</h1>
    
    {{-- Вставить содержимое родительской секции --}}
    @parent
    
    <p>Дополнительная информация</p>
@endsection

{{-- Вывод секции в родительском макете --}}
@yield('content')

{{-- Вывод секции с значением по умолчанию --}}
@yield('title', 'Страница по умолчанию')
HTML

@scss (подключение SCSS)

{{-- Подключение SCSS файла, расположенного в resources/scss/app.scss --}}
@scss('app')

{{-- Подключение SCSS файла, расположенного в resources/scss/admin/dashboard.scss --}}
@scss('admin/dashboard')

{{-- Подключение с указанием пути --}}
@scss('resources/scss/theme.scss')
HTML

Отладка

{{-- Вывод переменной --}}
@dump($user)
@dump($users, $user)

{{-- Остановка выполнения с выводом данных --}}
@dd($user)
HTML

Справочник директив

Директива Описание
@php / @endphp Вставка PHP кода
@if / @elseif / @else / @endif Условные конструкции
@unless / @endunless Обратное условие
@isset / @endisset Проверка существования переменной
@empty / @endempty Проверка пустоты
@auth / @elseauth / @endauth Проверка аутентификации пользователя
@guest / @elseguest / @endguest Проверка неавторизованного пользователя
@csrf Генерация CSRF токена
@error / @enderror Вывод ошибок валидации
@switch / @case / @default / @endswitch Конструкция switch
@for / @endfor Цикл for
@foreach / @endforeach Цикл foreach
@while / @endwhile Цикл while
@continue / @break Управление циклами
@class Условные CSS классы
@checked / @selected / @disabled / @required / @readonly Условные HTML атрибуты
@scss Подключение SCSS файлов
@include Включение под-шаблона
@extends Наследование макета
@section / @endsection Определение секции
@show Немедленный вывод секции
@overwrite Полная замена родительской секции
@parent Вставка содержимого родительской секции
@yield Вывод секции
@verbatim / @endverbatim Отключение обработки
@dump Вывод данных для отладки
@dd Остановка выполнения с выводом данных