安装
Releases Note,他们的源代码没有在github上
因为我目前使用的是付费的,所以是把Nova目录直接放到了根目录,升级的时候只需要在后台重新下载一个包覆盖即可
安装步骤:和普通的包安装方式不一样,因为需要购买
license
,商用$199/project
资源
php artisan nova:resource Post
生成资源管理类,一般和Model
名一样即可
1 | class Projects { |
字段
字段通用参数
1 | ::make('Name', 'name_column') # 可以给make提供第二个参数指定数据库列是哪一个字段 |
常用字段
1 | # Boolean布尔字段 |
其他字段
1 | # Computed字段 |
关联字段
1 | # BelongsTo |
Filter
通过命令
php artisan nova:filter UserType
新建过滤器,--boolean
可以创建布尔类型的,但是不好用,只有true/false
没有不选择的状态,所以我一般用默认的,默认的就是select
下拉选择然后在需要使用的资源的
filters
里面添加上即可return [new UserType]
在
app/Nova/Filters
里面有我们新建的过滤器1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20// 根据前端选择进行查询
public function apply(Request $request, $query, $value)
{
if ($value === 'yes') {
return $query->whereNotNull('field');
}
if ($value === 'no') {
return $query->whereNull('field');
}
return $query; // 可以默认不选择的情况
}
// 定义有哪些选项
public function options($request)
{
return [
'Yes' => 'yes',
'No' => 'no'
];
}
Observer
可以在和普通model对象一样在保存前后执行一些自定义的hook,只需要
php artisan make:observer -m Post PostObserver
,会在observer
目录下生成文件1
2
3
4
5
6
7
8
9
10
11
12
13
14
15# app/Observers/PostObserver
class PostObserver {
public function creating(Post $post) {
$post->field = request()->input('abc');
unset($post->field);
}
}
# 最后需要在AppServiceProvider的boot中进行注册
public function boot()
{
Nova::serving(function () {
Post::observe(PostObserver::class);
});
}
扩展字段开发
可以参考文档
resources/js/components/FormField.vue
是编辑资源的时候用的1
2
3
4
5
6
7
8
9
10
11
12
13<template>
</template>
<script>
props: ['resourceName', 'resourceId', 'field'], // 其中field.value就是原始值,field.attribute是原始字段名
methods: {
fill (formData) {
formData.append( this.field.attribute, this.myValue); // 设置提交表单的时候提交的值
formData.append( this.field.attribute, [1, 2, 3]); // 如果是要更新关联表的关联可以仅传递关联的对象的id
formData.append( this.field.attribute, [{obj_id:1, name: 'test'}, {obj_id:1, name: 'test2'}, {obj_id:1, name: 'tes3'}]); // 如果是要更新关联表的pivot,可以这样传入
}
}
</script>
常用扩展字段
- Nova插件仓库
- 搜索关联表字段
- Cloudinary字段
- dependent-filter: 依赖filter,联动filter,一个filter的select options根据另外一个filter来决定,例如国家城市的联动选择,需要注意的是需要联动的那个字段类不需要定义
public $component = 'select-filter';
,否则不能生效,对他也不需要apply
,它的apply
发生在$dependentOf
的字段里面。然后两边的options
都包含name/value
两个字段 - Nova Button: 提供一个独立的按钮在列表里面,可以自定义很多样式,和form上面的不同,这个button是没有label的。不过有个缺点是不支持直接调用action,如果需要在点击它的时候触发某些操作,需要去监听它所触发的事件event,监听需要用到nova的listener
- Nova Import: Nova excel/csv导入插件,不过作者说了nova 3.10.0+以后可以不用这个库就能实现了,可以直接参考这里,非常简单
- Nova NestedSet Tree Attach Many Field: 非常好用的数据库树状结构字段,但是我使用的时候在detail页面有点样式问题,修改了一下,可以参考我的PR
- Nova AJAX Field: 可以做到通过ajax进行关联查询,虽然代码写得有点死,但是够用了
TroubleShooting
**DateTiem field must cast to ‘datetime’**,这是因为在
Nova
里面使用了DateTime字段,但是在Model
上没有将该字段设置为casts
,需要在Model
上这样做1
2
3protected $casts = [
'字段名' => 'datetime'
]/public/vendor/nova下的静态文件无法访问,404: 原因可能是文件权限的问题,看当前用户能否读取