Использование Представлений

Представления представляют пользовательский интерфейс приложения. Чаще всего, это файлы HTML со встроенным PHP-код исключительно для презентации данных. Представления обрабатывают задание предоставления данных веб-браузеру или другому средству, используемому для выполнения запросов из приложения.

Phalcon\Mvc\View и Phalcon\Mvc\View\Simple отвечают за управление слоем представления приложения MVC.

Интеграция представлений с контроллерами

Phalcon автоматически передает выполнение компоненту view, как только определенный контроллер завершил свой цикл. Компонент view будет искать в папке views папку с именем, совпадающим с именем последнего выполненного контроллера, а затем файл с именем последнего выполненного действия. Например, если запрос сделан к URL-адресу http://127.0.0.1/blog/posts/show/301, Phalcon проанализирует URL следующим образом:

Адрес сервера127.0.0.1
Каталог Phalcon blog
контроллер posts
действие show
параметр 301

Диспетчер будет искать PostsController и его действие showAction. Простой файл контроллера для этого примера:

<?php

use Phalcon\Mvc\Controller;

class PostsController extends Controller
{
    public function indexAction()
    {

    }

    public function showAction($postId)
    {
        // Передайть параметр $postId в представление
        $this->view->postId = $postId;
    }
}

 

Метод setVar() позволяет нам создавать переменные представления по запросу, чтобы их можно было использовать в шаблоне представления. В приведенном выше примере показано, как передать параметр $postId в соответствующий шаблон представления.

Иерархическая визуализация

Phalcon\Mvc\View поддерживает иерархию файлов и является компонентом по умолчанию для рендеринга представления в Phalcon. Эта иерархия позволяет использовать общие точки компоновки (обычно используемые представления), а также контроллеры с именами папок, определяющих соответствующие шаблоны представлений.

Этот компонент использует по умолчанию сам PHP как механизм шаблона, поэтому представления должны иметь расширение .phtml. Если каталог представлений представляет собой приложение/виды, то компонент просмотра автоматически найдет эти 3 файла вида.

НазваниеФайлОписание
Вид действия app/views/posts/show.phtml Это представление, связанное с действием. Он будет показан только при выполнении действия show.
Макет контроллера app/views/layouts/posts.phtml Это представление, связанное с контроллером. Это будет показано только для каждого действия, выполненного в контроллере "posts". Весь код, реализованный в макете, будет повторно использован для всех действий в этом контроллере.
Основной макет app/views/index.phtml Это основное действие, которое будет показано для каждого контроллера или действия, выполняемого в приложении.

Вы не обязаны реализовывать все файлы, упомянутые выше. Phalcon\Mvc\View просто перейдет на следующий уровень просмотра в иерархии файлов. Если все три файла представления реализованы, они будут обработаны следующим образом:

<!-- app/views/posts/show.phtml -->

<h3>Это show view!</h3>

<p>Я получил параметр <?php echo $postId; ?></p>
<!-- app/views/layouts/posts.phtml -->

<h2>Это макет контроллера "posts"!</h2>

<?php echo $this->getContent(); ?>
<!-- app/views/index.phtml -->
<html>
    <head>
        <title>Образец</title>
    </head>
    <body>

        <h1>Это основной макет!</h1>

        <?php echo $this->getContent(); ?>

    </body>
</html>

Обратите внимание на строки, где был вызван метод $this->getContent(). Этот метод указывает Phalcon\Mvc\View, куда вводить содержимое предыдущего представления, выполненного в иерархии. В приведенном выше примере выходные данные будут:

Сгенерированный HTML запросом будет:

<!-- app/views/index.phtml -->
<html>
    <head>
        <title>Образец</title>
    </head>
    <body>

        <h1>Это основной макет!</h1>

        <!-- app/views/layouts/posts.phtml -->

        <h2>Это макет контроллера "posts"!</h2>

        <!-- app/views/posts/show.phtml -->

        <h3>Это show view!</h3>

        <p>Я получил параметр 101</p>

    </body>
