主要整理了我对 Laravel 的后台开源项目 Voyager 的一点经验。

一、简介

做一个 Web 系统,后台是必须的,后台大致可以分为两类:

后端导向

这里以 Laravel 为例,这类后台的特点是可以直接通过关联了数据表的 Model 来轻易的创建 CURD(增删改查),这样可以省去大量控制器 CURD 的代码。后端具有更强的主导性。

Voyager : Blade + Laravel

Laravel Nova : Laravel 官方开发,但是付费

前端导向

这种前端具有更强的主导性。

iView-Admin : Vue + iView

本文重点

在此主要介绍的是 Voyager,如上所述,Voyager 可以轻易的根据 Model 自动创建 BREAD(即 CURD),这样你可以省去写控制器及方法的代码,并且 Voyager 支持二次开发,具有足够高的定制性。

至于 Voyager 的缺点,主要还是前端是用的 Blade 写的,虽然 Blade 是 Laravel 自带提供的前端模板引擎,但是对于飞速发展的前端框架来说,Vue 是个更好的解决方案。

本文主要是介绍我自己在使用 Voyager 中遇到的一些问题和解决方案,和一些二次开发时的经验。

二、安装

1. 下载包

先把包下载过来

composer require tcg/voyager

2. 设置语言环境

设置环境为中文

config\app.php

'locale' => 'zh_CN',

3. 执行安装

# 正常安装

php artisan voyager:install

# 假数据安装

php artisan voyager:install --with-dummy

# 把一个用户设置为可登陆的管理员

php artisan voyager:admin your@email.com

# 新建一个可登陆的管理员

php artisan voyager:admin your@email.com --create

假数据安装下的账号和密码:

email: admin@admin.com

password: password

三、二次开发

Voyager 的二次开发主要有三种形式:覆写视图,覆写路由,继承控制器。

1. 覆写视图

视图层的二次开发可以参照官方文档,大致思路就是在 resource 下建立一个和 vendor 中包目录下一样的目录结构,复制你想要重写的视图内容文件,然后以此为基础进行修改即可。

包目录下的

image-20180821165431966.png

自己的开发目录

image-20180821165537551.png

方式一:修改 blade

这一层只需要按照 blade 模板引擎的语法对文件进行修改即可。

同时如果有这样一个需求:对于所有 post,我只想让 post 的创建者看到,即每个管理员只能看到自己创建的 post。但是在 Voyager 默认创建好 BREAD 之后,Voyager 中的权限管理只能做到用户要么全看到,要么全看不到。

这个时候,就可以修改 blade,在其中加一个过滤操作即可解决问题。

但是值得注意的是:这样并不优雅,因为更好的逻辑应该是在查数据库时就只取所需的数据,而不是这样全取出来再过滤。但是这种方法比较简单,改动的代码量也小。所以见仁见智啦。

方式二:Vue 单文件组件

这种方式是通过 Vue 写单文件组件,然后直接像 HTML 标签一样插入 Blade 中,然后其中的内容就随便你 Vue 怎么写了。

/resources/assets/js/app.js

// 单文件组件

Vue.component('worlduc-video', require('./components/Index-Video.vue'));

/resources/views/video.blade.php

额外

若是想要添加子页面,并且是带那种左侧 admin 导航的子页,在新建的 blade 文件中添加如下即可:

@extends('voyager::master')

若是添加的子页面想要放在登陆保护后,则添加其路由至 admin.user 中间件后

// 自定义的页要加到认证后的,就加到这个里面

Route::group(['middleware' => 'admin.user'], function () {

// 课程信息页

Route::view('/admin/teams/member/{teamId}', 'addMember');

// 首页

Route::view('/', 'index');

});

若想要一个用户可以登录的 Voyager 并看到其中的内容,必须给予 admin 的 browse 权限,否则无法登陆成功。

2. 覆写路由

这也是官方文档中明确支持的一种方式,能够将本来 Voyager 定义的一些路由,比如登陆,用自己的控制器和对应方法去替代。

Route::get('/', function () {

return view('welcome');

});

Route::group(['prefix' => 'admin'], function () {

// Voyager 原本的路由

Voyager::routes();

// 覆盖了原先的登录,添加了自定义的本身认证

Route::post('login', 'LoginController@postLogin')->name('voyager.login');

// 覆盖原先的注销

Route::post('logout', 'LoginController@postLogout')->name('voyager.logout');

});

3. 覆写控制器

