laravel核心组件安装
1.httpstatus安装
Httpstatus包提供了一种简单而有效的方法来检索任何给定HTTP状态代码的标准状态文本。
可以获取任何有效状态文本的HTTP状态代码。
还提供所有状态代码作为常量,以便更好地阅读代码。
安装
composer require lukasoppermann/http-status
用法
$Httpstatus = new Lukasoppermann\Httpstatus\Httpstatus(); |
||||
// |
get status text from codeecho |
$Httpstatus->getReasonPhrase(301); // Moved Permanently |
||
// |
get the status code by textecho |
$Httpstatus->getStatusCode('Method Not Allowed'); // |
405 |
|
// |
check if status code existsecho |
$Httpstatus->hasStatusCode(404); // trueecho $Httpstatus->hasStatusCode(601); // false |
||
// |
check if reason phrase existsecho |
$Httpstatus->hasReasonPhrase('Method Not Allowed'); |
// trueecho $Httpstatus- |
|
>hasReasonPhrase('Does not exist'); |
// false |
|||
// |
determine the type (or "class") of the codeecho $Httpstatus->getResponseClass(503); // |
Httpstatus::CLASS_SERVER_ERROR |
为方便起见,此软件包提供了一个包含所有状态代码的界面。在开发处理HTTP状态代码的类时,只需实现接口并开始使用常量而不是幻数来获得更易读和易懂的代码。
use Lukasoppermann\Httpstatus\Httpstatuscodes;
class Response implements Httpstatuscodes{
public function someMethod(){ // ... some logic return respond(self::HTTP_CREATED, $json); }
}
也可以直接使用接口中的常量。
use Lukasoppermann\Httpstatus\Httpstatuscodes as Status;
class UserTest{
public function test_create_new_user(){ $this->assertEquals(Status::HTTP_CREATED, $response->status()); } }
配置
add custom texts$Httpstatus = new Lukasoppermann\Httpstatus\Httpstatus([ 200 => 'Kein Inhalt', 404 => 'Nicht gefunden',]);
状态代码的第一个数字定义了响应类。最后两位数字没有任何分类角色。第一个数字有五个值:
数字 |
类别 |
含义 |
1XX |
信息化 |
收到请求,继续进行 |
2XX |
成功 |
该请求已成功接收,理解和接受 |
3XX |
重定向 |
需要采取进一步行动才能完成请求 |
4XX |
客户端错误 |
请求包含错误的语法或无法实现 |
5XX |
服务器错误 |
服务器无法满足明显有效的请求 |
可用的HTTP状态代码
码 |
信息 |
RFC |
100 |
继续 |
[RFC7231,第6.2.1节] |
101 |
切换协议 |
[RFC7231,第6.2.2节] |
102 |
处理 |
[RFC2518] |
103-199 |
未分配 |
|
200 |
好 |
[RFC7231,第6.3.1节] |
201 |
创建 |
[RFC7231,第6.3.2节] |
202 |
公认 |
[RFC7231,第6.3.3节] |
203 |
非权威信息 |
[RFC7231,第6.3.4节] |
204 |
无内容 |
[RFC7231,第6.3.5节] |
205 |
重置内容 |
[RFC7231,第6.3.6节] |
206 |
部分内容 |
[RFC7233,第4.1节] |
207 |
多态 |
[RFC4918] |
208 |
已经报道过了 |
[RFC5842] |
209-225 |
未分配 |
|
226 |
IM已使用 |
[RFC3229] |
227-299 |
未分配 |
|
300 |
多种选择 |
[RFC7231,第6.4.1节] |
301 |
永久移动 |
[RFC7231,第6.4.2节] |
302 |
发现 |
[RFC7231,第6.4.3节] |
303 |
见其他 |
[RFC7231,第6.4.4节] |
304 |
没有修改 |
[RFC7232,第4.1节] |
305 |
使用代理服务器 |
[RFC7231,第6.4.5节] |
306 |
(没用过) |
[RFC7231,第6.4.6节] |
307 |
临时重定向 |
[RFC7231,第6.4.7节] |
308 |
永久重定向 |
[RFC7538] |
309-399 |
未分配 |
|
400 |
错误的请求 |
[RFC7231,第6.5.1节] |
401 |
擅自 |
[RFC7235,第3.1节] |
402 |
需要付款 |
[RFC7231,第6.5.2节] |
403 |
被禁止 |
[RFC7231,第6.5.3节] |
404 |
未找到 |
[RFC7231,第6.5.4节] |
405 |
方法不允许 |
[RFC7231,第6.5.5节] |
406 |
不能接受的 |
[RFC7231,第6.5.6节] |
407 |
需要代理验证 |
[RFC7235,第3.2节] |
408 |
请求超时 |
[RFC7231,第6.5.7节] |
409 |
冲突 |
[RFC7231,第6.5.8节] |
410 |
飘 |
[RFC7231,第6.5.9节] |
411 |
长度要求 |
[RFC7231,第6.5.10节] |
412 |
前提条件失败 |
[RFC7232,第4.2节] |
413 |
有效载荷过大 |
[RFC7231,第6.5.11节] |
414 |
URI太长了 |
[RFC7231,第6.5.12节] |
415 |
不支持的媒体类型 |
[RFC7231,第6.5.13节] |
416 |
范围不满意 |
[RFC7233,第4.4节] |
417 |
期望失败 |
[RFC7231,第6.5.14节] |
418 |
我是一个茶壶 |
[RFC2324,第2.3.2节] |
419-420 |
未分配 |
|
421 |
错误的请求 |
[RFC7540,第9.1.2节] |
422 |
不可处理的实体 |
[RFC4918] |
423 |
锁定 |
[RFC4918] |
424 |
失败的依赖 |
[RFC4918] |
425 |
保留给WebDAV高级集合过期的提案 |
|
426 |
需要升级 |
[RFC7231,第6.5.15节] |
427 |
未分配 |
|
428 |
前提要求 |
[RFC6585] |
429 |
请求太多 |
[RFC6585] |
430 |
未分配 |
|
431 |
请求标头字段太大 |
[RFC6585] |
432-499 |
未分配 |
|
500 |
内部服务器错误 |
[RFC7231,第6.6.1节] |
501 |
未实现 |
[RFC7231,第6.6.2节] |
502 |
错误的网关 |
[RFC7231,第6.6.3节] |
503 |
暂停服务 |
[RFC7231,第6.6.4节] |
504 |
网关超时 |
[RFC7231,第6.6.5节] |
505 |
不支持HTTP版本 |
[RFC7231,第6.6.6节] |
506 |
变种也谈判 |
[RFC2295] |
507 |
存储空间不足 |
[RFC4918] |
508 |
检测到环路 |
[RFC5842] |
509 |
未分配 |
|
510 |
没有扩展 |
[RFC2774] |
511 |
需要网络验证 |
[RFC6585] |
512-599 |
未分配 |
|
2.Fractal安装
Fractal为复杂的数据输出提供了一个表示和转换层,就像在RESTful API中找到的一样,并且可以很好地与JSON一起使用。可以将其视为 JSON / YAML / etc的视图层。
在构建API时,人们通常只是从数据库中获取内容并将其传递给json_encode()。对于“普通”API而言,这可能是可以接受的,但如果它们被公众使用或被移动应用程序使用,那么这将很快导致输出不一致。
作用
在源数据和输出之间创建保护屏蔽,因此架构更改不会影响用户
系统的数据类型转换,以避免foreach()贯穿(bool)始终
包含复杂数据结构的(也就是嵌入,嵌套或侧面加载)关系
使用HAL和JSON-API等标准,但也允许自定义序列化
支持数据结果的分页,适用于小型和大型数据集
通常可以简化在非平凡API中输出数据的微妙复杂性
安装
composer require league/fractal
3.intervention/image安装
Intervention Image是一个开源的PHP图像处理和操作库。它提供了一种更简单,更有表现力的方式来创建,编辑和组合图像,并支持目前最常见的两个图像处理库GD Library和Imagick。编写该类是为了使PHP图像操作更容易,更具表现力。无论您是要创建图像缩略图,水印还是格式化大型图像文件,Intervention Image都可以帮助您以尽可能少的代码行轻松管理每项任务。
安装
composer require intervention/image
官方文档
http://image.intervention.io/getting_started
4.Someline Rest API Client安装
Someline Starter API Client是一款优雅且智能的Rest API客户端,具有OAuth2身份验证支持。为Laravel和Someline Starter构建。
它可用于访问使用Someline Starter框架创建的API 。
安装
composer require someline/rest-api-client
添加服务提供商 config/app.php
'providers' => [ ... Someline\Rest\RestClientServiceProvider::class, ... ],
发布配置文件
php artisan vendor:publish
发布后,Rest Client的配置文件是config/rest-client.php,您需要将其配置为使用Rest Client。
用法
$restClient = new \Someline\Rest\RestClient('someline-starter');
$restClient->setOAuthUserCredentials([ 'username' => '[email protected]', 'password' => 'Abc12345', ]); $restClient->withOAuthTokenTypeUser();
$response = $restClient->get("users")->getResponse();
if (!$restClient->isResponseStatusCode(200)) {
$restClient->printResponseOriginContent();
$responseMessage = $restClient->getResponseMessage();
print_r($responseMessage); }
else {
$responseData = $restClient->getResponseData();
print_r($responseData);
}
5.redis的安装和配置
简介
Redis是一个开源的、基于内存的数据结构存储器,可以被用作数据库、缓存和消息代理。相较Memcached而言,支持更加丰富的数据结构,包括字符串、哈希、列表、集合、有序集合等,此外还支持将数据持久化到数据库。
安装启动Redis及依赖包
Laravel项目根目录下运行如下命令使用Composer安装predis依赖包:
composer require predis/predis 1.0.*
配置
前面我们已经提到Redis可以用作主数据库,所以Laravel中Redis的配置信息位于config/database.php中:
'redis' => [
'cluster' => false,
'default' => [
'host' => '127.0.0.1',
'port' => 6379,
'database' => 0,
],
],
其中cluster选项表示是否在多个Redis节点间进行分片,这里我们本地测试只有一个节点故将其设置为false。
default选项表示默认Redis主机连接,这里Redis和Web服务器共用一台主机,所以host为127.0.0.1,Redis默认端口是6379。
此外,default选项还支持更多连接参数(如果需要的话):
参数 |
意义 |
默认值 |
host |
服务器IP地址/主机名称 |
127.0.0.1 |
port |
Redis服务器监听的端口号 |
6379 |
password |
如果服务器需要认证密码 |
不使用密码 |
database |
连接时选择的数据库索引 |
没有设置索引 |
timeout |
连接到Redis服务器超时时间 |
5秒 |
read_write_timeout |
通过网络连接进行读写操作的超时时间 |
系统默认(不限制超时时间的话设置为-1) |
另外Redis如果是作为缓存工具,还需要在config/cache.php配置redis选项:
'redis' => [
'driver' => 'redis',
'connection' => 'default',
],
基本使用
由于Laravel默认已经将Redis门面添加到config/app.php的aliases数组中,所以在代码中可以直接使用该门面进行Redis操作。我们可以在Redis门面上以静态方法的方式调用Redis客户端提供的任何命令,然后Laravel使用魔术方法将命令传递给Redis服务器并返回获取的结果。
下面我们来看最简单的读取操作:
$key = 'user:name:6';
$user = User::find(6);
if($user){
//将用户名存储到Redis中
Redis::set($key,$user->name);
}
//判断指定键是否存在
if(Redis::exists($key)){
//根据键名获取键值
dd(Redis::get($key));
}
以上是简单的字符串存取,下面我们看一个更复杂的例子,将获取到的数据存放到集合中:
$key = 'posts:title';
$posts = Post::all();
foreach ($posts as $post) {
//将文章标题存放到集合中
Redis::sadd($key,$post->title);
}
//获取集合元素总数(如果指定键不存在返回0)
$nums = Redis::scard($key);
if($nums>0){
//从指定集合中随机获取三个标题
$post_titles = Redis::srandmember($key,3);
dd($post_titles);
}
6.GuzzleHTTP的安装和配置
简介
Guzzle是一个PHP HTTP客户端,可以轻松发送HTTP请求,并且可以轻松集成Web服务。
用于构建查询字符串,POST请求,流式传输大型上传,流式传输大型下载,使用HTTP cookie,上传JSON数据等的简单界面...
可以使用相同的接口发送同步和异步请求。
为请求,响应和流使用PSR-7接口。这使您可以与Guzzle一起使用其他PSR-7兼容库。
抽象出底层的HTTP传输,允许您编写环境和传输不可知的代码; 即不依赖于cURL,PHP流,套接字或非阻塞事件循环。
中间件系统允许您增强和编写客户端行为。
安装
使用composer安装
composer require guzzlehttp/guzzle
或者编辑项目的composer.json文件,添加Guzzle作为依赖
{
"require":
{
"guzzlehttp/guzzle":"~6.0"
}
}
执行composer update
使用
发送请求
use GuzzleHttp\Client;
$client = new Client([
// Base URI is used with relative requests
'base_uri' => 'http://httpbin.org',
// You can set any number of default request options.
'timeout' => 2.0,
]);
$response = $client->get('http://httpbin.org/get');
$response = $client->delete('http://httpbin.org/delete');
$response = $client->head('http://httpbin.org/get');
$response = $client->options('http://httpbin.org/get');
$response = $client->patch('http://httpbin.org/patch');
$response = $client->post('http://httpbin.org/post');
$response = $client->put('http://httpbin.org/put');
设置查询字符串
$response = $client->request('GET', 'http://httpbin.org?foo=bar');
或使用query 请求参数来声明查询字符串参数:
$client->request('GET', 'http://httpbin.org', [
'query' => ['foo' => 'bar']
]);
设置POST表单
传入form_params数组参数
$response = $client->request('POST', 'http://httpbin.org/post', [
'form_params' => [
'field_name' => 'abc',
'other_field' => '123',
'nested_field' => [
'nested' => 'hello'
]
]
]);
使用响应
# 状态码
$code = $response->getStatusCode(); // 200
$reason = $response->getReasonPhrase(); // OK
# header
// Check if a header exists.
if ($response->hasHeader('Content-Length')) {
echo "It exists";
}
// Get a header from the response.
echo $response->getHeader('Content-Length');
// Get all of the response headers.
foreach ($response->getHeaders() as $name => $values) {
echo $name . ': ' . implode(', ', $values) . "\r\n";
}
# 响应体
$body = $response->getBody();
// Implicitly cast the body to a string and echo it
echo $body;
// Explicitly cast the body to a string
$stringBody = (string) $body;
// Read 10 bytes from the body
$tenBytes = $body->read(10);
// Read the remaining contents of the body as a string
$remainingBytes = $body->getContents();
7.Restful API的安装
安装
在laravel的根目录的composer.json 文件中引入
"dingo/api":"2.0.0-alpha1"
再执行
composer update
以在项目中包含最新版本的软件包。
此时包装仍处于发育阶段,因此没有稳定的释放。您可能需要将您设置minimum-stability为dev。
安装软件包后,下一步取决于您使用的是哪个框架。
配置
如果您想在配置文件中进行配置更改,可以使用以下Artisan命令发布它:
php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider"
流明
打开bootstrap/app.php并注册所需的服务提供商。
$app->register(Dingo\Api\Provider\LumenServiceProvider::class);
外立面
包裹随附两个外墙。您可以根据需要添加其中任何一个。
Dingo\Api\Facade\API
这是调度程序的外观,但是,它还为整个程序包中的其他方法提供了辅助方法。
Dingo\Api\Facade\Route
这是API路由器的外观,可用于获取当前路由,请求,检查当前路由名称等。
8.L5 的安装
安装
执行以下命令以获取最新版本的软件包:
composer require prettus/l5-repository
Laravel> = laravel5.5
ServiceProvider将自动附加
其他
在您config/app.php添加
Prettus\Repository\Providers\RepositoryServiceProvider::class到providers数组的末尾:
' providers ' => [ ... Prettus \ Repository \ Providers \ RepositoryServiceProvider :: class,],
如果流明
$ app - > register(Prettus \ Repository \ Providers \ LumenRepositoryServiceProvider :: class);
发布
php artisan供应商:发布--provider “ Prettus \ Repository \ Providers \ RepositoryServiceProvider ”
9.Laravel Validation的安装
安装
将“prettus / laravel-repository”:“1.1。*”添加到composer.json
"prettus/laravel-validation": "1.1.*"
再执行
composer update
以在项目中包含最新版本的软件包。
配置
创建验证器
Validator包含添加,编辑的规则。
Prettus \ Validator \ Contracts \ ValidatorInterface :: RULE_CREATE
Prettus \ Validator \ Contracts \ ValidatorInterface :: RULE_UPDATE
在下面的示例中,我们为创建和编辑定义了一些规则
use \ Prettus \ Validator \ LaravelValidator ;
class PostValidator extends LaravelValidator {
protected $ rules = [ ' title ' => ' required ',' text ' => ' min:3 ',' author ' => ' required ' ];
}
要定义特定规则,请按以下步骤操作:
use \ Prettus \ Validator \ LaravelValidator ;
class PostValidator extend LaravelValidator {
protected $ rules = [ ValidatorInterface :: RULE_CREATE => [ ' title ' => ' required ',' text ' => ' min:3 ',' author ' => ' required ' ],
ValidatorInterface :: RULE_UPDATE => [ ' title ' => ' required ' ] ];
自定义错误消息
您可以使用自定义错误消息进行验证,而不是默认值
protected $ messages = [ ' required ' => ':属性字段是必需的。',];
或者,您可能希望仅为特定字段指定自定义错误消息。
protected $ messages = [ ' email.required ' => '我们需要知道您的电子邮件地址!',];
自定义属性
您也可以使用自定义名称属性
protected $ attributes = [ ' email ' => '电子邮件',' obs ' => '观察',];
使用验证器
use \ Prettus \ Validator \ Exceptions \ ValidatorException ;
class PostsController wxtends BaseController {
/ ** * @var PostRepository * / protected $ repository ; / ** * @var PostValidator * / protected $ validator ;
public function __construct(PostRepository $ repository,PostValidator $ validator){ $ this - > repository = $ repository ; $ this - > validator = $ validator ; }
public function store() {
try {
$ this - > validator - > with(Input :: all())- > passesOrFail(); // OR $ this-> validator-> with(Input :: all()) - >
passesOrFail(ValidatorInterface :: RULE_CREATE);
$ post = $ this - > repository - > create(Input :: all());
return Response :: json([ ' message ' => ' Post created ',' data ' => $ post - > toArray() ]);
} catch(ValidatorException $ e){
return Response :: json([ ' error ' => true,' message ' => $ e - > getMessage() ]);
} }
public function update($id) {
try { $ this - > validator - > with(Input :: all())- > passesOrFail(ValidatorInterface :: RULE_UPDATE); $ post = $ this - > repository -
> update(Input :: all(),$ id);
return Response :: json([ ' message ' => ' Post created ',' data ' => $ post - > toArray() ]);
} catch(ValidatorException $ e){
return Response :: json([ ' error ' => true,' message ' => $ e - > getMessage() ]);
}
} }
10.Intervention Image Cache的安装
安装
使用composer 安装
composer require intervention/imagecache
现在您可以要求vendor/autoload.phpPSR-4文件自动加载库了。
整合
Image Cache类支持Laravel集成。在Laravel中使用库的最佳做法是添加干预图像类的ServiceProvider和Facade。
打开Laravel配置文件config/app.php并添加以下行。
在$providers阵列中添加此包的服务提供者。
'providers' => array(
[...]
'Intervention\Image\ImageServiceProvider'
),
将此包的外观添加到$aliases数组中。
'aliases' => array(
[...]
'Image' => 'Intervention\Image\Facades\Image'
),
用法
图像缓存最好由Image::cacheIntervention Image类的静态方法调用。
要创建缓存图像,只需使用静态方法Image::cache并通过闭包传递图像操作。该方法将自动检测是否存在特定操作的缓存文件。
//在图像上运行操作或从缓存中读取文件//用于特定操作$ img = Image :: cache( function( $ image){ return $ image - > make( ' public / foo.jpg ') - >调整大小( 300, 200) - >灰度();});
确定缓存文件的生命周期(以分钟为单位)作为可选的第二个参数。将布尔值true作为可选的第三个参数传递,以返回干预图像对象而不是图像流。
//确定寿命,并返回作为对象,而不是字符串$ IMG = 图片::缓存(函数( $图像){返回$图像- >使( '公共/ foo.jpg ') - >调整
300, 200) - > greyscale();}, 10, true);
11.Someline Image Service的安装
安装
composer require someline/someline-image
添加服务提供商 config/app.php
' providers ' => [ ... Someline \ Image \ SomelineImageServiceProvider :: class, ... ],
发布
php artisan vendor:publish
发布后,Rest Client的配置文件是config/someline-image.php,您需要将其配置为使用Rest Client。
用法
路由
Route :: get(' / image / {name} ',' ImageController @ showOriginalImage ');
Route :: post(' / image ',' ImageController @ postImage ');
许多影像
在模型上使用:
使用 SomelineHasImageablesTrait ;
用法:
/ * * @var SomelineImage $ somelineImage * / $ somelineImage = SomelineImage :: find( 1);
/ * * @var User $ user * / $ user = User :: find( 1);
//巧妙保存图像关系与序列支持(推荐)$用户- > syncImages([ 1, 2 ],[ '类型' => '盖', '数据' => json_encode( '一个')]);
//通过save $ user - > images() - > save( $ somelineImage,[ ' type ' => ' cover ', ' data ' => json_encode( ' a ')])保存图像关系 ;
//通过附加$ user - > images() - > attach( 1,[ ' type ' => ' cover ', ' data ' => json_encode( ' a ')])保存图像关系 ;
//通过sync $ user - > images() - > sync([ 1 ])更新图像关系 ;
//设置为主图像$ user - > setAsMainImage( $ somelineImage);
//设置为主要图像$ user - > setAsTypeMainImage( ' cover ', $ somelineImage);
//获取所有图像print_r( $ user - > getImages() - > toArray());
//获取第一个主图像print_r( $ user - > getMainImage() - > toArray());
//获取所有主要图像print_r( $ user - > getMainImages() - > toArray());
//获取所有类型的图像print_r( $ user - > getTypeImages( ' cover ') - > toArray());
//获取所有类型的图像并且是主要图像print_r( $ user - > getTypeMainImages( ' cover ') - > toArray());
示例控制器文件
app/Http/Controllers/ImageController.php
<?php namespace App \ Http \ Controllers ;
使用 例外 ; 使用 Illuminate \ Http \ Request ; 使用 Someline \ Image \ Controllers \ SomelineImageController ; 使用 Someline \ Models \ Image \ SomelineImage ; 使用 Someline \ Image \ SomelineImageService ; class ImageController 扩展 Controller {
public function postImage(Request $ request) { $ somelineImageService = new SomelineImageService(); $ file = $ request - > file(' image ');
$ somelineImage = null ; 试试 { / * * @var SomelineImage $ somelineImage * / $ somelineImage = $ somelineImageService - > handleUploadedFile($ file); } catch(Exception $ e){ return '无法保存:'。$ e - > getMessage(); } if(!$ somelineImage){ return '无法保存上传的图片。' ; }
$ somelineImageId = $ somelineImage - > getSomelineImageId(); 返回'已保存:'。$ somelineImage - > getImageUrl(); }
public function showOriginalImage($ image_name) { return SomelineImageController :: showImage(' original ',$ image_name); }
}
12.Laravel Passport的安装
安装
要开始,请通过Composer包管理器安装Passport:
composer require laravel/passport
Passport服务提供程序使用框架注册其自己的数据库迁移目录,因此您应在注册提供程序后迁移数据库。Passport迁移将创建应用程序存储客户端和访问令牌所需的表:
php artisan migrate
如果你不打算使用护照的默认迁移,你应该调用的方法的方法。
Passport::ignoreMigrationsregisterAppServiceProviderphp artisan vendor:publish --tag=passport
接下来,您应该运行该命令。此命令将创建生成安全访问令牌所需的加***。此外,该命令将创建“个人访问”和“密码授予”客户端,这些客户端将用于生成访问令牌:passport:install
php artisan passport:install
运行此命令后,将特征添加到模型中。此特征将为您的模型提供一些辅助方法,允许您检查经过身份验证的用户的令牌和范围:Laravel\Passport\HasApiTokensApp\User
<?php
namespace App;
use Laravel\Passport\HasApiTokens;use Illuminate\Notifications\Notifiable;use Illuminate\Foundation\Auth\User as Authenticatab
class User extends Authenticatable{
use HasApiTokens, Notifiable;}
接下来,您应该在您的方法中调用该方法。此方法将注册发出访问令牌和撤销访问令牌,客户端和个人访问令牌所需的路由:Passport::routesbootAuthServiceProvider
<?php
namespace App\Providers;
use Laravel\Passport\Passport;use Illuminate\Support\Facades\Gate;use Illuminate\Foundation\Support\Providers\AuthServiceProvi
class AuthServiceProvider extends ServiceProvider{
/**
-
The policy mappings for the application.
-
@var array
*/
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
];
/**
-
Register any authentication / authorization services.
-
@return void
*/
public function boot()
{
$this->registerPolicies();
Passport::routes();
}}
最后,在配置文件中,您应该将身份验证防护的选项设置为。这将指示您的应用程序在验证传入的API请求时使用 Passport :config/auth.phpdriverapipassportTokenGuard
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
],],
组件的使用
1.httpstatus插件的使用
常用HttpStatus状态:
HttpStatus.OK = 200;
HttpStatus.BADREQUEST = 400;
HttpStatus.FORBIDDEN = 403;
HttpStatus.NOTFOUND = 404;
HttpStatus.TIMEOUT = 408;
HttpStatus.SERVERERROR = 500;
用法
$Httpstatus = new Lukasoppermann\Httpstatus\Httpstatus();
// get status text from codeecho $Httpstatus->getReasonPhrase(301); // Moved Permanently
// get the status code by textecho $Httpstatus->getStatusCode('Method Not Allowed'); // 405
// check if status code existsecho $Httpstatus->hasStatusCode(404); // trueecho $Httpstatus->hasStatusCode(601); // false
// check if reason phrase existsecho $Httpstatus->hasReasonPhrase('Method Not Allowed'); // trueecho $Httpstatus->hasReasonPhrase('Does not exist'); // false
// determine the type (or "class") of the codeecho $Httpstatus->getResponseClass(503); // Httpstatus::CLASS_SERVER_ERROR
$Httpstatus = new Lukasoppermann\Httpstatus\Httpstatus(); echo $Httpstatus->getReasonPhrase(301); echo "<pre>";
echo $Httpstatus->getStatusCode('Method Not Allowed');
2.Fractal组件的使用
实例
为了简单起见,这个例子被放在一起,就像它是一个文件一样。实际上,您可以将管理器初始化、数据收集和JSON转换扩展到应用程序的单独部分。
<?php
use League\Fractal\Manager;use League\Fractal\Resource\Collection;
-
Create a top level instance somewhere $fractal = new Manager();
-
Get data from some sort of source
-
Most PHP extensions for SQL engines return everything as a string, historically
-
for performance reasons. We will fix this later, but this array represents that.
$books = [
[
'id' => '1',
'title' => 'Hogfather', 'yr' => '1998',
'author_name' => 'Philip K Dick', 'author_email' => '[email protected]', ],
[
'id' => '2',
'title' => 'Game Of Kill Everyone', 'yr' => '2014',
'author_name' => 'George R. R. Satan', 'author_email' => '[email protected]', ]];
-
Pass this array (collection) into a resource, which will also have a "Transformer"
-
This "Transformer" can be a callback or a new instance of a Transformer object
-
We type hint for array, because each item in the $books var is an array
$resource = new Collection($books, function(array $book) {
return [
'id' => (int) $book['id'],
'title' => $book['title'],
'year' => (int) $book['yr'],
'author' => [
'name' => $book['author_name'],
'email' => $book['author_email'],
],
'links' => [
[
'rel' => 'self',
'uri' => '/books/'.$book['id'],
]
]
];});
-
Turn that into a structured array (handy for XML views or auto-YAML converting) $array = $fractal->createData($resource)->toArray();
-
Turn all of that into a JSON string
echo $fractal->createData($resource)->toJson();
// Outputs: {"data":[{"id":1,"title":"Hogfather","year":1998,"author":{"name":"Philip K Dick","email":"[email protected]"}},{
值得注意的是,回调是一个相当劣质的替代使用真正的变压器。它们允许您重用变压器并保持控制器重量轻。
3.intervention/image组件的使用
用法
添加服务提供商 config/app.php
'providers' => [ ... Someline\Rest\RestClientServiceProvider::class, ... ],
发布配置文件
php artisan vendor:publish
发布后,Rest Client的配置文件是config/rest-client.php,您需要将其配置为使用Rest Client。
4.Someline Rest API Client组件的使用
用法
$ restClient |
= new \ Someline \ Rest \ RestClient(' someline-starter '); |
|||
$ restClient |
- > setOAuthUserCredentials([ ' username ' => '[email protected]',' |
password ' => ' Abc12345 ',]); $ restClient - > withOAuthTokenTypeUser(); |
||
$ response = $ restClient - > get(“ users ”)- > getResponse();
if(!$ restClient - > isResponseStatusCode(200)){
$ restClient - > printResponseOriginContent();
$ responseMessage = $ restClient - > getResponseMessage();
print_r($ responseMessage);
} else {
$ responseData = $ restClient - > getResponseData();
print_r($ responseData);
}
5.redis组件的使用
配置
前面我们已经提到Redis可以用作主数据库,所以Laravel中Redis的配置信息位于config/database.php中:
'redis' => [
'cluster' => false,
'default' => [
'host' => '127.0.0.1',
'port' => 6379,
'database' => 0,
],
],
其中cluster选项表示是否在多个Redis节点间进行分片,这里我们本地测试只有一个节点故将其设置为false。
default选项表示默认Redis主机连接,这里Redis和Web服务器共用一台主机,所以host为127.0.0.1,Redis默认端口是6379。
此外,default选项还支持更多连接参数(如果需要的话):
参数 |
意义 |
默认值 |
host |
服务器IP地址/主机名称 |
127.0.0.1 |
port |
Redis服务器监听的端口号 |
6379 |
password |
如果服务器需要认证密码 |
不使用密码 |
database |
连接时选择的数据库索引 |
没有设置索引 |
timeout |
连接到Redis服务器超时时间 |
5秒 |
read_write_timeout |
通过网络连接进行读写操作的超时时间 |
系统默认(不限制超时时间的话设置为-1) |
另外Redis如果是作为缓存工具,还需要在config/cache.php配置redis选项:
'redis' => [
'driver' => 'redis',
'connection' => 'default',
],
用法
6.GuzzleHTTP组件的使用
用法
7.Restful API组件的使用
示例
RESTful API的开发和使用,无非是客户端向服务器发请求(request),以及服务器对客户端请求的响应(response)。本真RESTful架构风格具有统一接口的特点,即,使用不同的http方法表达不同的行为:
GET(SELECT):从服务器取出资源(一项或多项)
POST(CREATE):在服务器新建一个资源
PUT(UPDATE):在服务器更新资源(客户端提供完整资源数据)
PATCH(UPDATE):在服务器更新资源(客户端提供需要修改的资源数据)
DELETE(DELETE):从服务器删除资源
客户端会基于GET方法向服务器发送获取数据的请求,基于PUT或PATCH方法向服务器发送更新数据的请求等,服务端在设计API时,也要按照相应规范来处理对应的请求,这点现在应该已经成为所有RESTful API的开发者的共识了,而且各web框架的request类和response类都很强大,具有合理的默认设置和灵活的定制性。
常用的Response要包含的数据和状态码(status code)
当GET, PUT和PATCH请求成功时,要返回对应的数据,及状态码200,即SUCCESS
当POST创建数据成功时,要返回创建的数据,及状态码201,即CREATED
当DELETE删除数据成功时,不返回数据,状态码要返回204,即NO CONTENT
当GET 不到数据时,状态码要返回404,即NOT FOUND
任何时候,如果请求有问题,如校验请求数据时发现错误,要返回状态码 400,即BAD REQUEST
当API 请求需要用户认证时,如果request中的认证信息不正确,要返回状态码 401,即NOT AUTHORIZED 当API 请求需要验证用户权限时,如果当前用户无相应权限,要返回状态码 403,即FORBIDDEN
如果你正在使用 Laravel 你可以使用下面的 Artisan 命令来发布配置文件:
php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider"
你可以在你的 .env 文件中配置这个。前缀
API_PREFIX=api
版本号
API_VERSION=v1
响应格式
API_DEFAULT_FORMAT=json
调式模式
API_DEBUG=true
版本组
为了避免与你主要的项目路由冲突,dingo/api 将会使用其专属的路由实例。要创建端点,我们首先需要获得一个 API 路由的实例:
$api = app('Dingo\Api\Routing\Router');
现在我们必须定义一个版本分组。这种定义方式有利于后续为相同端点新增多版本支持。
$api->version('v1', function ($api) {});
如果你想一个分组返回多个版本,只需要传递一个版本数组。
$api->version(['v1', 'v2'], function ($api) {});
通过在第二个参数上传递一个属性数组,你也可以将此组视为特定框架的标准组。
$api->version('v1', ['middleware' => 'foo'], function ($api) {});
你还可以嵌套常规组以进一步定制某些端点。
$api->version('v1', function ($api) {$api->group(['middleware' => 'foo'], function ($api) {// Endpoints registered here will have the "foo" middleware applied.});});
创建端点
一旦你有了一个版本分组,你就可以在分组闭包的参数中,通过 $api 创建端点。
$api->version('v1',function($api){$api->get('users/{id}', 'App\Api\Controllers\[email protected]');});
因为端点被每个版本分组了,你可以为相同 URL 上的同一个端点创建不同响应。
$api->version('v1',function($api){$api->get('users/{id}', 'App\Api\V1\Controllers\[email protected]');});
$api->version('v2',function($api){$api->get('users/{id}', 'App\Api\V2\Controllers\[email protected]');});
你也可以使用各自的方法注册资源和控制器。
提醒,你需要为控制器添加说明完整的命名空间,比如, App\Http\Controllers.
config/api.php
index.html
'wis' 名称的设置在
GetDetailInfo.php
在命令行中查看路由
如果你正在使用 Laravel 5.1 你可以使用 Artisan 命令看到你注册的路由。
php artisan api:routes
这个命令和 Laravel 自带的 route:list 命令相同。
响应
一个可用的 API 简单来说就是通过接受请求并将易处理的响应返回给客户端,一般来说, API 有多种易处理的方式返回响应,例如 JSON ,而具体应该使用哪种方式返回响应取决于你的 API 的复杂程度。
通常来说,直接在控制器中返回一个数组或对象就是最简单的返回响应的方式,但是不是所有的对象都能被正确的格式化ArrayObject 或 Illuminate\Support\Contracts\ArrayableInterface 接口。
class UserController{public function index(){return User::all();}}
User 类继承了 Illuminate\Database\Eloquent\Model, 这意味着它能被格式化成数组,所以我们可以直接返回 users 的集合,通过调用 User::all()。同样的, 你可以返回一个单一的用户。
class UserController{public function show($id){return User::findOrFail($id);}}
这个包将会自动的格式化响应为 JSON,并设置 Content-Type 头为 application/json。
响应生成器
响应生成器提供了一个流畅的接口去方便的建立一个更定制化的响应。响应的生成器通常是与 transformer 相结合。
要利用响应生成器, 你的控制器需要使用 Dingo\Api\Routing\Helpers trait。为了在你的控制器里保持引入和使用这个 trait,你可以创建一个基础控制器,然后你的所有的 API 控制器都继承它。
use Dingo\Api\Routing\Helpers;
use Illuminate\Routing\Controller;
class BaseController extends Controller{use Helpers;}
现在你的控制器可以直接继承基础控制器。响应生成器可以在控制器里通过 $response 属性获取。提示,下面所有的方法也可以当做 withX 使用,你应该会更喜欢这种语法。
响应一个数组
class UserController extends BaseController
{
public function show($id)
{$user = User::findOrFail($id);
return $this->response->array($user->toArray());
}
}
其中detailinfo为模型
路由路径:
响应一个元素
class UserController extends BaseController
{
public function show($id)
{$user = User::findOrFail($id);
return $this->response->item($user, new UserTransformer);
}
}
响应一个元素集合
class UserController extends BaseController
{
public function index()
{$users = User::all();
return $this->response->collection($users, new UserTransformer);
}
}
分页响应
class UserController extends BaseController
{
public function index()
{$users = User::paginate(25);
return $this->response->paginator($users, new UserTransformer);
}
}
无内容响应
return $this->response->noContent();
创建了资源的响应
return $this->response->created();
你可以在第一个参数的位置,提供创建的资源的位置。
return $this->response->created($location);
错误响应
这有很多不同的方式创建错误响应,你可以快速的生成一个错误响应。
// 一个自定义消息和状态码的普通错误。
return $this->response->error('This is an error.', 404);
// 一个没有找到资源的错误,第一个参数可以传递自定义消息。
return $this->response->errorNotFound();
// 一个 bad request 错误,第一个参数可以传递自定义消息。
return $this->response->errorBadRequest();
// 一个服务器拒绝错误,第一个参数可以传递自定义消息。
return $this->response->errorForbidden();
// 一个内部错误,第一个参数可以传递自定义消息。
return $this->response->errorInternal();
// 一个未认证错误,第一个参数可以传递自定义消息。
return $this->response->errorUnauthorized();
错误异常和错误响应
Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException |
403 |
Symfony\Component\HttpKernel\Exception\BadRequestHttpException |
400 |
Symfony\Component\HttpKernel\Exception\ConflictHttpException |
409 |
Symfony\Component\HttpKernel\Exception\GoneHttpException |
410 |
Symfony\Component\HttpKernel\Exception\HttpException |
500 |
Symfony\Component\HttpKernel\Exception\LengthRequiredHttpException |
411 |
Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException |
405 |
Symfony\Component\HttpKernel\Exception\NotAcceptableHttpException |
406 |
Symfony\Component\HttpKernel\Exception\NotFoundHttpException |
404 |
Symfony\Component\HttpKernel\Exception\PreconditionFailedHttpException |
412 |
Symfony\Component\HttpKernel\Exception\PreconditionRequiredHttpException |
428 |
Symfony\Component\HttpKernel\Exception\ServiceUnavailableHttpException |
503 |
Symfony\Component\HttpKernel\Exception\TooManyRequestsHttpException |
429 |
Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException |
401 |
Symfony\Component\HttpKernel\Exception\UnsupportedMediaTypeHttpException |
415 |
比如,当你修改一个记录后,其他的用户已经在你之前修改了它,你可能会抛出一个 ConflictHttpException 异常。
保护级别
您可以通过 api.auth 路由中间件来启用路由或者路由群组的保护。
如果您使用 Laravel 的定制包。则可以直接使用 api.auth 这个中间件。并且不需要注册。
在所有的路由上启用
$api->version('v1', ['middleware' => 'api.auth'], function ($api) {// 在这个版本群组下的所有路由将进行身份验证。});
特定的路由上启用
$api->version('v1', function ($api) {
$api->get('user', ['middleware' => 'api.auth', function ()
{
// 这个路由将进行身份验证。}]);
$api->get('posts', function () {// 这个路由不会验证身份。});
});
只允许特定的身份验证提供者
如果你想在一个群组或者特定的路由上验证身份验证提供者。你可以启用 providers 来配置。
$api->version('v1', function ($api) {
$api->get('user', ['middleware' => 'api.auth', 'providers' => ['basic', 'oauth'], function () {// 这个路由将进行身份验证。}]);
});
控制器上进行身份验证
Laravel 和 Lumen 都可以在控制器里启用中间件。您可以在构造函数里使用 middleware 的方法。
class UserController extends Illuminate\Routing\Controller
{
use Helpers;
public function __construct()
{
$this->middleware('api.auth');
// 这个中间件只在 index 中启用
$this->middleware('api.auth', ['only' => ['index']]);
}
public function index(){//}
public function posts(){//}
}
改变节流限速的 key
默认节流限速是绑定客户 ip 地址的。如果需要改变这个默认行为,你可以注册你自己的解决者,它应该返回一个字符串用于节流限速器。
app('Dingo\Api\Http\RateLimit\Handler')->setRateLimiter(function ($app, $request)
{return $app['example']->getRateLimiterKey();
});
第一个参数是应用IoC容器的实例,第二个参数是被节流限速的请求实例。
启用节流限制
要为路由或路由组启用节流限制,你必须启用api.throttle中间件。 一旦启用了节流限制,你必须已经配置过了一些限制或配置过了具体的路由限制。
在所有的路由中启用节流限制
$api->version('v1', ['middleware' => 'api.throttle'], function ($api) {// 此版本组中的路由将需要身份认证.});
特定路由上的节流限制
$api->version('v1', function ($api) {
$api->get('user', ['middleware' => 'api.throttle', function ()
{// 这个路由需要验证}]);
$api->get('posts', function () {// 这个路由不需要验证});
});
路由特定节流
如果只是想限制某些路由或者路由群组,可使用 limit 和 expires 选项。
$api->version('v1', function ($api) {
$api->get('users', ['middleware' => 'api.throttle', 'limit' => 100, 'expires' => 5, function () {return User::all();}]);
});
以上为这个路由设置了请求限制 100 次,过期时间 5 分钟。如果你把它设置在路由群组上,那组内的每个路由具有100次请求的限制。
$api->version('v1', ['middleware' => 'api.throttle', 'limit' => 100, 'expires' => 5], function ($api) {
$api->get('users', function () {return User::all();});
$api->get('posts', function () {return Post::all();});
});
以上例子中单个用户可以各访问100次 /users 和 /posts 路由。此限制不是作用于整个组的,而是作用于这个组的每个路由。
使用 Postman
向您的API发出请求非常简单。最好的办法就是使用类似 Postman 的工具。
因为我们不是在URL里面对API进行版本控制,所以我们需要定义一个 Accept 头信息来请求我们的特定版本。header 的格式是这样的:
Accept: application/vnd.YOUR_SUBTYPE.v1+json
在上面的事例中,您将替换 YOUR_SUBTYPE 为您在配置中定义的子类型名称。同样,这通常是您运用程序中独特的东西,例如:它的名称和标识符,通常都是小写字母。
使用 CURL
如果您不想使用 Postman 。 您可以使用命令行工具, 例如 Curl。
curl -v -H "Accept: application/vnd.YOUR_SUBTYPE.v1+json" http://example.app/users
如果您启用了严格模式,并且传递无效的 Accept 头信息 。 Symfony\Component\HttpKernel\Exception\BadRequestHttpException 将抛出异常。
使用postman api接口测试
.env文件下配置api的接口
在routes/api.php 配置路由接口
在APP\Http\Controllers下新建BaseController.php
在APP\Http\Controllers下新建TestController.php
打开postman进行测试
输入测试的url地址
API_DOMAIN=wisframework.test 地址
完整的url 为wisframework.test/api/test
接口测试成功!
进行传参测试
参数post成功!
dingoapi文档 https://laravel-china.org/docs/dingo-api/2.0.0
8.L5 Repository组件的使用
Laravel 5 中使用 Repository 模式实现业务逻辑和数据访问的分离用途:自动生成相应组件
配置
编辑config/repository.php,配置对应参数
生成repository:php artisan make:repository Member。此操作会生成三个文件:
模型:Models/Member.php
数据迁移文件:database/migrations/2017_01_11_170441_create_posts_table.php
仓库接口文件:Repositories/MemberRepository.php
仓库实体文件:Repositories/MemberRepositoryEloquent.php
使用模型
public function model()
{
return Member::class;
}
使用验证器
public function validator()
{
return MemberValidator::class;
}
使用输出格式化
public function presenter()
{
return MemberPresenter::class;
}
生成validator:php artisan make:validator Member。模型验证器,生成一个文件:
1.Validators/MemberValidator.php,仓库在调用创建或更新时会调用此验证规则。
生成transformer:php artisan make:transformer Member。模型输出格式化。(可选操作,在生成presenter时,会提示是否一起生成)
-
Transformers/MemberTransformer.php,仓库调用数据时会自动根据此格式输出。
生成输出:php artisan make:presenter Member。生成输出器,仓库实体里使用,
1.Presenters/MemberPresenter.php。
2.此操作会提示是否生成transformer。
public function getTransformer()
{
return new MemberTransformer();
}
绑定容器:php artisan make:bindings Member。生成绑定关系
1.首次绑定会生成:Providers/RepositoryServiceProvider.php,将此文件添加至app.php。
2.后续绑定会添加接口与实现的类绑定关系。用于依赖注入。
用法
创建一个模型
正常创建模型,但定义可以从输入表单数据填充的属性非常重要。
命名空间 App ;
class Post 扩展了 Eloquent { //或Ardent,或任何其他模型类
protected $ fillable = [ ' title ',' author ',... ];
... }
其实将这个模式用在项目中就是为了将业务逻辑和具体的调用分开,创建一个仓库来存放这些业务逻辑。那么我们怎么使用呢?
建立Repository目录来存放不同的业务逻辑
在Contracts中存放接口文件,Eloquent中存放具体的实现方法j
样板:TestRepository.php
<?php
namespace App\Repository\Test\Eloquent;
use App\Admin;
use App\Repository\Test\Contracts\TestRepositoryInterface;
use App\User;
//使用Contracts中的接口文件
class TestRepository implements TestRepositoryInterface
{
//在Eloquent的TestRepository处理数据库操作
public function selectAll()
{
//paginate 分页
return User::paginate();
}
public function find($id)
{
return User::find($id);
}
}
样板:TestRepositoryInterface.php
<?php
namespace App\Repository\Test\Contracts;
//在Contracts中定义接口文件方法
interface TestRepositoryInterface
{
public function selectAll();
public function find($id);
}
编写服务提供者,在终端执行php artisan make:provider RepositoryServiceProvider
编写你自己的服务提供者
app\Providers\RepositoryServiceProvider.php注册Test仓库
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class RepositoryServiceProvider extends ServiceProvider
{
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register services.
*
* @return void
*/
public function register()
{
//
$this->app->bind('App\Repository\Test\Contracts\TestRepositoryInterface', 'App\Repository\Test\Eloquent\TestRepository');
}
}
创建一个model层
例子:php artisan make:model User
方法: php artisan make:model 目录/文件名
model : User.php
<?php
namespace App;
use App\Http\Traits\Searchable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use Notifiable;
use Searchable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
}
创建一个控制器
例子:php artisan make:controller Testcontroller
方法: php artisan make:controller 目录/文件名
controller:Testcontroller.php
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Repository\Test\Contracts;
class TestController extends Controller
{
//在构造函数传入Contracts接口文件,和参数
public function __construct(Contracts\TestRepositoryInterface $house)
{
$this->house = $house;
}
public function index()
{
//这里可以不写数据库操作直接调用Eloquent实现方法中的方法
$houses = $this->house->selectAll();
return View('admin.repository', compact('houses'));
}
// public function create()
// {
// return View::make('houses.create');
// }
// public function show($id)
// {
// $house = $this->house->find($id);
// return View::make('houses.show', compact('house'));
// }
}
在app.php的providers数组中添加我们的服务提供者
要注意路径问题
'providers' => [
App\Providers\RepositoryServiceProvider::class,
]
创建存储库
命名空间 App ;
使用 Prettus \ Repository \ Eloquent \ BaseRepository ;
class PostRepository 扩展了 BaseRepository {
/ ** *指定模型类名 * * @return string * / function model() { return “ App \\ Post ” ; }}
9.Laravel Validation组件的使用
Validation即数据校验,是开发健壮RESTful API中另一个重要的一环。仍以json为例,当客户端向服务器发出 post, put或patch请求时,通常会同时给服务器发送json格式的相关数据,服务器在做数据处理之前,先做数据校验,是最合理和安全的前后端交互。如果客户端发送的数据不正确或不合理,服务器端经过校验后直接向客户端返回400错误及相应的数据错误信息即可。常见的数据校验包括:
数据类型校验,如字段类型如果是int,那么给字段赋字符串的值则报错
数据格式校验,如邮箱或密码,其赋值必须满足相应的正则表达式,才是正确的输入数据
数据逻辑校验,如数据包含出生日期和年龄两个字段,如果这两个字段的数据不一致,则数据校验失败
实例
在接口文件对参数的验证
调用接口文件,传递参数merchant_id等
对merchant_id进行验证
$rules = [
'merchant_id' => 'required',
];
$messages = [
'merchant_id.required' => '缺少商户id',
];
$v = Validator::make($params, $rules, $messages);
失败返回错误信息提示,
验证通过则执行run函数。
$rules用来定义验证的规则。
validation验证规则实例:
public function saveOrganizationCode(Request $request) {
'organization_name' => 'required',
'auth_num' => 'required|int',
//experitime和experimonth只能二选一,并且experitime只能是大于明天的时间
'experimonth' => 'int|required_without:experitime',
'auth_codes' => 'required',
'active_num.required' => '授权数是必须的!',
}
$this->validate($request, [
'organization_id' => 'required|int',
'resource' => 'required',
'experitime' => 'date|after:tomorrow|required_without:experimonth',
'active_num' => 'required|int',
],[
]);
接口文件中进行参数的验证
$rules 为定义得规则
$messgae 规则验证失败时提示的信息
使用方法validator::make($params,$rules,$messages);
当id有值时
当id缺失时
其他的规则
10.Intervention Image Cache组件的使用
用法
图像缓存最好由Image::cacheIntervention Image类的静态方法调用。
要创建缓存图像,只需使用静态方法Image::cache并通过闭包传递图像操作。该方法将自动检测是否存在特定操作的缓存文件。
'providers' => array(
[...]
'Intervention\Image\ImageServiceProvider'
),
将此包的外观添加到$aliases数组中
'aliases' => array(
[...]
'Image' => 'Intervention\Image\Facades\Image'
),
11.Someline Image Service组件的使用
路线
Route :: get(' / image / {name} ',' ImageController @ showOriginalImage ');
Route :: post(' / image ',' ImageController @ postImage ');
模型
use SomelineHasImageablesTrait;
用法
/** @var SomelineImage $somelineImage */$somelineImage = SomelineImage::find(1);
/** @var User $user */$user = User::find(1);
// save image relations smartly with sequence support (recommended)$user->syncImages([1, 2], ['type' => 'cover', 'data' => json_encode('a')]);
// save image relations via save$user->images()->save($somelineImage, ['type' => 'cover', 'data' => json_encode('a')]); // save image relations via attach$user->images()->attach(1, ['type' => 'cover', 'data' => json_encode('a')]); // update image relations via sync$user->images()->sync([1]);
// set as main image$user->setAsMainImage($somelineImage);
// set as type main image$user->setAsTypeMainImage('cover', $somelineImage);
// get all imagesprint_r($user->getImages()->toArray());
// get first main imageprint_r($user->getMainImage()->toArray());
// get all main imagesprint_r($user->getMainImages()->toArray());
// get all type imagesprint_r($user->getTypeImages('cover')->toArray());
// get all type images and are main imagesprint_r($user->getTypeMainImages('cover')->toArray());
示例控制器文件
app/Http/Controllers/ImageController.php
<?php namespace App\Http\Controllers;
Use Exception;use Illuminate\Http\Request;use Someline\Image\Controllers\SomelineImageController;use Someline\Models\Image\SomelineImage;use Someline\Image\SomelineImageService;
class ImageController extends Controller{
public function postImage(Request $request)
{ $somelineImageService = new SomelineImageService(); $file = $request->file('image');
$somelineImage = null;
try {
/** @var SomelineImage $somelineImage */ $somelineImage = $somelineImageService->handleUploadedFile($file);
}
catch (Exception $e) {
return 'Failed to save: ' . $e->getMessage();
}
if (!$somelineImage) { return 'Failed to save uploaded image.'; }
$somelineImageId = $somelineImage->getSomelineImageId();
return 'Saved: ' . $somelineImage->getImageUrl(); }
public function showOriginalImage($image_name)
{
return SomelineImageController::showImage('original', $image_name); }
}
12.Laravel Passport组件的使用
Laravel使用Laravel Passport实现API身份验证,Laravel Passport可在几分钟内为您的Laravel应用程序提供完整的OAuth2服务器实现。Passport建立在由Andy Millington和Simon Hamp维护的League OAuth2服务器之上。
如果你不打算使用Passport的默认迁移,你应该调用的方法的方法。您可以使用导出默认迁移。
Passport::ignoreMigrationsregisterAppServiceProviderphp artisan vendor:publish --tag=passport
接下来,您应该运行该命令。此命令将创建生成安全访问令牌所需的加***。此外,该命令将创建“个人访问”和“密码授予”客户端,这些客户端将用于生成访问令牌:passport:install
php artisan passport:install
运行此命令后,将特征添加到模型中。此特征将为您的模型提供一些辅助方法,允许您检查经过身份验证的用户的令牌和范围:Laravel\Passport\HasApiTokensApp\User
<?php
namespace App;
use Laravel\Passport\HasApiTokens;use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable{
use HasApiTokens, Notifiable;}
接下来,您应该在您的方法中调用该方法。此方法将注册发出访问令牌和撤销访问令牌,客户端和个人访问令牌所需的路由:Passport::routesbootAuthServiceProvider
<?php
namespace App\Providers;
use Laravel\Passport\Passport;use Illuminate\Support\Facades\Gate;use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider{
/**
-
The policy mappings for the application.
-
@var array
*/
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
];
*/
public function boot()
{
$this->registerPolicies();
Passport::routes();
}}
最后,在配置文件中,您应该将身份验证防护的选项设置为。这将指示您的应用程序在验证传入的API请求时使用 Passport :config/auth.phpdriverapipassportTokenGuard
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
,],
示例
要使用Passport Vue组件,您必须使用Vue JavaScript框架。这些组件也使用Bootstrap CSS框架。但是,即使您没有使用这些工具,这些组件也可以作为您自己的前端实现的有价值的参考。
发布Passport Vue组件,请使用Artisan命令:php artisan vendor:publish --tag=passport-components
默认情况下,Passport会发布一年后过期的长期访问令牌。如果要配置更长/更短的令牌生存期,可以使用tokensExpireIn和refreshTokensExpireIn方法。应该从boot您的方法调用这些方法AuthServiceProvider:
已发布的组件将被放置在 resources/assets/js/components 目录中,可以在 resources/assets/js/app.js 文件中注册它们:
Vue.component('passport-clients',require('./components/passport/Clients.vue'));Vue.component('passport-authorized-clients',require('./components/passport/AuthorizedClients.vue'));
注册之后,执行npm run dev
令牌生命周期
配置生命周期短一点的令牌,可以使用 tokensExpireIn 和 refreshTokensExpireIn 方法,这些方法需要在 AuthServiceProvider 的 boot 方法中调用:
如果你的程序是需要前后端分离形式的OAuth认证而不是多平台认证那么你可以在routers()方法中传递一个匿名函数来自定定义自己需要注册的路由,我这里是前后端分离的认证形式,因此我只需要对我的前端一个Client提供Auth的认证,所以我只注册了获取Token的路由,同时我还为它自定义了前缀名。
public function boot()
{
$this->registerPolicies();
Passport::routes(function(RouteRegistrar $router) {
$router->forAccessTokens();
},['prefix' => 'api/oauth']);
Passport::tokensExpireIn(now()->addDays(15));
Passport::refreshTokensExpireIn(now()->addDays(30));
}
创建客户端最简单的方式就是使用 Artisan 命令 passport:client,该命令可用于创建你自己的客户端以方便测试 OAuth2 功能。当你运行 client 命令时,Passport 会提示你关于客户端的更多信息,并且为你提供 client ID 和 secret:
php artisan passport:client
为了 Api 返回数据方便,我封装了几个函数:
function respond($status, $respond)
{
return response()->json(['status' => $status, is_string($respond) ? 'message' : 'data' => $respond]);
}
function succeed($respond = 'Request success!')
{
return respond(true, $respond);
}
function failed($respond = 'Request failed!')
{
return respond(false, $respond);
}
respond 函数可以做基本返回,succeed 和 failed 是在 respond 函数上做的再次封装,用以返回请求成功和请求失败数据。
实例:
创建生成安全访问令牌时用到的加***及私人访问和密码访问客户端。
php artisan passport:install
Trait 添加到 App\User 模型中,这个要进行登录的表的model层 Trait 会给这个模型提供一些辅助函数,用于检查已认证用户的令牌和使用作用于。
然后在 AuthServiceProvider 的 boot 方法中添加 Passport::roues()
最后,修改文件 config/auth.php 中 api 部分的授权保护项( driver )改为 passport 。此调整会让你的应用程序在接收到 API 的授权请求时使用 Passport 的 TokenGuard 来处理
增加测试路由
php artisen make:controller UserController
通过postman进行简单测试获取token
vue的使用
首先在页面先引进vue.js
<script src="./js/vue.js"></script>
实例:
<div id="app"></div>
对应 el:"#app"
var app = new Vue({
el:"#app",
data() {
return {
detail:'',
};
},
data(){
return{
detail:'',
};
}
data为要渲染的数据。变量申明detail:''.
mounted () {
// this.token = obj.data.api_token;
var post_data = {
method: 'get.detail.info',
nonce: 'get.detail.info',
// token: this.token,
};
var _self = this
axios.post('/api/v1',api_data_sign(post_data, 'wis'))
.then(function (response) {
var data = response.data;
if(data.code == 200 ){
_self.detail=data.data;
}else{
}
})
.catch(function (error) {
console.log(error);
})
},
mounted()方法 :在模板渲染成html后调用,通常是初始化页面完成后,再对html的dom节点进行一些需要的操作。
mounted () {
// this.token = obj.data.api_token;
var post_data = {
method: 'get.detail.info',
nonce: 'get.detail.info',
// token: this.token,
};
var _self = this
axios.post('/api/v1',api_data_sign(post_data, 'wis'))
.then(function (response) {
var data = response.data;
if(data.code == 200 ){
_self.detail=data.data;
}else{
}
})
.catch(function (error) {
console.log(error);
})
},
method: 'get.detail.info', 对应的控制器名称为GetDetailInfo.
控制器中内容为
class 类名 GetDetailInfo
checkParams 为接口参数的检验
run()函数执行接口的操作
$data 为数据库的操作语句,进行对数据库的操作
最后返回$data 数据给前端页面,进行数据的渲染
axios.post('/api/v1',api_data_sign(post_data, 'wis'))
'wis' 配置在
其中ajax的请求涉及到路由文件的调用,routes/api.php
Route::any('v1', ['middleware'=>'api','uses'=>'[email protected]']);
还有controller文件下的Apicontroller.php文件
methods()为定义和编写方法的地方,在methods()中定义页面调用的方法。
接口的报错信息在这个地方