novius/laravel-nova-menu

A Laravel Nova resource tool.

v3.1.1 2021-09-22 12:51 UTC

README

Travis Packagist Release Licence

A Nova tool to manage menus.

Requirements

  • PHP >= 7.4
  • Laravel Nova >= 3.0
  • Laravel Framework >= 8.43

NOTE: These instructions are for Laravel >= 8.43. If you are using prior version, please see the previous version's docs.

Installation

composer require novius/laravel-nova-menu

Then, launch migrations

php artisan migrate

Configuration

Some options that you can override are available.

php artisan vendor:publish --provider="Novius\LaravelNovaMenu\LaravelNovaMenuServiceProvider" --tag="config"

Edit default templates

Run:

php artisan vendor:publish --provider="Novius\LaravelNovaMenu\LaravelNovaMenuServiceProvider" --tag="views"

Usage

Blade directive

You can display menu with :

@menu("slug-of-menu")

By default a fallback to app()->getLocale() is activated.

If you want force a specific slug with no fallback you can call :

@menu("slug-of-menu|no-locale-fallback")

Override views

You can override views with :

php artisan vendor:publish --provider="Novius\LaravelNovaMenu\LaravelNovaMenuServiceProvider" --tag="views"

Manage internal link possibilities

linkable_objects

You can add dynamic routes to linkable_objects array (in configuration file).

Example with App\Models\Foo Model.

In this example we have a route defined as following :

Route::get('foo/{slug}', 'FooController@show')->name('foo.show');

First, you have to add the Model to laravel-nova-menu.php config file.

return [
    'linkable_objects'=> [
        App\Models\Foo:class => 'foo.label', // foo.label is a translation key
    ],
    ...
];

Then, you have to implements Linkable trait to the model.

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Novius\LaravelNovaMenu\Traits\Linkable;

class Foo extends Model
{
    use Linkable;

    public function linkableUrl(): string
    {
        return route('foo.show', ['slug' => $this->slug]);
    }

    public function linkableTitle(): string
    {
        return $this->name;
    }
}

linkable_routes

You can also add static routes to linkable_routes array (in configuration file).

Example with a route with name home.

return [
    'linkable_objects'=> [
        'contact' => 'contact.page', // contact.page is a translation key
    ],
    ...
];

Lint

Run php-cs with:

composer run-script lint

Contributing

Contributions are welcome! Leave an issue on Github, or create a Pull Request.

Licence

This package is under GNU Affero General Public License v3 or (at your option) any later version.