laravel-admin是借助强大的Laravel框架,10分钟内搭建一个功能健全CRUD后台不是梦。入手一周,总结一些注意点如下。
修改内置视图资源
有时候想对内置的视图进行修改,参考官方文档的常见问题即可。
select联动多个
联动单个是load(),联动多个就是loads()。这点文档上没有,查看源代码可得知。
select联动的项编辑时如何填充
首先,如果填充这个表单项的资源是一个关联而不是一个字段,切忌不要将关联项的名跟字段名一致。如一件商品所属品牌,数据库中字段是category_id,那么商品模型中的关联就不要是category_id了,叫个category之类的就可以了,否则,laravel-admin在判断是否选中的时候,由于表单字段是category_id,通过模型访问category_id属性的时候,由于关联正好也是这个名字,就直接查询关联得出目标分类的数据了,然后在select中循环时,option的值是一个标量类型的值,字段的值是一个数组,不可能相等。
要填充,可以在options中传递一个函数,通过字段的值查询,只填充它一个的值到select中,如下:(注意模型关联中不要再叫bind_store)
$form->select('bind_store', '绑定门店') ->options(function ($id) { $store = Store::find($id); if ($store) { return [$store->id => $store->name]; } });
Checkbox/MultipleSelect多对多关联编辑时无法选中
遇到这种情况(比如这个issue)很有可能是关联名使用了驼峰式(camel)命名法,调整为下划线(snake)即可。我是通过查看edit()方法追到setFieldValue()那里,打印$data发现关联取回来时字段名是使用下划线的方式命名的。查看该文件的blame发现,很有可能是会导致其他bug从而去掉了恢复原始关联名的那个转换。因此,对于关联名还是当作字段一样看待,尽量使用下划线的方式命名吧。(Update: 这个可能是bug,随着版本更新可能已经修复)
表单中一对一关联
一对一关联,可以直接嵌套在基本表单项中,见文档。假如有$form->text(‘admin.name’),提交过来时候数据是$form->admin[‘name’],注意$form->admin是数组,不是对象。另外,在saving回调中,若要修改关联的值,如$form->admin[‘password’] = bcrypt($form->admin[‘password’]),这样子是会报错“Indirect modification of overloaded property”错误,正确的写法是先用一个变量保存$form->admin,然后修改其password,再将整个值赋予$form。再者,在saved回调中,关联是不会有值的,如例子中$form->model()->admin值将是null,虽然它会正确将admin关联数据添加到数据库中,但并不将结果关联到模型中,需要手工再查找,如:$form->model()->admin()->firstOrFail()->roles()->save(Role::agent()->firstOrFail())。
表单回调顺序
关于表单回调,它的顺序是在 Laravel 自带的模型事件之后,自带的模型事件要先!!!这个要注意,当有关联要处理时,最好在它的表单回调中处理,在自带的模型事件中可能关联字段没有值。
select如何禁止修改
要为select设置disabled,这是添加 js 插件 select2 添加配置参数,使用config($key, $val)的形式进行设置,注意不支持传递数组,设置多个调用多次。如:
$form->select($foreignKey, '抽奖')->options([$luckyDraw->id => $luckyDraw->title]) ->value($luckyDraw->id)->readOnly()->config('disabled', true);
关于表单中的关联
当涉及到多图时,增删一张尤其麻烦,所以尽量使用自带封装好的功能,不要重写store/update方法,有多余操作可以在saving/saved回调中做,注意saving回调中不能添原先没有的字段,因此可以先给个默认值,然后修改之。关联只有一对一关联才可以直接在表单中使用,当是一对多时,看能否给一个额外的关联变成一对一,这样就可以直接使用。如发帖,帖子的回复理论是一对多,但发帖时只要录入1楼的数据,其实是一对一。代码参考:
//model public function comments() { return $this->morphMany(Comment::class, "target"); } public function first_comment() { return $this->hasOne(Comment::class, "target_id") ->where('target_type', __CLASS__) ->where('floor_num', 1); } //form protected function form() { $form = new Form(new Topic); $form->select('type', '类型')->options(Topic::$typeNames); $form->hidden('uid', 'uid')->value(0); $form->multipleImage('first_comment.images', '配图')->removable()->uniqueName(); $form->editor('first_comment.content', '内容文本'); $form->hidden('first_comment.uid', 'uid')->value(0); $form->hidden('first_comment.target_type', 'target_type')->value(Topic::class); $form->hidden('first_comment.floor_num', 'floor_num')->value(1); $form->saving(function ($form) { $admin = \Admin::user(); $user = $admin->frontUser; if (!$user) { $error = new MessageBag(['title' => '业务错误', 'message' => '没有绑定前端用户,不能发帖']); return back()->with(compact('error')); } $form->uid = $user->id; $firstComment = $form->first_comment; $firstComment['uid'] = $user->id; $form->first_comment = $firstComment; }); return $form; }
自定义中间表时间字段
在belongsToMany()关联中,可以通过withTimestamps($createdAt, $updatedAt)设置关联表的时间字段名称,但是如果要想进一步控制格式,就要使用using()方法指定模型了。定义关联的时候一调用withTimestamps()就得 created_at 和 updated_at 两个都有,因此中间表也是两个字段都得有。而且即使使用了using(),定义关联时的参数2中间表名也还是需要写的。
public function productlines() { return $this->belongsToMany(Productline::class, 'hawk_pdlmember', 'userId', 'productlineId') ->using(ProductLineMember::class) ->withTimestamps('addTime', 'updateTime'); }
注意:使用 using 时,关联模型要继承自 Illuminate\Database\Eloquent\Relations\Pivot ,至少在 5.8 中必须如此,否则会报错。对于创建和更新时间字段,若需要必须加withTimestamps(),但这里传递的字段名不起作用,以关联模型中定义的常量为准,否则是默认的created_at/updated_at
重写控制器 store 与 update 方法
直接在控制器定义 store() 与 update() 方法即可。这时候如果想使用 form() 中定义的表单验证规则,方法是调用 form 上的 validationMessages()方法业获得验证后的错误信息:
if ($validationMessages = $this->form()->validationMessages($request->all())) { return back()->withInput()->withErrors($validationMessages); }
注意不能直接在方法上注入表单请求,这样子能跳转但显示不了错误信息。
select2显示中文
默认后台只引入了select2.full.min.js,是无法显示中文的。需要在引入了 select2.full.min.js 之后再引入 i18n/zh-CN.js,先后顺序不能乱。因此,需要在 Admin/bootstrap.php 中添加以下代码:
Admin::js('/vendor/laravel-admin/AdminLTE/plugins/select2/select2.full.min.js'); Admin::js('/vendor/laravel-admin/AdminLTE/plugins/select2/i18n/zh-CN.js');以上就是“laravel admin怎么样,laravel admin使用心得”的详细内容,想要获取更多laravel教程欢迎关注编程学习网
扫码二维码 获取免费视频学习资料
- 本文固定链接: http://phpxs.com/post/8283/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料