</html>

Использование шаблонов

Шаблоны представлений, которые могут быть общими для просмотра. Они действуют как макеты контроллера, поэтому их необходимо поместить в каталог макетов.

Шаблоны можно визуализировать перед макетом (используя $this->view->setTemplateBefore()), или они могут быть отображены после макета (с помощью $this->view->setTemplateAfter()). В следующем примере шаблон (layouts/common.phtml) отображается перед  компоновкой контрллера (layouts/posts.phtml):

<?php
 
use Phalcon\Mvc\Controller;
 
class PostsController extends Controller
{
    public function initialize()
    {
        $this->view->setTemplateBefore('common'); 
    } 

    public function lastAction() 
    { 
        $this->flash->notice( 'Последние статьи' );
    } 
}

 

<!-- app/views/index.phtml -->
<!DOCTYPE html>
<html>
    <head>
        <title>Мой блог</title>
    </head>
    <body>
        <?php echo $this->getContent(); ?>
    </body>
</html>
<!-- app/views/layouts/common.phtml -->

<ul class='menu'>
    <li><a href='/'>Главная</a></li>
    <li><a href='/articles'>Материалы</a></li>
    <li><a href='/contact'>Контакты</a></li>
</ul>

<div class='content'><?php echo $this->getContent(); ?></div>
<!-- app/views/layouts/posts.phtml -->

<h1>Мой блог</h1>

<?php echo $this->getContent(); ?>
<!-- app/views/posts/last.phtml -->

<article>
    <h2>Заголовок статьи</h2>
    <p>Содержимое статьи</p>
</article>

<article>
    <h2>Ещё один заголовок</h2>
    <p>Ещё одно содержимое статьи</p>
</article>

Конечный результат будет следующим:

<!-- app/views/index.phtml -->
<!DOCTYPE html>
<html>
    <head>
        <title>Мой блог</title>
    </head>
    <body>

        <!-- app/views/layouts/common.phtml -->

        <ul class='menu'>
            <li><a href='/'>Главная</a></li>
            <li><a href='/articles'>Материалы</a></li>
            <li><a href='/contact'>Контакты</a></li>
        </ul>

        <div class='content'>

            <!-- app/views/layouts/posts.phtml -->

            <h1>Мой блог</h1>

            <!-- app/views/posts/last.phtml -->

            <article>
                <h2>Заголовок статьи</h2>
                <p>Содержимое статьи</p>
            </article>

            <article>
                <h2>Ещё один заголовок</h2>
                <p>Ещё одно содержимое статьи</p>
            </article>

        </div>

    </body>
</html>

Если бы мы использовали $this->view->setTemplateAfter('common'), это был бы конечный результат:

<!-- app/views/index.phtml -->
<!DOCTYPE html>
<html>
    <head>
        <title>Мой блог</title>
    </head>
    <body>

        <!-- app/views/layouts/posts.phtml -->

        <h1>Мой блог</h1>

        <!-- app/views/layouts/common.phtml -->

        <ul class='menu'>
            <li><a href='/'>Главная</a></li>
            <li><a href='/articles'>Материалы</a></li>
            <li><a href='/contact'>Контакты</a></li>
        </ul>

        <div class='content'>

            <!-- app/views/posts/last.phtml -->

            <article>
                <h2>Заголовок статьи</h2>
                <p>Содержимое статьи</p>
            </article>

            <article>
                <h2>Ещё один заголовок</h2>
                <p>Ещё одно содержимое статьи</p>
            </article>

        </div>

    </body>
</html>

Управление Уровнями Визуализации

Как видно выше, Phalcon\Mvc\View поддерживает иерархию представлений. Может потребоваться управление уровнем отрисовки, создаваемой компонентом представления. Метод Phalcon\Mvc\View::setRenderLevel() предлагает эту функциональность.

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

<?php

use Phalcon\Mvc\View;
use Phalcon\Mvc\Controller;

