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>
© 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 | Остановка выполнения с выводом данных |