控制器的重写,官方文档也写的足够详细了,首先在 config/voyager.php 中如下定义:

'controllers' => [

'namespace' => 'App\\Http\\Controllers\\Voyager',

],

然后运行 php artisan voyager:controllers,这样控制器就会被创建到你的控制器目录,而这些控制器是继承自包中原先的控制器,如果你不覆写,还是能正常工作,如果你想进行自己的控制,那么就可以直接重写对应的方法。

4. 自定义控制器

除了上面覆写控制器的方法,你还可以看到在创建 BREAD 时,可以直接选择控制器,而这个控制器完全可以由你自己写,但是我并没有实践,BREAD 对应的增删改查操作应该对应的是控制器什么方法名,有兴趣的同学可以去看一下源码。

四、其他

除了上面的二次开发外,还有其他一些使用的的经验和实践,整理如下:

1. 部分字段自定义 create

现在有一个需求,我需要在一个表中插入一条数据,这条数据由三个字段组成,分别为 A、B、C。其中 B、C 我让用户自己输入,但是 A 我想要系统读取用户的信息来自动填入(比如读取用户的 ID,用来标识这条数据的创建者)。想想该怎么做呢?

一般来说,我们可以先考虑一下数据存储过程中需要用到的两个东西:Controller 和 Model,其中 Model 可以试着一个 attributes 属性来设置字段的默认值,但是这个属性要求都为静态值,是无法使用变量的。Controller 的话可以重写 Controller,修该逻辑即可,但是重写 Controller 其实代码量还是比较大的。有没有更加简单的办法呢?当然是有的!

方法一

在 bread 中设置字段为 hidden 并在可选细项中设置一个默认值,然后在模型中配置一个修改器,设置成你想要的值即可。

image-20180822145611512.png

public function setCreaterIdAttribute($value)

{

$this->attributes['creater_id'] = Cookie::get('user_id');

}

为什么要配置这个默认值呢?因为模型中的修改器只有在这个字段被设置了值才能成功触发。

方法二

不在可选细项配置默认值,只添加修改器即可:

// 让你想要设置的值在其他修改器中顺便被添加即可

public function setTeamNameAttribute($value)

{

$this->attributes['team_name'] = $value;

$this->attributes['creater_id'] = Cookie::get('user_id');

}

方法三

配置一个关系,按照图中勾选即可(其实 creater_id 那只需勾选『添加』便可达到效果,其他不影响)

image-20181023151613114.png

public function setCreaterIdAttribute($value)

{

$this->attributes['creater_id'] = Cookie::get('id');

}

2. datetimepicker 无法显示的 bug

覆写 master.blade.php,添加如下:

// 这个 css 添加到上方合适位置

// css 自行下载 https://github.com/Eonasdan/bootstrap-datetimepicker/releases

// 这一行是本来有的

moment.locale("zh-cn");

// 上面是设置语言,不过语言设置为中文会格式化报错

出现 bug 的原因是其引用的一个 js 插件有 bug,指定一个没有 bug 的版本即可。

3. 表单字段可为空如何控制

在进行新建或编辑时,你会发现有些字段是必填的,而有些字段是非必填,但是并没有看到有一个控制的选项。其实这个是根据数据表的字段是否可为 NULL 控制的。但其实这个设定存在不少 bug:

如果输入空白符,前端会认为你填写了数据而放行,但是后端会报错

对于下拉选择,如果你选择的是 None ,并提交而这个字段又设置未非空的话也会报错。

所以我建议还是覆写 edit-add 这个 blade,添加 js 进行控制。

4. Voyager 配置完毕后如何导出设置

Voyager 的后台一些设置是保存在数据库中的,建议使用 orangehill/iseed 这个插件来将数据库的数据转换为 seeder,然后添加 Git 进行管理即可。

五、总结

Voyager 是一个非常不错的后台模板,功能齐全,颜值高,能够快速的搭建一个好用的后台,但是其中存在的小 bug 还是比较多,如果是作为开发者内部团队简单使用远远足够,但是若作为一个开放给外部用户使用,还需针对各个小 bug 进行修复,因为只有针对角色的权限分配,不能根据资源的创建者分配更细的权限,所以还需额外部署对应的逻辑。

本作品采用《CC 协议》,转载必须注明作者和本文链接