class PostsController extends Controller
{
    public function indexAction()
    {

    }

    public function findAction()
    {
        // Это ответ Ajax, поэтому он не генерирует какой-либо вид
        $this->view->setRenderLevel(
            View::LEVEL_NO_RENDER
        );

        // ...
    }

    public function showAction($postId)
    {
        // Показывает только представление, связанное с действием
        $this->view->setRenderLevel(
            View::LEVEL_ACTION_VIEW
        );
    }
}

Доступные уровни визуализации:

Константа классаОписаниеПорядок
LEVEL_NO_RENDER Указывает на то, чтобы избежать создания любого вида представления.  
LEVEL_ACTION_VIEW Формирует представления, относящегося к действию. 1
LEVEL_BEFORE_TEMPLATE Создает шаблоны представления перед макетом контроллера. 2
LEVEL_LAYOUT Создает презентацию макета контроллера. 3
LEVEL_AFTER_TEMPLATE Генерирует презентацию к шаблонам после макета контроллера. 4
LEVEL_MAIN_LAYOUT Создает презентацию для основного макета. Файл views/index.phtml 5

Отключение уровней визуализации

Уровни отрисовки можно временно или навсегда отключить. Уровень может быть навсегда отключен, если он вообще не используется во всем приложении:

<?php

use Phalcon\Mvc\View;

$di->set(
    'view',
    function () {
        $view = new View();

        // Отключить несколько уровней
        $view->disableLevel(
            [
                View::LEVEL_LAYOUT      => true,
                View::LEVEL_MAIN_LAYOUT => true,
            ]
        );

        return $view;
    },
    true
);

Или временно отключить в какой-то части приложения:

<?php

use Phalcon\Mvc\View;
use Phalcon\Mvc\Controller;

class PostsController extends Controller
{
    public function indexAction()
    {

    }

    public function findAction()
    {
        $this->view->disableLevel(
            View::LEVEL_MAIN_LAYOUT
        );
    }
}

Выбор видов

Как упоминалось выше, когда Phalcon\Mvc\View управляется Phalcon\Mvc\Application , отображаемое представление связано с последним контроллером и выполненным действием. Это можно переопределить с помощью метода Phalcon\Mvc\View::pick():

<?php

use Phalcon\Mvc\Controller;

class ProductsController extends Controller
{
    public function listAction()
    {
        // Выбрать 'views-dir/products/search' для отображения
        $this->view->pick('products/search');

        // Выбрать 'views-dir/books/list' для отображения
        $this->view->pick(
            [
                'books',
            ]
        );

        // Выбрать 'views-dir/products/search' для отображения
        $this->view->pick(
            [
                1 => 'search',
            ]
        );
    }
}

Отключение представления

Если ваш контроллер не производит никакого вывода в представлении (или даже не имеет его), вы можете отключить компонент представления, избегая ненужной обработки:

<?php

use Phalcon\Mvc\Controller;

class UsersController extends Controller
{
    public function closeSessionAction()
    {
        // Close session
        // ...

        // Отключить представление, чтобы избежать
        $this->view->disable();
    }
}

В качестве альтернативы вы можете вернуть false для получения того же эффекта:

<?php

use Phalcon\Mvc\Controller;

class UsersController extends Controller
{
    public function closeSessionAction()
    {
        // ...

        // Отключить представление, чтобы избежать
        return false;
    }
}

Вы можете вернуть объект response, чтобы не отключать просмотр вручную:

<?php

use Phalcon\Mvc\Controller;

class UsersController extends Controller
{
    public function closeSessionAction()
    {
        // Закрыть сеанс
        // ...

        // Перенаправление HTTP
        return $this->response->redirect('index/index');
    }
}

Простая Визуализация

Phalcon\Mvc\View\Simple является альтернативным компонентом Phalcon\Mvc\View. Он сохраняет большую часть философии Phalcon\Mvc\View, но не имеет иерархии файлов, которая, по сути, является главной особенностью его аналога.

