Vamos a crear un middleware mediante eventos para permitir coger el HTML crudo antes de renderizar una vista, esto puede útil para "operar" el html colocando algo extra antes de enviárselo al usuario.

Crear Middleware View

Creamos una class llamada MiddleWareViewClass.php en una carpeta llamada por ejemplo classes o middleware...El contenido será bastante básico, ya que la idea de manipular el HTML que tengas se hará justo en este archivo.

<?php
namespace Tpp\Classes;
use Tpp\Classes\MiddleWareViewClass;
use Phalcon\Events\Event;

class MiddleWareViewClass {
    public static $instance = null;

    public static function getInstance() {
        if (null === self::$instance) {
            self::$instance = new MiddleWareViewClass();
        }
        return self::$instance;
    }

    public function __construct() {}

    public function index() {

    }

    public function afterRender(Event $event, $view) {
        $html = $view->getContent();
        // $html contiene el html crudo, se puede manipular de la manera que queramos para escupirlo de nuevo con setContent
        $view->setContent($html);
    }
}

Yo utilizo namespaces por lo que este archivo dentro de la carpeta classes tendrá que ser cargado en el framework (la llamada del middleware ya cada uno la podrá hacer como quiera). En el archivo loader.php...

$loader
    ->registerNamespaces(
        [
            'Tpp\Classes' => $config->application->classesDir,
        ]
    );

Y en el config irá la ruta hacia classesDir:

    'application' => [
        'classesDir'     => APP_PATH . '/classes/',
    ],

El evento

En nuestro services.php tenemos que instanciar:

use Tpp\Classes\MiddleWareViewClass;
use Phalcon\Events\Event;
use Phalcon\Events\Manager as EventsManager;

Y cuando seteamos el view debemos hacer el attach del evento quedando algo similar a esto:

$di->setShared('view', function () {
    $config = $this->getConfig();
    $view = new View();
    $eventsManager = new EventsManager();
    $eventsManager->attach('view:afterRender', MiddleWareViewClass::getInstance(''));
    $view->setViewsDir($config->application->viewsDir);
    $view->setEventsManager($eventsManager);
    $view->registerEngines([
        '.volt' => function ($view) {
            $config = $this->getConfig();

            $volt = new VoltEngine($view, $this);

            $volt->setOptions([
                'compiledPath' => $config->application->cacheDir,
                'compiledSeparator' => '_'
            ]);

            return $volt;
        },
        '.phtml' => PhpEngine::class

    ]);

    return $view;
});

Ya solo queda llamar a ese evento cada vez que se hace una petición, cada vez que se renderiza algo, por lo tanto en mi caso concreto lo necesito en todas las view, eso hace que necesita ponerlo en el ControllerBase:

<?php
namespace Tpp\Controllers;
use Phalcon\Mvc\Controller;
use Tpp\Classes\MiddleWareViewClass;

class ControllerBase extends Controller
{
    public function initialize()
    {
        $middleWareViewClass = new MiddleWareViewClass();
        $middleWareViewClass::getInstance('')->index();
    }

}

De esta manera el evento se disparará siempre que rendericemos algo. Ya si se quiere poner filtros o excepciones a rutas será algo que tengamos que configurar con más programación.