View Component

Компонент triangle/view предоставляет систему шаблонизации с поддержкой различных движков рендеринга.

Установка

composer require triangle/view

Поддерживаемые движки

  • Twig — популярный шаблонизатор для PHP
  • Blade — шаблонизатор из Laravel
  • ThinkPHP Template — шаблонизатор из ThinkPHP

Установка движков

# Twig
composer require twig/twig

# Blade
composer require jenssegers/blade

# ThinkPHP Template
composer require topthink/think-template

Конфигурация

Настройки в config/view.php:

return [
    'engine' => 'twig', // twig, blade, think
    
    'path' => [
        app_path('view'),
        base_path('view'),
    ],
    
    'cache' => runtime_path('views'),
];

Базовое использование

Рендеринг шаблона

use Triangle\View\View;

// Рендеринг шаблона
$html = View::render('index', [
    'title' => 'My Page',
    'users' => $users,
]);

// Возврат ответа
return response()->html($html);

В контроллере

<?php

namespace App\Controller;

use Triangle\Engine\Request;
use Triangle\View\View;

class IndexController
{
    public function index(Request $request)
    {
        return View::render('index', [
            'title' => 'Home Page',
        ]);
    }
}

Twig

Пример шаблона

<!-- view/index.twig -->
<!DOCTYPE html>
<html>
<head>
    <title>{{ title }}</title>
</head>
<body>
    <h1>{{ title }}</h1>
    
    {% for user in users %}
        <div>{{ user.name }}</div>
    {% endfor %}
</body>
</html>

Расширенные возможности

{# Наследование #}
{% extends "base.twig" %}

{# Блоки #}
{% block content %}
    <h1>{{ title }}</h1>
{% endblock %}

{# Включения #}
{% include "header.twig" %}

{# Условия #}
{% if user %}
    <p>Hello, {{ user.name }}!</p>
{% endif %}

Blade

Пример шаблона

<!-- view/index.blade.php -->
<!DOCTYPE html>
<html>
<head>
    <title>{{ $title }}</title>
</head>
<body>
    <h1>{{ $title }}</h1>
    
    @foreach($users as $user)
        <div>{{ $user->name }}</div>
    @endforeach
</body>
</html>

Компоненты

<!-- Компонент -->
@component('components.alert')
    @slot('title')
        Alert Title
    @endslot
    
    This is the alert message.
@endcomponent

Вспомогательные функции

// Получение пути к шаблону
view_path('index');

// Проверка существования шаблона
if (View::exists('index')) {
    // ...
}