Этот компонент позволяет разработчику управлять отображением представления и его расположением. Кроме того, этот компонент может использовать наследование представлений, доступное в шаблонизаторах, таких как Volt и других.

Компонент представлений по-умолчанию должен быть заменён в сервис контейнере:

<?php

use Phalcon\Mvc\View\Simple as SimpleView;

$di->set(
    'view',
    function () {
        $view = new SimpleView();

        $view->setViewsDir('../app/views/');

        return $view;
    },
    true
);

Автоматический рендеринг может быть отключен в Phalcon\Mvc\Application (при необходимости):

<?php

use Exception;
use Phalcon\Mvc\Application;

try {
    $application = new Application($di);

    $application->useImplicitView(false);

    $response = $application->handle();

    $response->send();
} catch (Exception $e) {
    echo $e->getMessage();
}

Для отображения нужно вызвать метод render, указав относительный путь к вид, который вы хотите отобразить:

<?php

use Phalcon\Mvc\Controller;

class PostsController extends Controller
{
    public function indexAction()
    {
        // Визуализация 'views-dir/index.phtml'
        echo $this->view->render('index');

        // Визуализация 'views-dir/posts/show.phtml'
        echo $this->view->render('posts/show');

        // Визуализация 'views-dir/index.phtml' passing variables
        echo $this->view->render(
            'index',
            [
                'posts' => Posts::find(),
            ]
        );

        // Визуализация 'views-dir/posts/show.phtml' передача переменных
        echo $this->view->render(
            'posts/show',
            [
                'posts' => Posts::find(),
            ]
        );
    }
}

Это отличается от  Phalcon\Mvc\View, где метод render() использует контроллеры и действия в качестве параметров:

<?php

$params = [
    'posts' => Posts::find(),
];

// Phalcon\Mvc\View
$view = new \Phalcon\Mvc\View();
echo $view->render('posts', 'show', $params);

// Phalcon\Mvc\View\Simple
$simpleView = new \Phalcon\Mvc\View\Simple();
echo $simpleView->render('posts/show', $params);

Использование Частей

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

Один из способов использования частей - рассматривать их как эквивалент подпрограмм: как способ переместить детали из представления, чтобы ваш код мог быть более понятным. Например, у вас может быть вид, который выглядит так:

<div class='top'><?php $this->partial('shared/ad_banner'); ?></div>

<div class='content'>
    <h1>Роботы</h1>

    <p>Ознакомьтесь с нашими специальными предложениями для роботов:</p>
    ...
</div>

<div class='footer'><?php $this->partial('shared/footer'); ?></div>

Метод partial() принимает второй параметр как массив переменных / параметров, который будет существовать только в частной области:

<?php $this->partial('shared/ad_banner', ['id' => $site->id, 'size' => 'big']); ?>

Передача значений из контроллера в представление

Phalcon\Mvc\View доступен в каждом контроллере, используя переменную представления ($this->view). Вы можете использовать этот объект для непосредственного задания переменных в представлении из действия контроллера с помощью метода setVar().

<?php

use Phalcon\Mvc\Controller;

class PostsController extends Controller
{
    public function indexAction()
    {

    }

    public function showAction()
    {
        $user  = Users::findFirst();
        $posts = $user->getPosts();

        // Передать все имя пользователя и сообщения в представления
        $this->view->setVar('username', $user->username);
        $this->view->setVar('posts', $posts);

        // Использование волшебного сеттера
        $this->view->username = $user->username;
        $this->view->posts    = $posts;

        // Передача нескольких переменных одновременно
        $this->view->setVars(
            [
                'username' => $user->username,
                'posts'    => $posts,
            ]
        );
    }
}

В представлении, готовом к использованию, будет создана переменная с именем первого параметра setVar(). Переменная может быть любого типа, от простой строки, целочисленной и т. д. Переменной до более сложной структуры, такой как массив, коллекция и т.д.

<h1>
    {{ username }}'s Posts
</h1>

