So wäre es am richtigstens:
PHP-Code:
namespace App\EventListener;
use Contao\CoreBundle\ServiceAnnotation\Hook;
use Contao\Template;
use Symfony\Component\HttpFoundation\RequestStack;
/**
* @Hook("parseTemplate")
*/
class ParseTemplateListener
{
private $requestStack;
public function __construct(RequestStack $requestStack)
{
$this->requestStack = $requestStack;
}
public function __invoke(Template $template): void
{
if (in_array($template->type,['Contao\ModuleNavigation','Contao\ModuleCustomnav'])) {
$request = $this->requestStack->getCurrentRequest();
if (null === $request || !$request->hasSession()) {
return;
}
$session = $request->getSession();
// Skip, if user is logged in
if ($session->isStarted() && $request->getSession()->get('loggedIn', false)) {
return;
}
// Hide item, when "hideGuests" is true
$template->items = array_filter($template->items, function($item) {
return !$item["hideGuests"];
});
}
}
}
Dafür musst du keine services.yaml anlegen. Services im App\ Namespace registriert die Contao Managed Edition für dich automatisch (mit autowiring).
// wobei, die Logik stimmt so eigentlich nicht. Aber so siehst du zumindst, wie du in Symfony 4.4 und 5 an die Session kommst.