refactor: single admin menu gated per entry by the controller's role
This commit is contained in:
1 parent
e796dd01ee
commit
ade30c6b06
5 files changed
+49
-201
No files matched your search
@@ -181,14 +181,6 @@ services:
|
|||||||
method: createMainMenu
|
method: createMainMenu
|
||||||
alias: admin_main
|
alias: admin_main
|
||||||
|
|
||||||
App\Menu\GroupsMenuBuilder:
|
|
||||||
arguments:
|
|
||||||
$factory: '@knp_menu.factory'
|
|
||||||
tags:
|
|
||||||
- name: knp_menu.menu_builder
|
|
||||||
method: createMainMenu
|
|
||||||
alias: groups_main
|
|
||||||
|
|
||||||
App\Service\BpnXmlSyncManager:
|
App\Service\BpnXmlSyncManager:
|
||||||
arguments:
|
arguments:
|
||||||
$xmlSource: '@xml_source.storage'
|
$xmlSource: '@xml_source.storage'
|
||||||
|
|||||||
@@ -1,137 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Menu;
|
|
||||||
|
|
||||||
use App\Security\Voter\AdministrativeAccessVoter;
|
|
||||||
use Knp\Menu\FactoryInterface;
|
|
||||||
use Knp\Menu\ItemInterface;
|
|
||||||
use Symfony\Bundle\SecurityBundle\Security;
|
|
||||||
use Symfony\Component\HttpFoundation\RequestStack;
|
|
||||||
use Symfony\Component\Uid\Uuid;
|
|
||||||
use Symfony\Contracts\Translation\TranslatorInterface;
|
|
||||||
|
|
||||||
abstract class AbstractMenuBuilder
|
|
||||||
{
|
|
||||||
public function __construct(
|
|
||||||
protected FactoryInterface $factory,
|
|
||||||
protected Security $security,
|
|
||||||
protected RequestStack $requestStack,
|
|
||||||
protected TranslatorInterface $translator,
|
|
||||||
) {
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function createRootElement(): ItemInterface
|
|
||||||
{
|
|
||||||
return $this->factory->createItem('root');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return array<string, mixed>
|
|
||||||
*/
|
|
||||||
protected function getDefaultRouteParameters(string $parameter = 'id', string $default = '0'): array
|
|
||||||
{
|
|
||||||
$request = $this->requestStack->getMainRequest();
|
|
||||||
|
|
||||||
return [
|
|
||||||
$parameter => $request->get($parameter, $default),
|
|
||||||
'r' => $request->get('r'),
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function addAdminItem(ItemInterface $menu): void
|
|
||||||
{
|
|
||||||
if ($this->security->isGranted(AdministrativeAccessVoter::ADMINISTRATIVE_ACCESS)) {
|
|
||||||
$this->addDivider($menu);
|
|
||||||
$menu->addChild('zum Adminbereich', [
|
|
||||||
'route' => 'app_admin_index',
|
|
||||||
'linkAttributes' => [
|
|
||||||
'title' => 'zum Adminbereich',
|
|
||||||
],
|
|
||||||
'extras' => [
|
|
||||||
'icon' => 'user',
|
|
||||||
],
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function addManagerItem(ItemInterface $menu): void
|
|
||||||
{
|
|
||||||
if ($this->security->isGranted('ROLE_MANAGER')) {
|
|
||||||
$this->addDivider($menu);
|
|
||||||
$menu->addChild('zum Managementbereich', [
|
|
||||||
'route' => 'app_manager_index',
|
|
||||||
'linkAttributes' => [
|
|
||||||
'title' => 'zum Managementbereich',
|
|
||||||
],
|
|
||||||
'extras' => [
|
|
||||||
'icon' => 'user',
|
|
||||||
],
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function addTeamerItem(ItemInterface $menu): void
|
|
||||||
{
|
|
||||||
if ($this->security->isGranted('ROLE_TEAMER')) {
|
|
||||||
$this->addDivider($menu);
|
|
||||||
$menu->addChild('zum Teambereich', [
|
|
||||||
'route' => 'app_teamer_index',
|
|
||||||
'linkAttributes' => [
|
|
||||||
'title' => 'zum Teambereich',
|
|
||||||
],
|
|
||||||
'extras' => [
|
|
||||||
'icon' => 'user',
|
|
||||||
],
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function addHouseManagerItem(ItemInterface $menu): void
|
|
||||||
{
|
|
||||||
if ($this->security->isGranted('ROLE_HOUSE_MANAGER')) {
|
|
||||||
$this->addDivider($menu);
|
|
||||||
$menu->addChild('zum Hausleitungsbereich', [
|
|
||||||
'route' => 'app_house_manager_index',
|
|
||||||
'linkAttributes' => [
|
|
||||||
'title' => 'zum Hausleitungsbereich',
|
|
||||||
],
|
|
||||||
'extras' => [
|
|
||||||
'icon' => 'user',
|
|
||||||
],
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function addLogoutItem(ItemInterface $menu): void
|
|
||||||
{
|
|
||||||
$this->addDivider($menu);
|
|
||||||
|
|
||||||
$menu->addChild('MyE&P', [
|
|
||||||
'route' => 'app_account',
|
|
||||||
'linkAttributes' => [
|
|
||||||
'title' => 'zu MyE&P',
|
|
||||||
],
|
|
||||||
'extras' => [
|
|
||||||
'icon' => 'logout',
|
|
||||||
],
|
|
||||||
]);
|
|
||||||
$menu->addChild('Logout', [
|
|
||||||
'route' => 'app_logout',
|
|
||||||
'linkAttributes' => [
|
|
||||||
'title' => 'Logout',
|
|
||||||
],
|
|
||||||
'extras' => [
|
|
||||||
'icon' => 'logout',
|
|
||||||
],
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function addDivider(ItemInterface $menu): void
|
|
||||||
{
|
|
||||||
$menu->addChild(Uuid::v4(), [
|
|
||||||
'extras' => [
|
|
||||||
'divider' => true,
|
|
||||||
],
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -2,16 +2,25 @@
|
|||||||
|
|
||||||
namespace App\Menu;
|
namespace App\Menu;
|
||||||
|
|
||||||
|
use Knp\Menu\FactoryInterface;
|
||||||
use Knp\Menu\ItemInterface;
|
use Knp\Menu\ItemInterface;
|
||||||
|
use Symfony\Bundle\SecurityBundle\Security;
|
||||||
|
use Symfony\Component\Uid\Uuid;
|
||||||
|
|
||||||
class AdminMenuBuilder extends AbstractMenuBuilder
|
class AdminMenuBuilder
|
||||||
{
|
{
|
||||||
|
public function __construct(
|
||||||
|
private readonly FactoryInterface $factory,
|
||||||
|
private readonly Security $security,
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param array<string, mixed> $options
|
* @param array<string, mixed> $options
|
||||||
*/
|
*/
|
||||||
public function createMainMenu(array $options): ItemInterface
|
public function createMainMenu(array $options): ItemInterface
|
||||||
{
|
{
|
||||||
$menu = $this->createRootElement();
|
$menu = $this->factory->createItem('root');
|
||||||
|
|
||||||
$menu->addChild('Dashboard', [
|
$menu->addChild('Dashboard', [
|
||||||
'route' => 'app_admin_dashboard',
|
'route' => 'app_admin_dashboard',
|
||||||
@@ -35,7 +44,7 @@ class AdminMenuBuilder extends AbstractMenuBuilder
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->security->isGranted('ROLE_GROUPS_ADMIN')) {
|
if ($this->security->isGranted('ROLE_GROUPS_MANAGER')) {
|
||||||
$menu->addChild('Gruppenbuchungen', [
|
$menu->addChild('Gruppenbuchungen', [
|
||||||
'route' => 'app_admin_accommodationbooking',
|
'route' => 'app_admin_accommodationbooking',
|
||||||
'linkAttributes' => [
|
'linkAttributes' => [
|
||||||
@@ -46,6 +55,8 @@ class AdminMenuBuilder extends AbstractMenuBuilder
|
|||||||
'routes' => [['pattern' => '/^app_admin_accommodationbooking\//']],
|
'routes' => [['pattern' => '/^app_admin_accommodationbooking\//']],
|
||||||
],
|
],
|
||||||
]);
|
]);
|
||||||
|
}
|
||||||
|
if ($this->security->isGranted('ROLE_GROUPS_ADMIN')) {
|
||||||
$menu->addChild('Gruppenhäuser', [
|
$menu->addChild('Gruppenhäuser', [
|
||||||
'route' => 'app_admin_accommodation',
|
'route' => 'app_admin_accommodation',
|
||||||
'linkAttributes' => [
|
'linkAttributes' => [
|
||||||
@@ -95,4 +106,37 @@ class AdminMenuBuilder extends AbstractMenuBuilder
|
|||||||
|
|
||||||
return $menu;
|
return $menu;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function addLogoutItem(ItemInterface $menu): void
|
||||||
|
{
|
||||||
|
$this->addDivider($menu);
|
||||||
|
|
||||||
|
$menu->addChild('MyE&P', [
|
||||||
|
'route' => 'app_account',
|
||||||
|
'linkAttributes' => [
|
||||||
|
'title' => 'zu MyE&P',
|
||||||
|
],
|
||||||
|
'extras' => [
|
||||||
|
'icon' => 'logout',
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
$menu->addChild('Logout', [
|
||||||
|
'route' => 'app_logout',
|
||||||
|
'linkAttributes' => [
|
||||||
|
'title' => 'Logout',
|
||||||
|
],
|
||||||
|
'extras' => [
|
||||||
|
'icon' => 'logout',
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function addDivider(ItemInterface $menu): void
|
||||||
|
{
|
||||||
|
$menu->addChild(Uuid::v4(), [
|
||||||
|
'extras' => [
|
||||||
|
'divider' => true,
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Menu;
|
|
||||||
|
|
||||||
use Knp\Menu\ItemInterface;
|
|
||||||
|
|
||||||
class GroupsMenuBuilder extends AbstractMenuBuilder
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @param array<string, mixed> $options
|
|
||||||
*/
|
|
||||||
public function createMainMenu(array $options): ItemInterface
|
|
||||||
{
|
|
||||||
$menu = $this->createRootElement();
|
|
||||||
|
|
||||||
$menu->addChild('Dashboard', [
|
|
||||||
'route' => 'app_admin_dashboard',
|
|
||||||
'linkAttributes' => [
|
|
||||||
'title' => 'Dashboard',
|
|
||||||
],
|
|
||||||
'extras' => [
|
|
||||||
'icon' => 'chart',
|
|
||||||
],
|
|
||||||
]);
|
|
||||||
$menu->addChild('Gruppenbuchungen', [
|
|
||||||
'route' => 'app_admin_accommodationbooking',
|
|
||||||
'linkAttributes' => [
|
|
||||||
'title' => 'Buchungen',
|
|
||||||
],
|
|
||||||
'extras' => [
|
|
||||||
'icon' => 'list',
|
|
||||||
'routes' => [['pattern' => '/^app_admin_accommodationbooking\//']],
|
|
||||||
],
|
|
||||||
]);
|
|
||||||
$menu->addChild('Gruppenhäuser', [
|
|
||||||
'route' => 'app_admin_accommodation',
|
|
||||||
'linkAttributes' => [
|
|
||||||
'title' => 'Gruppenhäuser',
|
|
||||||
],
|
|
||||||
'extras' => [
|
|
||||||
'icon' => 'house',
|
|
||||||
'routes' => [['pattern' => '/^app_admin_accommodation\//']],
|
|
||||||
],
|
|
||||||
]);
|
|
||||||
|
|
||||||
$this->addLogoutItem($menu);
|
|
||||||
|
|
||||||
return $menu;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
{% extends 'base_admin.html.twig' %}
|
{% extends 'base_admin.html.twig' %}
|
||||||
|
|
||||||
{% block body %}
|
{% block body %}
|
||||||
{% set main_menu = is_granted('ROLE_ADMIN') ? 'admin_main' : 'groups_main' %}
|
|
||||||
<div class="max-w-screen-2xl mx-auto px-4 lg:px-8 lg:grid lg:grid-cols-4 gap-8 py-8">
|
<div class="max-w-screen-2xl mx-auto px-4 lg:px-8 lg:grid lg:grid-cols-4 gap-8 py-8">
|
||||||
<div class="lg:col-span-4 flex items-center justify-between pb-4 lg:pb-0">
|
<div class="lg:col-span-4 flex items-center justify-between pb-4 lg:pb-0">
|
||||||
<a href="{{ path(app.user ? 'app_admin_dashboard' : 'app_login') }}">
|
<a href="{{ path(app.user ? 'app_admin_dashboard' : 'app_login') }}">
|
||||||
@@ -20,7 +19,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="hidden lg:block sticky top-0 h-screen">
|
<div class="hidden lg:block sticky top-0 h-screen">
|
||||||
{% if app.user %}
|
{% if app.user %}
|
||||||
{{ knp_menu_render(knp_menu_get(main_menu)) }}
|
{{ knp_menu_render(knp_menu_get('admin_main')) }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
<div class="lg:col-span-3">
|
<div class="lg:col-span-3">
|
||||||
@@ -41,7 +40,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="w-full h-full p-8 pt-0 overflow-y-scroll">
|
<div class="w-full h-full p-8 pt-0 overflow-y-scroll">
|
||||||
{% if app.user %}
|
{% if app.user %}
|
||||||
{{ knp_menu_render(knp_menu_get(main_menu)) }}
|
{{ knp_menu_render(knp_menu_get('admin_main')) }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in new issue
Block a user