<div class='post'>
<?php

    foreach ($posts as $post) {
        echo '<h2>', $post->title, '</h2>';
    }

?>
</div>

Кэширование фрагментов представления

Иногда, когда вы разрабатываете динамические веб-сайты и некоторые области из них не обновляются очень часто, выходные данные в точности совпадают между запросами. Phalcon\Mvc\View предлагает кэширование части или всего визуализированного вывода для повышения производительности.

Phalcon\Mvc\View интегрируется с Phalcon\Cache, чтобы обеспечить более простой способ кэширования выходных фрагментов. Можно вручную задать обработчик кэша или задать глобальный обработчик:

<?php

use Phalcon\Mvc\Controller;

class PostsController extends Controller
{
    public function showAction()
    {
        // Кэширование представления с использованием параметров по умолчанию
        $this->view->cache(true);
    }

    public function showArticleAction()
    {
        // Кэшировать это представление в течение 1 часа
        $this->view->cache(
            [
                'lifetime' => 3600,
            ]
        );
    }

    public function resumeAction()
    {
        // Кэшировать это представление на 1 день с ключом 'resume-cache'
        $this->view->cache(
            [
                'lifetime' => 86400,
                'key'      => 'resume-cache',
            ]
        );
    }

    public function downloadAction()
    {
        // Передача пользовательской службы
        $this->view->cache(
            [
                'service'  => 'myCache',
                'lifetime' => 86400,
                'key'      => 'resume-cache',
            ]
        );
    }
}

Когда мы не определяем ключ к кешу, компонент автоматически создает его с использованием хеша MD5 имени контроллера и представления, отображаемого в настоящее время в формате controller/view. Хорошей практикой является определение ключа для каждого действия, поэтому вы можете легко идентифицировать кеш, связанный с каждым представлением.

Когда компоненту View требуется кэшировать что-либо, он запрашивает службу кэша из контейнера служб. Соглашение об имени  для этой службы - viewCache:

<?php

use Phalcon\Cache\Frontend\Output as OutputFrontend;
use Phalcon\Cache\Backend\Memcache as MemcacheBackend;

// Set the views cache service
$di->set(
    'viewCache',
    function () {
        // Кэширование данных за один день по умолчанию
        $frontCache = new OutputFrontend(
            [
                'lifetime' => 86400,
            ]
        );

        // Настройки подключения Memcached
        $cache = new MemcacheBackend(
            $frontCache,
            [
                'host' => 'localhost',
                'port' => '11211',
            ]
        );

        return $cache;
    }
);

При использовании представлений кэширование может использоваться для предотвращения необходимости создания контроллерами данных представления для каждого запроса.

Чтобы достичь этого, мы должны однозначно идентифицировать каждый кеш с помощью ключа. Сначала мы проверяем, что кеш не существует или истек, чтобы заставить вычисления/запросы отображать данные в представлении:

<?php

use Phalcon\Mvc\Controller;

class DownloadController extends Controller
{
    public function indexAction()
    {
        // Проверить, существует или истекает срок действия кэша с ключем «downloads»
        if ($this->view->getCache()->exists('downloads')) {
            // Query the latest downloads
            $latest = Downloads::find(
                [
                    'order' => 'created_at DESC',
                ]
            );

            $this->view->latest = $latest;
        }

        // Включить кеш с тем же ключом 'downloads'
        $this->view->cache(
            [
                'key' => 'downloads',
            ]
        );
    }
}

Альтернативный сайт PHP является примером реализации кэширования фрагментов.

Шаблонизаторы

Шаблонизаторы помогают дизайнерам создавать представления без использования сложного синтаксиса. Phalcon включает мощный и быстрый шаблонный движок VoltPhalcon\Mvc\View позволяет использовать другие движки шаблонов вместо обычного PHP или Volt.

Используя другой механизм шаблонов, обычно требуется сложный синтаксический анализ текста с использованием внешних библиотек PHP, чтобы сгенерировать окончательный вывод для пользователя. Это обычно увеличивает количество ресурсов, которые будет использовать приложение.

