Slim4: how to get args for is_current_url() in twig

This is “very easy” by setting the current route name as global variable. Then you can compare the route name in your twig templates.

The middleware:

<?php

namespace App\Middleware;

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Slim\Routing\RouteContext;
use Slim\Views\Twig;

final class RouteNameMiddleware implements MiddlewareInterface
{
    /**
     * @var Twig
     */
    private $twig;

    public function __construct(Twig $twig)
    {
        $this->twig = $twig;
    }

    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
    {
        $routeContext = RouteContext::fromRequest($request);
        $route = $routeContext->getRoute();

        if ($route === null) {
            return $handler->handle($request);
        }

        $this->twig->getEnvironment()->addGlobal('route_name', $route->getName());

        return $handler->handle($request);
    }
}

Twig usage:

<li class="{{ route_name == 'root.page' ? 'active' : '' }}">
<li class="{{ route_name == 'user.add' ? 'active' : '' }}">
<li class="{{ route_name == 'user.view' ? 'active' : '' }}">
1 Like