当前位置: 首页 > 编程日记 > 正文

laravel和dingoapi的结合使用

dingoapi是一个laravel的开源插件,可以在github上搜索到,现在在做一个项目,项目中总是会有后端跟前端的json数据交互,而这个dingoapi为json交互提供了很大的便利。

先安装dingoapi

1、在composer.json中的require中添加"dingo/api": "1.0.*@dev",然后在项目根目录运行composer update

注意:dingoapi如果直接用composer require dingo/api:1.0.x@dev的方式安装是安装不成功的,

因为这个包作者本人还是将其设置为开发中,非稳定版,但是实际上这个包经过验证是稳定的,已经有4500+的star了。

2、在config/app.php中注册服务提供者到providers

Dingo\Api\Provider\LaravelServiceProvider::class,

3、生成dingoapi的配置文件

php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider"

会在config文件夹里生成api.php这个配置文件

4、将api.php中的prefix默认值设置为api,也可以不是api,但是必须要有个后缀,后缀不要设置为"/",如果设置为"/",laravel的视图跟api会弄混淆,比如,在laravel中自定义了一个404错误页面,如果这里设置为"/"的话,访问不存在的页面的时候,会返回格式为json的错误信息,因为dingapi就是做接口用的,不管什么都会被转为json。

那如果想把视图跟api区分开来,路由文件需要这么写,以下是例子:

<?php/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| This file is where you may define all of the routes that are handled
| by your application. Just tell Laravel the URIs it should respond
| to using a Closure or controller method. Build something great!
|
*/
Route::post('/test','AdminController@test');
Route::post('/hook','HookController@hook');
#后台管理系统登录视图
Route::get('/admin','AdminController@loginView');
Route::get('/admin/login','AdminController@loginView');
#后台管理系统登录api
Route::post('/admin/login','AdminController@login');
#退出登录api
Route::get('/logout','UserController@logout');
#管理员可见视图
Route::group(['middleware' => ['role:admin']], function () {#用户列表视图Route::get('/users','AdminController@users');#添加用户视图Route::get('/add_user','AdminController@addUserView');#机修列表视图Route::get('/mechanics_list','MechanicsController@dataList'); #配件列表视图Route::get('/parts_list','PartsController@dataList'); #添加配件视图Route::get('/add_part','PartsController@addView');Route::match(['get','post'],'/mechanics_add', 'MechanicsController@add');Route::get('/edit_user/{id}','AdminController@editUserView');Route::get('/video',function(){return view('video',['title'=>"视频播放"]);});
});$api = app('Dingo\Api\Routing\Router');
$api->version('v1', function ($api) {$api->group(['namespace' => 'App\Http\Controllers\Api'], function ($api) {
//namespace声明路由组的命名空间,因为上面设置了"prefix"=>"api",所以以下路由都要加一个api前缀,比如请求/api/users_list才能访问到用户列表接口
$api->group(['middleware'=>['role:admin']], function ($api) {#管理员可用接口#用户列表api$api->get('/users_list','AdminApiController@usersList');#添加用户api$api->post('/add_user','AdminApiController@addUser');#编辑用户api$api->post('/edit_user','AdminApiController@editUser');#删除用户api$api->post('/del_user','AdminApiController@delUser');#上传头像api$api->post('/upload_avatar','UserApiController@uploadAvatar');});}); });

需要新建一个BaseController:

<?phpnamespace App\Http\Controllers\Api;use Dingo\Api\Routing\Helpers;
use App\Http\Controllers\Controller;class BaseController extends Controller
{use Helpers;
}

然后做接口的控制器都继承这个BaseController

这些做接口的控制器放Api文件夹里

然后如果用了Requests做验证,需要将原本request里的use Illuminate\Foundation\Http\FormRequest换成use Dingo\Api\Http\FormRequest;

不然的话不能明确的显示验证错误的消息。

以下是我用到dingoapi的一些功能:

第一个功能:

当我用jquery的ajax请求服务器的数据的时候,ajax其实有两个参数,success的回调函数和error的回调函数,在laravel中,如果我直接return响应一个数组,laravel框架会自动的将这个数组变成json格式的响应,所以我在laravel代码写类似下面的代码:

if($error){return ['status'=>'error',''=>'message'=>'未通过验证'];    //返回200响应码,但是返回status为error的标识

}
return ['status'=>'success',''=>'message'=>'操作成功'];      //返回200响应码,并且返回status为success的标识

这个时候前端jquery的success的回调函数可以根据status这个标识来判断操作是否成功:

dataType:'json',          //注意这里要写json,标识服务器返回的是json,jquery会将这个json字符串转化为json对象方便下面获取数据
success:function(res){if(res.status == 'error'){alert(res.message);    //这里会alert一个“未通过验证”
   }else{alert(res.message);   //这里会alert一个“操作成功”
   }}

这样是一种前端跟后端传递数据的方法,不管操作成功或者失败都返回200的正确响应,根据status来判断操作成功或者失败。

如果我使用dingoapi的话,dingoapi可以既返回异常又返回json数据(如果不使用dingoapi,返回异常的话会返回一个异常的html页面)。

所以就可以用jquery的ajax的error回调函数来肯定操作失败的行为:

dataType:json,

error:function(error){

alert($.parseJSON(error.responseText));    //parseJSON方法将json字符串转化为json对象

}

    这里是laravel控制器中的一个方法。

        这里是ajax的error回调函数

这里是浏览器的控制台


看完效果以后便知道为什么要用parseJSON将json字符串转化为json对象了,因为responseText的属性是一个json格式的字符串,但不是对象。

转化为对象以后变会输出错误消息。

第二个功能:

使用dingoapi的tranform

app\Http\Transformers下新建一个UserTransformer.php文件(这个Transformers文件夹也是新建的):

<?phpnamespace App\Http\Transformers;use App\Models\User;
use League\Fractal\TransformerAbstract;class UserTransformer extends TransformerAbstract
{protected $availableIncludes = [];protected $defaultIncludes = [];public function transform(User $item){return ['id' => $item->id,'name' => $item->name,'sex' => $item->sex,'telphone' => $item->telphone,'car_company'=>isset($item->car->car_company) ? $item->car->car_company : '','license_plate'=>isset($item->car->license_plate) ? $item->car->license_plate : '','birthday' => $item->birthday,'created_at'=>(string)$item->created_at,'first_time'=>isset($item->car->first_time) ? $item->car->first_time : '','integral'=>$item->integral,];}}

这样定义以后,在控制中

<?php

namespace App\Http\Controllers\Api;

use App\Models\User;

use App\Http\Transformers\UserTransformer;

class UserApiController extends BaseController  //这里继承BaseController

{

public function users(){

    $user->all();    //这里也可以写成一些where条件return $this->response->collection($user, new UserTransformer);

}

}

这就会把$user里其他的字段全部过滤掉,这么写的话非常有规范性,控制器中就不用写太多的数据转化了。

当然如果非要在控制中实现过滤数组的话,可以使用以下常用函数:

array_filter($arr)

参数是一个数组,实现过滤键值为空的数组元素

array_only($arr,$key) 参数是数组,只保留参数数组中的键,其余的全部过滤掉

array_except($arr,$key)参数是数组,除了参数$key数组以外的键,其余的全部过滤掉

当然,dingoapi的功能肯定不只这两个,还有很多,我会慢慢在使用中做笔记。

转载于:https://www.cnblogs.com/zzdylan/p/6002503.html

相关文章:

uc的剪切板能关掉吗_关掉网络游戏,小孩就有美好的未来吗?

“关掉&#xff0c;关掉&#xff01;一定要关掉&#xff01;再不关掉那些网络游戏&#xff0c;小孩哪有美好的未来&#xff0c;哪有美好的前程&#xff0c;祖国哪有栋梁之才。”最近&#xff0c;一条魔性的小视频在网上刷屏。这条小视频里&#xff0c;一个小女孩用朗诵腔调大喊…

2017-2018-2 20165236 实验四《Android开发基础》实验报告

2017-2018-2 20165236 实验四《Android开发基础》实验报告 一、实验报告封面 课程&#xff1a;Java程序设计 班级&#xff1a;1652班 姓名&#xff1a;郭金涛 学号&#xff1a;20165236 指导教师&#xff1a;娄嘉鹏 实验日期&a…

区块链4.0DexChain是什么?

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 为了更好的理解Eos-DexChain,我们了解一下区块链4.0的标准。 1&#xff09;零成本发token 零成本上交易所流通 3&#xff09;去中心化交易所会借助…

Linux内核情景分析之异常访问,用户堆栈的扩展

情景假设&#xff1a;在堆内存中申请了一块内存&#xff0c;然后释放掉该内存&#xff0c;然后再去访问这块内存。也就是所说的野指针访问。当cpu产生页面错误时,会把失败的线性地址放在cr2寄存器.线性地址缺页异常的4种情况1.如果cpu访问的行现地址在内核态,那么很可能访问的是…

系统性能测试方案

转载&#xff1a;http://www.cnblogs.com/yunman/articles/5482134.html 1引言 1.1编写目的 编写本方案的目的是用于指导XXXX系统的性能测试,主要从测试环境、测试工具、测试策略、测试具体执行方法、任务与进度表等事先计划和设计。 1.2适用范围 XXXX系统性能测试组 XXXX系统开…

python跨行字符串 变量_在Python中有没有在多行字符串中使用变量的方法?

所以我把这个作为邮件发送脚本的一部分&#xff1a;try:content ("""From: Fromname To: Toname MIME-Version: 1.0Content-type: text/htmlSubject: testThis is an e-mail message to be sent in HTML formatThis is HTML message.This is headline."&q…

Python中的pickle模块

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 Pickle模块的作用 Pickle模块用于将python对象序列化为字节流&#xff0c;可存储在文件或数据库中&#xff0c;也可同通过网络进行传输。使用反序列…

pytorch python区别_pytorch源码解析:Python层 pytorchmodule源码

尝试使用了pytorch&#xff0c;相比其他深度学习框架&#xff0c;pytorch显得简洁易懂。花时间读了部分源码&#xff0c;主要结合简单例子带着问题阅读&#xff0c;不涉及源码中C拓展库的实现。一个简单例子实现单层softmax二分类&#xff0c;输入特征维度为4&#xff0c;输出为…

在vue中使用babel-polyfill

在 Vue.js项目中使用Vuex&#xff0c;Vuex 依赖 Promise&#xff0c;所以如果你的浏览器没有实现 Promise (比如 IE)&#xff0c;那么就需要使用一个 polyfill 的库 我们可以通过babel-profill转译 1、安装 npm install --save-dev babel-polyfill 2、在main.js中引入 import b…

CoinMarketCap计划于11月发布新的流动性排名系统

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 去中心化金融&#xff08;DeFi&#xff09;引领未来金融发展趋势&#xff0c;InvestDigital联合传统金融机构&#xff0c;依托现有数字货币金融业务…

cookie和session的代码实现

cookie和session的代码实现 1、设置cookie 今天笔试题考的是cookie的设置&#xff0c;我竟然选了request也可以设置cookie&#xff0c;我的天呀。 我们来看如何在response设置吧 public void service(HttpServletRequest req,HttpServletResponse resp) throws ServletExceptio…

idea 批量修改同一列_学会这个,1秒就可以批量处理文件

【问题1】根据公司名称&#xff0c;批量创建文件夹拿到老板给到的这个任务后&#xff0c;没关系我很有耐心&#xff0c;不就是右击新建文件夹重命名保存吗&#xff0c;然后加班点鼠标到天荒地老&#xff0c;终于完成了。结果老板说有些公司名有误要改正过来&#xff0c;还有几百…

动态规划和分治法的区别

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 动态规划也是一种分治思想&#xff08;比如其状态转移方程就是一种分治&#xff09;&#xff0c;但与分治算法不同的是&#xff0c;分治算法是把原问…

关于链式前向星。

一些代码 理解 #include<bits/stdc.h> using namespace std; //优先队列优化的链式前向星 const int maxn1000; const int INF0x3fffffff; struct Edge{int from, to, dist;Edge(int u, int v, int d):from(u),to(v),dist(d){} }; struct HeapNode{int u, d;HeapNode(int…

Ceph分层存储分析

最近弄Ceph集群考虑要不要加入分层存储 因此花了点时间研究了下 1&#xff0c;首先肯定要弄清Ceph分层存储的结构 &#xff0c;结构图大概就是下图所示 缓存层(A cache tier)为Ceph客户端提供更好的I/O性能&#xff0c;而数据存储在存储层(a backing storage tier)。用相对快速…

jemeter多场景混合案例_Redis 混合存储最佳实践指南

Redis 混合存储实例是阿里云自主研发的兼容Redis协议和特性的云数据库产品&#xff0c;混合存储实例突破 Redis 数据必须全部存储到内存的限制&#xff0c;使用磁盘存储全量数据&#xff0c;并将热数据缓存到内存&#xff0c;实现访问性能与存储成本的完美平衡。架构及特性命令…

交易所频频被盗,你该如何保护自己的数字资产?

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 5月8日凌晨&#xff0c;数字货币交易所币安发生被盗事件&#xff0c;黑客从币安热钱包盗走大约 7000 个比特币。币安官方公告称&#xff0c;这是一次…

gitlab搭建

一、安装源和依赖包 #增epel源,如果你是i686系统&#xff0c;请把x86_64修改下。cd /usr/local/src wget -O /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6 https://www.fedoraproject.org/static/0608B895.txt rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6 rpm -Uvh http://dl.f…

kafka源码分析(二)Metadata的数据结构与读取、更新策略

一、基本思路 异步发送的基本思路就是&#xff1a;send的时候&#xff0c;KafkaProducer把消息放到本地的消息队列RecordAccumulator&#xff0c;然后一个后台线程Sender不断循环&#xff0c;把消息发给Kafka集群。 要实现这个&#xff0c;还得有一个前提条件&#xff1a;就是K…

python实现简单的http服务器_Python实现简单HTTP服务器(二)

#coding:utf-8importsocketimportreimportsysfrom multiprocessing importProcessclassHTTPServer(object):def __init__(self, application):"""application&#xff1a;指的是框架的app"""self.server_socketsocket.socket(socket.AF_INET, so…

机器学习中的模型评价、模型选择及算法选择

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 正确使用模型评估、模型选择和算法选择技术无论是对机器学习学术研究还是工业场景应用都至关重要。本文将对这三个任务的相关技术进行回顾&#xff…

Apache 流框架 Flink,Spark Streaming,Storm对比分析(一)

https://bigdata.163.com/product/article/5 Apache 流框架 Flink&#xff0c;Spark Streaming&#xff0c;Storm对比分析&#xff08;一&#xff09;转载于:https://www.cnblogs.com/WCFGROUP/p/9075745.html

梯度下降算法_神经网络梯度下降算法

神经网络梯度下降算法2018, SEPT 13梯度下降&#xff08;Gradient Descent) 是神经网络比较重要的部分&#xff0c;因为我们通常利用梯度来利用Cost function&#xff08;成本函数&#xff09; 进行backpropagation&#xff08;反向传播&#xff09; 不断地iteration&#xff0…

微擎删除分类无法删除解决-select in效率低解决办法

今天朋友微擎后台微网站里的分类要删除&#xff0c;可是怎么删除也不能删除&#xff0c;同样的系统另一套却可以迅速删除。 后来查询到是查询语句的问题&#xff0c;朋友的平台用户量太大&#xff0c;数据太大&#xff0c;用了以下语句&#xff0c;造成效率太低&#xff1a; SE…

EOS技术及生态系统介绍

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 嘉宾介绍 哈胜&#xff0c;现任梦起文化传播有限公司技术总监&#xff0c;西北地区区块链技术发起第一人&#xff1b;一直在致力于将区块链技术推广…

svn 提交信息模板

版本&#xff1a;1.0作者&#xff1a;张三描述&#xff1a;修改了xxx转载于:https://www.cnblogs.com/ithfm/p/9075748.html

pta函数统计素数并求和_黎曼的zeta函数

9月24日阿提亚爵士&#xff08;Sir Atiyah&#xff09;直播“证明”黎曼猜想&#xff08;Riemann hypothesis&#xff09;在普通人中引发了一轮数学热潮&#xff0c;网络上一时间涌现了很多数学八卦文章。许多人在论及该命题重要性时都指出&#xff0c;ζ函数的非平凡零点与素数…

EasyRTMP手机直播推送rtmp流flash无法正常播放问题

本文转自EasyDarwin团队Kim的博客&#xff1a;http://blog.csdn.net/jinlong0603/article/details/52960750 问题简介 EasyRTMP是EasyDarwin团队开发的一套简单易用的RTMP推送SDK。本文想讲述下开发过程中遇到的一个问题。问题的现象是使用EasyRTMP推送音视频流到自己搭建的ngi…

对称加密和非对称加密

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 对称加密 对称密钥是双方使用相同的密钥 。 对称加密的要求 &#xff08;1&#xff09;需要强大的加密算法。算法至少应该满足&#xff1a;即使…

防火墙iptables介绍

防火墙&#xff1a; netfilter/iptables是集成在Linux2.4.X版本内核中的包过滤防火墙系统。该架构可以实现数据包过滤&#xff0c;网络地址转换以及数据包管理功能。linux中防火墙分为两部分&#xff1a;netfilter和iptables。netfilter位于内核空间&#xff0c;目前是Linux内核…