Если используется внешний механизм шаблонов, Phalcon\Mvc\View предоставляет точно такую же иерархию представлений, и по-прежнему можно получить доступ к API внутри этих шаблонов с немного большими усилиями.

Этот компонент использует адаптеры, они помогают Phalcon говорить с этими внешними движками шаблонов в едином пути, давайте посмотрим, как сделать эту интеграцию.

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

Существует множество шаблонизаторов, которые можно интегрировать или создать самостоятельно. Первым шагом для начала работы с внешним шаблоном является создание адаптера для него.

Адаптер  шаблонизатора - это класс, который действует как мост между Phalcon\Mvc\View и самим  шаблонизатором. Обычно требуется реализовать только два метода: __construct() и render(). Первый получает экземпляр Phalcon\Mvc\View, который создает адаптер ядра и контейнер DI, используемый приложением.

Метод render() принимает абсолютный путь к файлу представления и параметры представления, установленные с помощью $this->view->setVar(). Вы можете прочитать или потребовать его, когда это необходимо.

<?php

use Phalcon\DiInterface;
use Phalcon\Mvc\Engine;

class MyTemplateAdapter extends Engine
{
    /**
     * Конструктор адаптера
     *
     * @param \Phalcon\Mvc\View $view
     * @param \Phalcon\Di $di
     */
    public function __construct($view, DiInterface $di)
    {
        // Инициализировать адаптер
        parent::__construct($view, $di);
    }

    /**
     * Рендерит вид, используя шаблонизатор
     *
     * @param string $path
     * @param array $params
     */
    public function render($path, $params)
    {
        // Просмотр
        $view = $this->_view;

        // Параметры доступа
        $options = $this->_options;

        // Визуализация представления
        // ...
    }
}

Изменение  шаблонизатора

Можно полностью заменить модуль шаблонов или использовать несколько модулей шаблонов одновременно. Метод Phalcon\Mvc\View::registerEngines() принимает массив, содержащий данные, которые определяют шаблонизаторы. Ключ каждого шаблонизатора - это расширение файла, которое помогает отличать их друг от друга. Файлы шаблонов, относящиеся к конкретному движку, должны иметь эти расширения.

Порядок, определяемый механизмами шаблонов с помощью Phalcon\Mvc\View::registerEngines() определяет релевантность выполнения. Если Phalcon\Mvc\View находит два вида с одинаковым именем, но с разными расширениями, он будет отображать только первый.

Если вы хотите зарегистрировать шаблонизатор  или их набор для каждого запроса в приложении. Вы можете зарегистрировать его при создании службы просмотра:

<?php

use Phalcon\Mvc\View;

// Setting up the view component
$di->set(
    'view',
    function () {
        $view = new View();

        // Требуется конечный разделитель каталогов
        $view->setViewsDir('../app/views/');

        // Установка движка
        $view->registerEngines(
            [
                '.my-html' => 'MyTemplateAdapter',
            ]
        );

        // Используется более чем один шаблонизатор
        $view->registerEngines(
            [
                '.my-html' => 'MyTemplateAdapter',
                '.phtml'   => 'Phalcon\Mvc\View\Engine\Php',
            ]
        );

        return $view;
    },
    true
);

Есть адаптеры, доступные для нескольких шаблонизаторов на Phalcon Incubator

Инъекция служб в представление

Каждый выполненный просмотр включается внутри экземпляра Phalcon\Di\Injectable, обеспечивая легкий доступ к контейнеру сервиса приложения.

В следующем примере показано, как написать запрос ajax jQuery с помощью URL-адреса с соглашениями фреймворка. URL-адрес службы (обычно Phalcon\Mvc\Url) вводится в представление путем доступа к объекту с тем же именем:

<script type='text/javascript'>

$.ajax({
    url: '<?php echo $this->url->get('cities/get'); ?>'
})
.done(function () {
    alert('Done!');
});

</script>

Автономный компонент

