adminarchitect / navigation
Admin Architect - 导航模块。该包提供了一种简单的方法来从/到数据库中构建和存储。
Requires
- cviebrock/eloquent-sluggable: 4.2.*
README
Navigation是一个基于Laravel(AdminArchitect导向)的包,用于处理动态菜单。提供了LinksProvider、RoutesProvider和EloquentProvider。
注意
注意,adminarchitect/navigation
基于AdminArchitect包,如果没有它将无法工作。
安装
composer require adminarchitect/navigation
将以下行添加到您的config/app.php文件中
- 在
providers
数组中添加Terranet\Navigation\ServiceProvider::class
行 - 在
aliases
数组中添加'Navigation' => Terranet\Navigation\Facade::class,
行
运行
php artisan vendor:publish --provider="Terranet\\Navigation\\ServiceProvider"
php artisan navigation:table
php artisan migrate
提供者
Navigation基于提供者,每个提供者都可以提供一组可导航项,并且应该实现一个默认合约或定义一个新的合约。
LinksProvider
:提供了一种添加静态链接的方式:url => title;RoutesProvider
:提供了一种将路由添加到菜单的方式;EloquentProvider
:提供了一种将Eloquent模型添加到可导航集合的方式。
所有可用的提供者都通过config/navigation.php文件中的providers
数组注册。
要创建一个新的提供者,运行:php artisan navigation <Name>
,然后在config/navigation.php中注册它。
任何扩展EloquentProvider的提供者都应该提供一组实现NavigationItem合约的项目。NavigationItem需要实现3个简单方法
- navigationKey => 应返回项目的唯一键,通常是
id
; - navigationTitle => 应返回项目标题,可能是:
title
、name
、任何标识模型标题的内容。 - navigationUrl => 应返回项目的特定URL,可能返回
url(<url>)
或route(<name>, <params>)
例如,要允许将Posts
添加到导航中,您必须创建一个PostsProvider
,然后修改您的Post
模型,如下所示
php artisan navigation:provider PostsProvider
Provider
命令将生成app\Http\Terranet\Administrator\Navigation\Providers\PostsProvider
类
<?php
namespace App\Http\Terranet\Administrator\Navigation\Providers;
use Terranet\Navigation\Providers\EloquentProvider;
class PostsProvider extends EloquentProvider
{
/**
* Eloquent model.
*/
protected $model;
}
现在您只需要提供一个有效的eloquent $model,例如App\Post
protected $model = \App\Post::class;
接下来,在config/navigation.php
中注册它
'providers' => [
...
\App\Http\Terranet\Administrator\Navigation\Providers\PostsProvider::class,
...
]
可导航的Eloquent模型应实现NavigationItem合约,因此App\Post
应如下所示
class Post extends Model implements NavigationItem
{
protected $fillable = [
'user_id', 'title', 'slug', 'published', 'image',
];
public function navigationKey()
{
return $this->id;
}
public function navigationTitle()
{
return $this->title;
}
public function navigationUrl()
{
return route('posts.show', ['slug' => $this->slug]);
}
}