Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 21 additions & 10 deletions docs/development/menu.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,24 @@ services:
- { name: kernel.event_listener, event: framework_core.configure_menu, method: onConfigureMenu }
```

To make things easier, there's a DefaultMenuListener to extend your MenuListener from. This base class already has two autowired arguments:
To make things easier, there's a DefaultMenuListener to extend your MenuListener from. This base class already has three autowired arguments:
* TranslatorInterface
* Security
* RequestStack

You can use them like so:
* `$this->getTranslator()->trans('some text')` to translate stuff
* `$this->getSecurity()->isGranted('ROLE_ADMIN');` to check for roles
* `$this->getRequestStack()->getCurrentRequest()->...` to access the current request.

There is also a helper called `enableChildRoutes`, which takes a prefix string as an argument. Calling this method on a menu item, will activate it when a route is visited that starts with the prefix you pass.

In short, if you have a menu item with `user_overview` as the route, and you enable child routes with the `user_` prefix, all the following routes will also mark the user menu item as active:

* `user_create`
* `user_update`
* `user_export`
* `user_whatever`
## The example listener

```php
Expand Down Expand Up @@ -52,16 +61,18 @@ class MenuListener extends DefaultMenuListener
);
}

$menu->addChild(
$factory->createItem(
$this->getTranslator()->trans('menu.something_regular'),
[
'route' => 'route_for_normal_users',
'labelAttributes' => [
'icon' => 'fas fa-user',
],
$userItem = $factory->createItem(
$this->getTranslator()->trans('menu.something_regular'),
[
'route' => 'user_overview',
'labelAttributes' => [
'icon' => 'fas fa-user',
],
)
],
);

$userMenuItem->enableChildRoutes($userItem, 'user_');

$menu->addChild($userMenuItem);
}
}
27 changes: 26 additions & 1 deletion src/EventListener/DefaultMenuListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,25 @@

namespace SumoCoders\FrameworkCoreBundle\EventListener;

use Knp\Menu\ItemInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Security\Core\Security;
use Symfony\Contracts\Translation\TranslatorInterface;

class DefaultMenuListener
{
private Security $security;
private TranslatorInterface $translator;
private RequestStack $requestStack;

public function __construct(
Security $security,
TranslatorInterface $translator
TranslatorInterface $translator,
RequestStack $requestStack
) {
$this->security = $security;
$this->translator = $translator;
$this->requestStack = $requestStack;
}

public function getSecurity(): Security
Expand All @@ -27,4 +32,24 @@ public function getTranslator(): TranslatorInterface
{
return $this->translator;
}

public function getRequestStack(): RequestStack
{
return $this->requestStack;
}

public function enableChildRoutes(ItemInterface $item, string $prefix)
{
$request = $this->requestStack->getCurrentRequest();

if (str_contains($request->get('_route'), $prefix)) {
$item->setExtra('routes',
[
[
'route' => $request->get('_route')
]
]
);
}
}
}