Все компоненты в Phalcon могут быть использованы в качестве клеевых компонентов по отдельности, потому что они слабо связаны друг с другом:

Иерархическая Визуализация

Использование Phalcon\Mvc\View в автономном режиме можно продемонстрировать ниже:

<?php

use Phalcon\Mvc\View;

$view = new View();

// Требуется конечный разделитель каталогов
$view->setViewsDir('../app/views/');

// Передавая переменные в представления, они будут созданы как локальные переменные
$view->setVar('someProducts', $products);
$view->setVar('someFeatureEnabled', true);

// Запуск буферизации вывода
$view->start();

// Отобразить всю иерархию представлений, связанную с представлением products/list.phtml
$view->render('products', 'list');

// Завершите буферизацию вывода
$view->finish();

echo $view->getContent();

Короткий синтаксис также доступен:

<?php

use Phalcon\Mvc\View;

$view = new View();

echo $view->getRender(
    'products',
    'list',
    [
        'someProducts'       => $products,
        'someFeatureEnabled' => true,
    ],
    function ($view) {
        // Установить любые дополнительные параметры здесь

        $view->setViewsDir('../app/views/');

        $view->setRenderLevel(
            View::LEVEL_LAYOUT
        );
    }
);

Простая Визуализация

Использование Phalcon\Mvc\View\Simple в автономном режиме можно продемонстрировать ниже:

<?php

use Phalcon\Mvc\View\Simple as SimpleView;

$view = new SimpleView();

// Требуется конечный разделитель каталогов
$view->setViewsDir('../app/views/');

// Отрисовка представления и возврат его содержимого в виде строки
echo $view->render('templates/welcomeMail');

// Передача параметров представления
echo $view->render(
    'templates/welcomeMail',
    [
        'email'   => $email,
        'content' => $content,
    ]
);

События представления

Phalcon\Mvc\View и Phalcon\Mvc\View\Simple могут отправлять события в EventsManager , если они присутствуют. События инициируются с помощью типа view. Некоторые события при возврате логического false могут остановить активную операцию. Поддерживаются следующие события:

Название событияВызываетМожет остановить работу?
beforeRender Запускается перед запуском процесса визуализации Да
beforeRenderView Запускается перед отрисовкой существующего представления Да
afterRenderView Запускается после отрисовки существующего представления Нет
afterRender Запускается после завершения процесса визуализации Нет
notFoundView Запускается, если представление не найдено м

В следующем примере показано, как присоединить прослушиватели к этому компоненту:

<?php

use Phalcon\Events\Event;
use Phalcon\Events\Manager as EventsManager;
use Phalcon\Mvc\View;

$di->set(
    'view',
    function () {
        // Создание менеджера событий
        $eventsManager = new EventsManager();

        // Прикрепление прослушивателя для типа 'view'
        $eventsManager->attach(
            'view',
            function (Event $event, $view) {
                echo $event->getType(), ' - ', $view->getActiveRenderPath(), PHP_EOL;
            }
        );

        $view = new View();

        $view->setViewsDir('../app/views/');

        // Привязка eventsManager к компоненту представления
        $view->setEventsManager($eventsManager);

        return $view;
    },
    true
);

В следующем примере показано, как создать подключаемый модуль, который очищает/восстанавливает HTML-код, создаваемый процессом визуализации, с помощью Tidy:

<?php

use Phalcon\Events\Event;

class TidyPlugin
{
    public function afterRender(Event $event, $view)
    {
        $tidyConfig = [
            'clean'          => true,
            'output-xhtml'   => true,
            'show-body-only' => true,
            'wrap'           => 0,
        ];

        $tidy = tidy_parse_string(
            $view->getContent(),
            $tidyConfig,
            'UTF8'
        );

        $tidy->cleanRepair();

        $view->setContent(
            (string) $tidy
        );
    }
}

// Подключите плагин в качестве слушателя
$eventsManager->attach(
    'view:afterRender',
    new TidyPlugin()
);