PHPackages                             camurphy/bootstrap-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. [Templating &amp; Views](/categories/templating)
4. /
5. camurphy/bootstrap-menu-bundle

ActiveSymfony-bundle[Templating &amp; Views](/categories/templating)

camurphy/bootstrap-menu-bundle
==============================

Render Bootstrap menus using Symfony

1.6.0(2y ago)75.9k2[1 issues](https://github.com/cameronmurphy/bootstrap-menu-bundle/issues)1MITPHPPHP ^7.1.3 || ^8.0CI failing

Since Mar 14Pushed 2y ago1 watchersCompare

[ Source](https://github.com/cameronmurphy/bootstrap-menu-bundle)[ Packagist](https://packagist.org/packages/camurphy/bootstrap-menu-bundle)[ RSS](/packages/camurphy-bootstrap-menu-bundle/feed)WikiDiscussions main Synced 3w ago

READMEChangelog (10)Dependencies (10)Versions (13)Used By (1)

Bootstrap Menu Bundle
=====================

[](#bootstrap-menu-bundle)

[![CircleCI](https://camo.githubusercontent.com/badace97d33ff006244f54c3ba81d7d00e7d35df085cc1bab70bb08f31e912f2/68747470733a2f2f646c2e636972636c6563692e636f6d2f7374617475732d62616467652f696d672f636972636c6563692f3334764d59584170757a733673704172754d377751792f4a634a58705a714b615941353253446941756e73504d2f747265652f6d61696e2e7376673f7374796c653d73766726636972636c652d746f6b656e3d36393139393537383764336365306531333936623733663737613337323532313636613939306332)](https://dl.circleci.com/status-badge/redirect/circleci/34vMYXApuzs6spAruM7wQy/JcJXpZqKaYA52SDiAunsPM/tree/main)

A simple [Symfony](https://symfony.com/) bundle for defining your application's menus in configuration and rendering them to work with [Bootstrap](https://getbootstrap.com/)'s [Navbar](https://getbootstrap.com/docs/5.2/components/navbar/) component. This bundle supports Bootstrap versions 4 and 5.

Installation
------------

[](#installation)

```
$ composer require camurphy/bootstrap-menu-bundle
```

Usage
-----

[](#usage)

Your menus are defined in `config/packages/bootstrap_menu.yaml`.

Below is a very simple menu called `main` with only a single 'Logout' link.

```
bootstrap_menu:
  version: 5 # Optional, defaults to Bootstrap 5
  dropdown_active_style: false # Optional, defaults to false
  dropdown_item_active_style: false # Optional, defaults to false
  menus:
    main:
      items:
        logout:
          label: 'Logout'
          route: 'app_logout'
```

Then within your template you can render your menu in a Navbar by passing the name of your menu to `render_bootstrap_menu`. This markup is taken from the [Bootstrap Navbar Fixed example](https://getbootstrap.com/docs/5.2/examples/navbar-fixed/). The Bootstrap 4 version is [here](https://getbootstrap.com/docs/4.6/examples/navbar-fixed)

```

    Navbar

        {{ render_bootstrap_menu('main') }}

```

Result:

[![Example 1](https://private-user-images.githubusercontent.com/1300032/318157488-128ec4b0-2f26-40d9-af14-c7ef5efc0f9d.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODA3NzI2NTUsIm5iZiI6MTc4MDc3MjM1NSwicGF0aCI6Ii8xMzAwMDMyLzMxODE1NzQ4OC0xMjhlYzRiMC0yZjI2LTQwZDktYWYxNC1jN2VmNWVmYzBmOWQucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDYwNiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjA2MDZUMTg1OTE1WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9Yzk3MDlkOTllYjYzMTJmNzc5YmNhNWI0ZDkyN2NiMDczNDg5YThiYmU5NTc4NTA0ZGVjMTMyOTQxMTE3MzMwMyZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmcmVzcG9uc2UtY29udGVudC10eXBlPWltYWdlJTJGcG5nIn0.m0v91dj25SS0upwToHhNH-zXpYg8xQan2s7FHbtwkt4)](https://private-user-images.githubusercontent.com/1300032/318157488-128ec4b0-2f26-40d9-af14-c7ef5efc0f9d.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODA3NzI2NTUsIm5iZiI6MTc4MDc3MjM1NSwicGF0aCI6Ii8xMzAwMDMyLzMxODE1NzQ4OC0xMjhlYzRiMC0yZjI2LTQwZDktYWYxNC1jN2VmNWVmYzBmOWQucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDYwNiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjA2MDZUMTg1OTE1WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9Yzk3MDlkOTllYjYzMTJmNzc5YmNhNWI0ZDkyN2NiMDczNDg5YThiYmU5NTc4NTA0ZGVjMTMyOTQxMTE3MzMwMyZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmcmVzcG9uc2UtY29udGVudC10eXBlPWltYWdlJTJGcG5nIn0.m0v91dj25SS0upwToHhNH-zXpYg8xQan2s7FHbtwkt4)

### Route parameters

[](#route-parameters)

Perhaps your route requires parameters. You can also specify these.

```
bootstrap_menu:
  menus:
    main:
      items:
        backorder_report:
          label: 'Backorder Report'
          route: 'app_reports'
          route_parameters:
            id: 'backorder'
```

### External URL

[](#external-url)

If you would instead like to link to an absolute URL, use `url` instead.

```
bootstrap_menu:
  menus:
    main:
      items:
        disney:
          label: 'Disney'
          url: 'https://www.disney.com'
```

### Dropdowns

[](#dropdowns)

Simply by specifying `items` instead of a `route` or `url` to link to, your menu item becomes a Dropdown. Here's an example where a 'Change Password' and a 'Logout' link are nested below an 'Account' dropdown.

```
bootstrap_menu:
  menus:
    main:
      items:
        account:
          label: 'Account'
          items:
            change_password:
              label: 'Change password'
              route: 'app_change_password'
            logout:
              label: 'Logout'
              route: 'app_logout'
```

Result:

[![Example 2](https://private-user-images.githubusercontent.com/1300032/318157515-88b57cd9-2d1d-4389-870c-c3fbce0613d7.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODA3NzI2NTUsIm5iZiI6MTc4MDc3MjM1NSwicGF0aCI6Ii8xMzAwMDMyLzMxODE1NzUxNS04OGI1N2NkOS0yZDFkLTQzODktODcwYy1jM2ZiY2UwNjEzZDcucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDYwNiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjA2MDZUMTg1OTE1WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9MDM1MjRlOTE0ZDIzNWE5YmY1ODMzMTU4MzBiZjQ5NjZmOTgxMDU1YzgyODBmZWZlOGFiZmI4ZjYxMzUyYTU3YiZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmcmVzcG9uc2UtY29udGVudC10eXBlPWltYWdlJTJGcG5nIn0.PT3jaUQ96WOO9RmxzRoz56-krHNtekKzK0RkMr2fgA0)](https://private-user-images.githubusercontent.com/1300032/318157515-88b57cd9-2d1d-4389-870c-c3fbce0613d7.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODA3NzI2NTUsIm5iZiI6MTc4MDc3MjM1NSwicGF0aCI6Ii8xMzAwMDMyLzMxODE1NzUxNS04OGI1N2NkOS0yZDFkLTQzODktODcwYy1jM2ZiY2UwNjEzZDcucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDYwNiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjA2MDZUMTg1OTE1WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9MDM1MjRlOTE0ZDIzNWE5YmY1ODMzMTU4MzBiZjQ5NjZmOTgxMDU1YzgyODBmZWZlOGFiZmI4ZjYxMzUyYTU3YiZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmcmVzcG9uc2UtY29udGVudC10eXBlPWltYWdlJTJGcG5nIn0.PT3jaUQ96WOO9RmxzRoz56-krHNtekKzK0RkMr2fgA0)

#### Dividers

[](#dividers)

Dropdowns can also contain [Dividers](https://getbootstrap.com/docs/4.3/components/dropdowns/#dividers) to separate groups of related menu items.

```
bootstrap_menu:
  menus:
    main:
      items:
        account:
          label: 'Account'
          items:
            change_password:
              label: 'Change password'
              route: 'app_change_password'
            divider:
              is_divider: true
            logout:
              label: 'Logout'
              route: 'app_logout'
```

Result:

[![Example 3](https://private-user-images.githubusercontent.com/1300032/318157527-06ffb618-32d6-48ad-9641-38a59ccade8c.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODA3NzI2NTUsIm5iZiI6MTc4MDc3MjM1NSwicGF0aCI6Ii8xMzAwMDMyLzMxODE1NzUyNy0wNmZmYjYxOC0zMmQ2LTQ4YWQtOTY0MS0zOGE1OWNjYWRlOGMucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDYwNiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjA2MDZUMTg1OTE1WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9ZDVkODY1ZTNiNWI5YzFkNDQ3ZjFkYTAyNjZhZGY1N2ZhYWNmZjhmNjhlMGY2MDMwMWM4ZmE1MWI2MDllZWY0YiZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmcmVzcG9uc2UtY29udGVudC10eXBlPWltYWdlJTJGcG5nIn0.xQC-NFumle2e2OHiOnIcq2szPAjAjuBQVvtFuYmNnYg)](https://private-user-images.githubusercontent.com/1300032/318157527-06ffb618-32d6-48ad-9641-38a59ccade8c.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODA3NzI2NTUsIm5iZiI6MTc4MDc3MjM1NSwicGF0aCI6Ii8xMzAwMDMyLzMxODE1NzUyNy0wNmZmYjYxOC0zMmQ2LTQ4YWQtOTY0MS0zOGE1OWNjYWRlOGMucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDYwNiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjA2MDZUMTg1OTE1WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9ZDVkODY1ZTNiNWI5YzFkNDQ3ZjFkYTAyNjZhZGY1N2ZhYWNmZjhmNjhlMGY2MDMwMWM4ZmE1MWI2MDllZWY0YiZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmcmVzcG9uc2UtY29udGVudC10eXBlPWltYWdlJTJGcG5nIn0.xQC-NFumle2e2OHiOnIcq2szPAjAjuBQVvtFuYmNnYg)

#### Headers

[](#headers)

Dividers that also contain a `label` become [Headers](https://getbootstrap.com/docs/4.3/components/dropdowns/#headers).

```
bootstrap_menu:
  menus:
    main:
      items:
        account:
          label: 'Account'
          items:
            password_divider:
              is_divider: true
              label: 'Password Stuff'
            change_password:
              label: 'Change password'
              route: 'app_change_password'

            other_divider:
              is_divider: true
              label: 'Other Stuff'
            logout:
              label: 'Logout'
              route: 'app_logout'
```

Result:

[![Example 4](https://private-user-images.githubusercontent.com/1300032/318157544-6363a9b3-a5c4-4d39-9f04-a569dc286517.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODA3NzI2NTUsIm5iZiI6MTc4MDc3MjM1NSwicGF0aCI6Ii8xMzAwMDMyLzMxODE1NzU0NC02MzYzYTliMy1hNWM0LTRkMzktOWYwNC1hNTY5ZGMyODY1MTcucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDYwNiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjA2MDZUMTg1OTE1WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9YjYzZjczMzA0NjZjNjQwNDNkYjg1ZWRhNjJmNmM0NDJlODYzYjBjYzY0YTZhYjcxZjg5Y2Y3YzkzMjg1OTQ3YSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmcmVzcG9uc2UtY29udGVudC10eXBlPWltYWdlJTJGcG5nIn0.z3AWsAmg3QhGdx3Sbd92aqL2LGEQ_fwkGpJ9uVVlXls)](https://private-user-images.githubusercontent.com/1300032/318157544-6363a9b3-a5c4-4d39-9f04-a569dc286517.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODA3NzI2NTUsIm5iZiI6MTc4MDc3MjM1NSwicGF0aCI6Ii8xMzAwMDMyLzMxODE1NzU0NC02MzYzYTliMy1hNWM0LTRkMzktOWYwNC1hNTY5ZGMyODY1MTcucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDYwNiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjA2MDZUMTg1OTE1WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9YjYzZjczMzA0NjZjNjQwNDNkYjg1ZWRhNjJmNmM0NDJlODYzYjBjYzY0YTZhYjcxZjg5Y2Y3YzkzMjg1OTQ3YSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmcmVzcG9uc2UtY29udGVudC10eXBlPWltYWdlJTJGcG5nIn0.z3AWsAmg3QhGdx3Sbd92aqL2LGEQ_fwkGpJ9uVVlXls)

#### Security

[](#security)

Certain parts of the menu may be locked down by role. This following example only allows administrators to change their password.

```
bootstrap_menu:
  menus:
    main:
      items:
        account:
          label: 'Account'
          items:
            password_divider:
              is_divider: true
              label: 'Password Stuff'
            change_password:
              label: 'Change password'
              route: 'app_change_password'
              roles: [ 'ROLE_ADMINISTRATOR' ]

            other_divider:
              is_divider: true
              label: 'Other Stuff'
            logout:
              label: 'Logout'
              route: 'app_logout'
```

For a user without `ROLE_ADMINISTRATOR` they would see:

[![Example 5](https://private-user-images.githubusercontent.com/1300032/318157557-aa90ef88-72de-4b27-b474-096579f539b1.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODA3NzI2NTUsIm5iZiI6MTc4MDc3MjM1NSwicGF0aCI6Ii8xMzAwMDMyLzMxODE1NzU1Ny1hYTkwZWY4OC03MmRlLTRiMjctYjQ3NC0wOTY1NzlmNTM5YjEucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDYwNiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjA2MDZUMTg1OTE1WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9NGRkZTYyZmU0MTY2ZDllYzk3MDA4ZjU0MTBhMDdiNTcwZTE3NGRlYzgyZjI1YzNkNDNjMzhkYTkxNTgxNjI0OSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmcmVzcG9uc2UtY29udGVudC10eXBlPWltYWdlJTJGcG5nIn0.8mlkE47VlO0iG6zxBMm0q0qdHJeidCYipethkLITgiM)](https://private-user-images.githubusercontent.com/1300032/318157557-aa90ef88-72de-4b27-b474-096579f539b1.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODA3NzI2NTUsIm5iZiI6MTc4MDc3MjM1NSwicGF0aCI6Ii8xMzAwMDMyLzMxODE1NzU1Ny1hYTkwZWY4OC03MmRlLTRiMjctYjQ3NC0wOTY1NzlmNTM5YjEucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDYwNiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjA2MDZUMTg1OTE1WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9NGRkZTYyZmU0MTY2ZDllYzk3MDA4ZjU0MTBhMDdiNTcwZTE3NGRlYzgyZjI1YzNkNDNjMzhkYTkxNTgxNjI0OSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmcmVzcG9uc2UtY29udGVudC10eXBlPWltYWdlJTJGcG5nIn0.8mlkE47VlO0iG6zxBMm0q0qdHJeidCYipethkLITgiM)

The reason for this is Bootstrap Menu Bundle intelligently prunes Dropdowns to remove unnecessary Dividers. Because the user is not permitted to see any items between 'Password Stuff' and 'Other Stuff', the 'Password Stuff' Divider is also pruned.

Security can also be configured at a Dropdown level. Perhaps only administrators are allowed to use the 'Users' menu.

```
bootstrap_menu:
  menus:
    main:
      items:
        users:
          label: 'Users'
          roles: [ 'ROLE_ADMINISTRATOR' ]
          items:
            user_list:
              label: 'Users'
              route: 'app_user_list'
            new_user:
              label: 'New User'
              route: 'app_new_user'
```

##### Negating roles

[](#negating-roles)

You may also hide menu items from users that have a certain role by prefixing the role with an exclamation mark. This will take precedence over included roles. In the example below, if they have both `ROLE_SUPPORT` and `ROLE_USER` they will not see the menu item.

```
bootstrap_menu:
  menus:
    main:
      items:
        users:
          label: 'Users'
          roles: [ '!ROLE_SUPPORT', 'ROLE_USER' ]
          items:
            user_list:
              label: 'Users'
              route: 'app_user_list'
```

#### Active styles

[](#active-styles)

Out of the box, top level menu items are given the [`active` class](https://getbootstrap.com/docs/5.2/components/navbar/#nav) when the current route matches the menu item's route. In this example we're on the 'Reports' page.

[![Example 6](https://private-user-images.githubusercontent.com/1300032/318155006-8322b338-3f0d-4940-ab61-900e59886714.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODA3NzI2NTUsIm5iZiI6MTc4MDc3MjM1NSwicGF0aCI6Ii8xMzAwMDMyLzMxODE1NTAwNi04MzIyYjMzOC0zZjBkLTQ5NDAtYWI2MS05MDBlNTk4ODY3MTQucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDYwNiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjA2MDZUMTg1OTE1WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9OTU0MTZmN2ExYjJiMWZjZWNkNzkzNmU4YzEwYzQ1ZTc0MDk5NjY5Y2JmYTFmMmE0Y2Q3NWI4YmM4ZWJjMzdlZiZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmcmVzcG9uc2UtY29udGVudC10eXBlPWltYWdlJTJGcG5nIn0.OekpnE59ztEkbE87h41IwVH247FCy5Vr9ONR_uAjd7o)](https://private-user-images.githubusercontent.com/1300032/318155006-8322b338-3f0d-4940-ab61-900e59886714.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODA3NzI2NTUsIm5iZiI6MTc4MDc3MjM1NSwicGF0aCI6Ii8xMzAwMDMyLzMxODE1NTAwNi04MzIyYjMzOC0zZjBkLTQ5NDAtYWI2MS05MDBlNTk4ODY3MTQucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDYwNiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjA2MDZUMTg1OTE1WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9OTU0MTZmN2ExYjJiMWZjZWNkNzkzNmU4YzEwYzQ1ZTc0MDk5NjY5Y2JmYTFmMmE0Y2Q3NWI4YmM4ZWJjMzdlZiZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmcmVzcG9uc2UtY29udGVudC10eXBlPWltYWdlJTJGcG5nIn0.OekpnE59ztEkbE87h41IwVH247FCy5Vr9ONR_uAjd7o)

##### Dropdown active styles

[](#dropdown-active-styles)

It's not documented, but the `active` class also works on dropdowns and dropdown items. To enable for dropdowns, set `dropdown_active_style`to `true` in the config.

[![Example 7](https://private-user-images.githubusercontent.com/1300032/318155435-fb9c2645-9826-48c3-9ac4-2c6406e09bab.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODA3NzI2NTUsIm5iZiI6MTc4MDc3MjM1NSwicGF0aCI6Ii8xMzAwMDMyLzMxODE1NTQzNS1mYjljMjY0NS05ODI2LTQ4YzMtOWFjNC0yYzY0MDZlMDliYWIucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDYwNiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjA2MDZUMTg1OTE1WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9ZGRlNzA4MjU2Y2FiNDlhNjQzOTkyNDZjNjBkNzE1ZDY1YjAxNmFmYjI1M2FlZTdlNzhkYTk2ODkxMDFhOThiOCZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmcmVzcG9uc2UtY29udGVudC10eXBlPWltYWdlJTJGcG5nIn0.lmviNp0kM4FvwWlt4_9XpV5LKQwj5wNizb3oQOk6ki4)](https://private-user-images.githubusercontent.com/1300032/318155435-fb9c2645-9826-48c3-9ac4-2c6406e09bab.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODA3NzI2NTUsIm5iZiI6MTc4MDc3MjM1NSwicGF0aCI6Ii8xMzAwMDMyLzMxODE1NTQzNS1mYjljMjY0NS05ODI2LTQ4YzMtOWFjNC0yYzY0MDZlMDliYWIucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDYwNiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjA2MDZUMTg1OTE1WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9ZGRlNzA4MjU2Y2FiNDlhNjQzOTkyNDZjNjBkNzE1ZDY1YjAxNmFmYjI1M2FlZTdlNzhkYTk2ODkxMDFhOThiOCZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmcmVzcG9uc2UtY29udGVudC10eXBlPWltYWdlJTJGcG5nIn0.lmviNp0kM4FvwWlt4_9XpV5LKQwj5wNizb3oQOk6ki4)

To enable for dropdown items, set `dropdown_item_active_style` to true.

[![Example 8](https://private-user-images.githubusercontent.com/1300032/318155715-92e12bd9-ab28-44eb-ad2a-91fd3fab2a57.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODA3NzI2NTUsIm5iZiI6MTc4MDc3MjM1NSwicGF0aCI6Ii8xMzAwMDMyLzMxODE1NTcxNS05MmUxMmJkOS1hYjI4LTQ0ZWItYWQyYS05MWZkM2ZhYjJhNTcucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDYwNiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjA2MDZUMTg1OTE1WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9MGUyM2VmNjZhYzBiMGM0MWQxNGZjOTQxZjhjNjEzMGUxNTY5YjM3OWJhMTE0NTYxOTM1YmM3NTE3MWE5NThjNyZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmcmVzcG9uc2UtY29udGVudC10eXBlPWltYWdlJTJGcG5nIn0.JLx0I9SRt2quUEDEj3mz6FIltJquMFYizDk8NRtlyGw)](https://private-user-images.githubusercontent.com/1300032/318155715-92e12bd9-ab28-44eb-ad2a-91fd3fab2a57.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODA3NzI2NTUsIm5iZiI6MTc4MDc3MjM1NSwicGF0aCI6Ii8xMzAwMDMyLzMxODE1NTcxNS05MmUxMmJkOS1hYjI4LTQ0ZWItYWQyYS05MWZkM2ZhYjJhNTcucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDYwNiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjA2MDZUMTg1OTE1WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9MGUyM2VmNjZhYzBiMGM0MWQxNGZjOTQxZjhjNjEzMGUxNTY5YjM3OWJhMTE0NTYxOTM1YmM3NTE3MWE5NThjNyZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmcmVzcG9uc2UtY29udGVudC10eXBlPWltYWdlJTJGcG5nIn0.JLx0I9SRt2quUEDEj3mz6FIltJquMFYizDk8NRtlyGw)

###  Health Score

36

—

LowBetter than 79% of packages

Maintenance17

Infrequent updates — may be unmaintained

Popularity27

Limited adoption so far

Community13

Small or concentrated contributor base

Maturity72

Established project with proven stability

 Bus Factor1

Top contributor holds 97.9% 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 ~167 days

Recently: every ~293 days

Total

12

Last Release

815d ago

Major Versions

0.2.1 → 1.0.02019-08-18

PHP version history (3 changes)0.1PHP ^7.1.3

1.1.0PHP ^7.2.5

1.2.1PHP ^7.1.3 || ^8.0

### Community

Maintainers

![](https://www.gravatar.com/avatar/869bc797579713dbc139e311ae1965c2a5310a9b3ac704f496177d953e7aa5b1?d=identicon)[camurphy](/maintainers/camurphy)

---

Top Contributors

[![cameronmurphy](https://avatars.githubusercontent.com/u/1300032?v=4)](https://github.com/cameronmurphy "cameronmurphy (92 commits)")[![mchojrin](https://avatars.githubusercontent.com/u/1532615?v=4)](https://github.com/mchojrin "mchojrin (2 commits)")

###  Code Quality

TestsPHPUnit

Code StylePHP CS Fixer

### Embed Badge

![Health badge](/badges/camurphy-bootstrap-menu-bundle/health.svg)

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

###  Alternatives

[easycorp/easyadmin-bundle

Admin generator for Symfony applications

4.3k17.5M373](/packages/easycorp-easyadmin-bundle)[2lenet/crudit-bundle

The easy like Crud'it Bundle.

1615.6k12](/packages/2lenet-crudit-bundle)[sulu/sulu

Core framework that implements the functionality of the Sulu content management system

1.3k1.4M196](/packages/sulu-sulu)[open-dxp/opendxp

Content &amp; Product Management Framework (CMS/PIM)

9317.2k55](/packages/open-dxp-opendxp)

PHPackages © 2026

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