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' : '' }}">