PHPackages                             prodigious/sonata-menu-bundle - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. prodigious/sonata-menu-bundle

ActiveSymfony-bundle[Utility &amp; Helpers](/categories/utility)

prodigious/sonata-menu-bundle
=============================

This bundle provides menu management by sonata admin bundle (compatible with sonata page bundle).

3.0.7(5y ago)1029.6k↓50%20[5 issues](https://github.com/nan-guo/Sonata-Menu-Bundle/issues)MITPHPPHP &gt;=7.1.3

Since Dec 16Pushed 5mo ago2 watchersCompare

[ Source](https://github.com/nan-guo/Sonata-Menu-Bundle)[ Packagist](https://packagist.org/packages/prodigious/sonata-menu-bundle)[ Docs](https://github.com/nan-guo/SonataMenuBundle)[ RSS](/packages/prodigious-sonata-menu-bundle/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (10)Dependencies (5)Versions (14)Used By (0)

Sonata Menu Bundle
==================

[](#sonata-menu-bundle)

This bundle provides menu management by sonata admin bundle (compatible with sonata page bundle).

Compatibility
=============

[](#compatibility)

- For Symfony 2, please install version 2.x
- For Symfony 3 and Symfony 4 , please install version 3.x
- For Symfony 6 please install version 4.x
-

Prerequisites
=============

[](#prerequisites)

- SonataAdminBundle
- SonataPageBundle (Optional)

Screenshots
===========

[](#screenshots)

[![screenshot](https://github.com/nan-guo/Sonata-Menu-Bundle/raw/master/Resources/public/imgs/screenshot-1.png)](https://github.com/nan-guo/Sonata-Menu-Bundle/blob/master/Resources/public/imgs/screenshot-1.png)

[![screenshot](https://github.com/nan-guo/Sonata-Menu-Bundle/raw/master/Resources/public/imgs/screenshot-3.png)](https://github.com/nan-guo/Sonata-Menu-Bundle/blob/master/Resources/public/imgs/screenshot-3.png)

Check out [more screenshots](https://github.com/nan-guo/Sonata-Menu-Bundle/tree/master/Resources/public/imgs).

Installation
============

[](#installation)

```

composer require prodigious/sonata-menu-bundle

```

Configuration
=============

[](#configuration)

```
// Symfony 2
// app/AppKernel.php
new Prodigious\Sonata\MenuBundle\ProdigiousSonataMenuBundle(),

php app/console cache:clear
php app/console doctrine:schema:update --force
php app/console assets:install

```

```
// Symfony 3
// app/AppKernel.php
new Prodigious\Sonata\MenuBundle\ProdigiousSonataMenuBundle(),

php bin/console cache:clear
php bin/console doctrine:schema:update --force
php bin/console assets:install

```

```
// Symfony 4
// config/bundles.php
Prodigious\Sonata\MenuBundle\ProdigiousSonataMenuBundle::class => ['all' => true],

php bin/console cache:clear
php bin/console doctrine:migration:diff
php bin/console doctrine:migration:migrate
php bin/console assets:install

```

```
// Symfony 6
// config/bundles.php
Prodigious\Sonata\MenuBundle\ProdigiousSonataMenuBundle::class => ['all' => true],

php bin/console cache:clear
php bin/console doctrine:migration:diff
php bin/console doctrine:migration:migrate
php bin/console assets:install

```

### sonata\_admin.yml

[](#sonata_adminyml)

Add menu to your sonata admin menu list. For symfony 4, you can also let it empty, menu will be added automatically

```
sonata_admin:
    dashboard:
        groups:
            // Optional for symfony 4
            sonata.admin.group.menu_builder:
                label:           config.label_menu
                label_catalogue: ProdigiousSonataMenuBundle
                icon:            ''
                items:
                    - prodigious_sonata_menu.admin.menu

            // Sonata page menu
            # sonata.admin.group.site_builder:
            #     label:           site
            #     label_catalogue: SonataPageBundle
            #     icon:            ''
            #     items:
            #         - sonata.page.admin.site
            #         - sonata.page.admin.page

```

Advanced configurations ( Symfony 3 / Syfmony 4 )
=================================================

[](#advanced-configurations--symfony-3--syfmony-4-)

#### Create custom entities

[](#create-custom-entities)

Edit the configuration

- prodigious\_sonata\_menu.yaml

```
prodigious_sonata_menu:
    entities:
        menu: AppBundle\Entity\Menu
        menu_item: AppBundle\Entity\MenuItem

```

Then create the related entity menu and menu item. You can add extra fields

- Menu

```
namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Prodigious\Sonata\MenuBundle\Model\Menu as BaseMenu;

/**
 * Class Menu
 *
 * @ORM\Table(name="sonata_menu")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\Menu\MenuRepository")
 */
class Menu extends BaseMenu
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * Class constructor
     *
     */
    public function __construct()
    {
        parent::__construct();
    }

    public function getId(): ?int
    {
        return $this->id;
    }
}

```

- MenuItem

```
namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Prodigious\Sonata\MenuBundle\Model\MenuItem as BaseMenuItem;

/**
 * Class MenuItem
 *
 * @ORM\Table(name="sonata_menu_item")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\MenuItemRepository")
 */
class MenuItem extends BaseMenuItem
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var string
     *
     * @ORM\Column(type="string", nullable=true)
     */
    protected $icon;

    /**
     * Class constructor
     *
     */
    public function __construct()
    {
        parent::__construct();
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    /**
     * @return string
     */
    public function getIcon()
    {
        return $this->icon;
    }

    /**
     * @param string $icon
     * @return $this
     */
    public function setIcon($icon)
    {
        $this->icon = $icon;

        return $this;
    }
}

```

Clear cache and update database

```
// Symfony 3

php bin/console cache:clear
php bin/console doctrine:schema:update --force

// Symfony 4

php bin/console cache:clear
php bin/console doctrine:migration:diff
php bin/console doctrine:migration:migrate

```

Remember to update admin classes by extending the original ones :

Edit the configuration

- prodigious\_sonata\_menu.yaml

```
prodigious_sonata_menu:
    entities:
        menu: AppBundle\Entity\Menu
        menu_item: AppBundle\Entity\MenuItem
    admins:
        menu: AppBundle\Admin\MyMenuAdmin
        menu_item: AppBundle\Admin\MyMenuItemAdmin

```

And create your admin class

```
namespace AppBundle\Admin;

use Prodigious\Sonata\MenuBundle\Admin\MenuAdmin as BaseAdmin;
use Sonata\AdminBundle\Form\FormMapper;

class MyMenuAdmin extends BaseAdmin
{
    /**
     * {@inheritdoc}
     */
    protected function configureFormFields(FormMapper $formMapper)
    {
        parent::configureFormFields($formMapper);
    }
}

```

```
namespace AppBundle\Admin;

use Prodigious\Sonata\MenuBundle\Admin\MenuItemAdmin as BaseAdmin;
use Sonata\AdminBundle\Form\FormMapper;
use Symfony\Component\Form\Extension\Core\Type\TextType;

class MyMenuItemAdmin extends BaseAdmin
{
    /**
     * {@inheritdoc}
     */
    protected function configureFormFields(FormMapper $formMapper)
    {
        parent::configureFormFields($formMapper);

        $formMapper
            ->with('config.label_menu_item')
                ->add('icon', TextType::class, [
                        'label' => 'config.label_icon'
                    ]
                )
            ->end()
        ->end();
    }
}

```

Getting Started with Menu Manager
=================================

[](#getting-started-with-menu-manager)

### Controller

[](#controller)

```
$mm = $this->container->get('prodigious_sonata_menu.manager');

$menuId = 1; // Example

$menu = $mm->load($menuId);

// $status = true (Get enabled menu items)
// $status = false (Get disabled menu items)
// getMenuItems($menu, $root = MenuManager::ITEM_CHILD, $status = MenuManager::STATUS_ALL)

$menuItems = $mm->getMenuItems($menu, true);

return  $this->render('menu/menu.html.twig', [
            '$menuItems' => $menuItems,
        ]);

```

#### And then, it's your showtime. For the frontend, you can output the results as you want.

[](#and-then-its-your-showtime-for-the-frontend-you-can-output-the-results-as-you-want)

#### For example :

[](#for-example-)

- menu.html.twig

```
{% if menuItems is not null and menuItems|length > 0 %}

{% import 'AppBundle:Menu:menu_tree_macro.html.twig' as tree %}

{% set currentPath = app.request.requestUri %}

{{ tree.menu(menuItems, currentPath) }}

{% endif %}

```

- menu\_tree\_macro.html.twig

```
{% macro menu(items, currentPath) %}

    {% import _self as self %}

            {% for menuItem in items %}

            {% set url = menuItem.url %}
            {% set attributes = "menu-item" %}
            {% if menuItem.classAttribute %}
            {% set attributes = attributes ~ ' ' ~ menuItem.classAttribute %}
            {% endif %}
            {% if menuItem.hasChild() %}

            {% set attributes = attributes ~ ' has-child' %}

            {% for childItem in menuItem.children %}

            {% set childUrl = childItem.url %}

            {% if childUrl == currentPath %}
            {% set attributes = attributes ~ ' current-parent' %}
            {% endif %}

            {% endfor %}

            {% endif %}

                {% if menuItem.hasChild() %}
                {{ menuItem.name }}
                {% endif %}

            {% endfor %}

{% endmacro %}

```

Changelog
=========

[](#changelog)

### 3.0.0

[](#300)

- Add Symfony 4 support

### 2.0.4

[](#204)

- Fix Symfony 3 compability bugs
- Remove custom routing config

### 2.0.5

[](#205)

- Fix Menu Item Admin bug

### 2.0.6

[](#206)

- Add column to Menu Admin

Additional info
===============

[](#additional-info)

Author: [Nan GUO](https://github.com/nan-guo/)

Company : [Prodigious](http://www.prodigious.com/)

###  Health Score

42

—

FairBetter than 90% of packages

Maintenance38

Infrequent updates — may be unmaintained

Popularity34

Limited adoption so far

Community19

Small or concentrated contributor base

Maturity65

Established project with proven stability

 Bus Factor1

Top contributor holds 75.6% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~99 days

Total

13

Last Release

1882d ago

Major Versions

2.0.7 → 3.0.02018-11-15

PHP version history (2 changes)2.0.3PHP &gt;=5.3.9

3.0.0PHP &gt;=7.1.3

### Community

Maintainers

![](https://www.gravatar.com/avatar/ad5c92c69a118800ec88598e651cef562f2d4b263c56200ce586e6f61f4f0f41?d=identicon)[nan-guo](/maintainers/nan-guo)

---

Top Contributors

[![nan-guo](https://avatars.githubusercontent.com/u/30159577?v=4)](https://github.com/nan-guo "nan-guo (59 commits)")[![Jihell](https://avatars.githubusercontent.com/u/3269035?v=4)](https://github.com/Jihell "Jihell (9 commits)")[![DILL44](https://avatars.githubusercontent.com/u/2000931?v=4)](https://github.com/DILL44 "DILL44 (4 commits)")[![tbourdin](https://avatars.githubusercontent.com/u/7794319?v=4)](https://github.com/tbourdin "tbourdin (3 commits)")[![Luminatus](https://avatars.githubusercontent.com/u/12483395?v=4)](https://github.com/Luminatus "Luminatus (1 commits)")[![JonathanBaudoin](https://avatars.githubusercontent.com/u/8208294?v=4)](https://github.com/JonathanBaudoin "JonathanBaudoin (1 commits)")[![NMe84](https://avatars.githubusercontent.com/u/4869296?v=4)](https://github.com/NMe84 "NMe84 (1 commits)")

---

Tags

sonatasonata-menu-adminMenu managementsonata admin menu bundle

### Embed Badge

![Health badge](/badges/prodigious-sonata-menu-bundle/health.svg)

```
[![Health](https://phpackages.com/badges/prodigious-sonata-menu-bundle/health.svg)](https://phpackages.com/packages/prodigious-sonata-menu-bundle)
```

###  Alternatives

[pentatrion/vite-bundle

Vite integration for your Symfony app

2725.3M13](/packages/pentatrion-vite-bundle)[netgen/layouts-core

Netgen Layouts enables you to build and manage complex web pages in a simpler way and with less coding. This is the core of Netgen Layouts, its heart and soul.

3689.4k10](/packages/netgen-layouts-core)[codefog/contao-haste

haste extension for Contao Open Source CMS

42650.8k139](/packages/codefog-contao-haste)[symfony/ai-bundle

Integration bundle for Symfony AI components

30282.3k6](/packages/symfony-ai-bundle)[netgen/content-browser

Netgen Content Browser is a Symfony bundle that provides an interface which selects items from any kind of backend and returns the IDs of selected items back to the calling code.

14112.1k8](/packages/netgen-content-browser)[robole/sulu-ai-translator-bundle

Translate any type of content using DeepL

181.3k](/packages/robole-sulu-ai-translator-bundle)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