php lararel,Voyager 的使用及二次开发相关推荐

  1. 【ReactiveX】基于Golang pmlpml/RxGo程序包的二次开发

    基于Golang pmlpml/RxGo程序包的二次开发[阅读时间:约20分钟] 一.ReactiveX & RxGo介绍 1.ReactiveX 2.RxGo 二.系统环境&项目介绍 ...

  2. 20150411--Dede二次开发-01

    20150411--Dede二次开发-01 目录 一.目前市场流行的电子商城系统 1 二.ecshop的介绍 1 三.安装 2 四.echsop 的目录结构 5 五.分析ecshop里面程序的架构 5 ...

  3. android系统二次开发,Andorid系统二次开发界面

    Andorid系统二次开发界面 给大家介绍完外观,下面我们一起再来看下魅族MX的系统界面.本次魅族MX仍然采用的是Andorid操作系统,并且加入了二次开发界面.UI界面整体上保持了和M9的特色,不过 ...

  4. wordpress php教程 pdf,wordpress二次开发全能教程.pdf

    wordpress 二次开发全能教程 1. 根据分类来制定导航条 A. 修改页面 header.php! <?php wp_list_categories('title_li='); ?> ...

  5. Saiku二次开发获取源代码在本地编译(五)

    关于Saiku的二次开发,在本地编译然后启动自己编译好的Saiku服务 Saiku是开源的,从github上能下载源代码,本例中的saiku源码也是从github上找的,然后自己改了一些pom.xml ...

  6. catia三维轴承_浅谈基于CATIA二次开发的单排四点接触球轴承三维设计论文

    浅谈基于CATIA二次开发的单排四点接触球轴承三维设计论文 一.概述 单排四点接触球转盘轴承是一种能够同时承受较大轴向负荷.径向负荷和倾覆力矩等综合载荷,集支承.旋转.传动.固定等多种功能于一身的特殊 ...

  7. 【工业串口和网络软件通讯平台(SuperIO)教程】七.二次开发服务驱动

    SuperIO相关资料下载:http://pan.baidu.com/s/1pJ7lZWf 1.1    服务接口的作用 围绕着设备驱动模块采集的数据,根据需求提供多种应用服务,例如:数据上传服务.数 ...

  8. 二次开发photoshop_Photoshop 101:Web开发人员简介

    二次开发photoshop 介绍 (Introduction) Often, when working as web developer, we need to integrate templates ...

  9. 基于EasyNVR摄像机网页无插件直播服务二次开发实现H5播放页面的简单集成方案...

    我们通常在构架一套视频SaaS应用的过程中,将平台设计为3层:视频硬件层(视频源).视频能力平台(vPaaS).视频应用平台(vSaaS),视频硬件包括各种IPC.NVR.编码器等视频生成设备,vPa ...

最新文章

  1. Python基础入门必学内容:判断语句与循环语句
  2. android多音字排序,Android拼音排序
  3. WebIDE discovery when destination is selected from dropdown list
  4. 图像sobel梯度详细计算过程_数字图像处理(第十章)
  5. linux usb声卡 submit urb,linux usb urb详解
  6. C++ STL 线性容器的用法
  7. php 魔术方法使用说明详细
  8. BERT4Rec:当NLP王者BERT进军推荐领域
  9. python start
  10. android 合并数组
  11. 转:七大项目管理技术优势
  12. VM虚拟机下如何和Windows主机共享文件夹
  13. Java 核心技术卷 II(第 8 版) – 读书笔记 – 第 1 章(下)
  14. 姿态估计目标检测论文整理(1)
  15. 如何看错误日志,尤其是Caused by类的日志?
  16. python字符串format方法参数解释,一文秒懂!Python字符串格式化之format方法详解
  17. VC++的窗口句柄和窗口ID
  18. 旋转编码器c语言程序,【E课堂】旋转编码器的编程思路
  19. 2021-04-23 每日总结
  20. 华硕编程竞赛11月JAVA专场 G题飞行棋 题解

热门文章

  1. 不是青蛙就是王子,不是王子就是青蛙
  2. 秦汉三国政治史:东汉宰相制度
  3. 第一台生物计算机,世界上第一台DNA计算机问世
  4. HP 孙振耀 九大感言(转)
  5. CrashPlan 介绍
  6. 再一次被入侵之潜伏的挖矿病毒
  7. 电气EPlan软件第一章到第五章的学习
  8. GEA 3.4 流水线、缓存及优化
  9. Caffe Model Zoo
  10. 百万CT网上卖,东软医疗这样推动行业阳光采购