修改jwt配置文件中 'user' => 'App\Models\ApiUser',
在认证的时候,调用 JWTAuth::fromUser ($user),$user 是从 api_user 表中读取的数据
修改jwt配置文件中 'user' => 'App\Models\ApiUser',
在 vendor/tymon/jwt-auth/src/Providers/Auth/IlluminateAuthAdapter.php 文件中修改如下代码
// before
public function __construct(AuthManager $auth)
{
$this->auth = $auth;
}
// after
public function __construct(AuthManager $auth)
{
$this->auth = $auth;
$this->auth->provider('eloquent', function ($app, $config) {
return new EloquentUserProvider($app['hash'], config('jwt.user'));
});
}
200:OK,标准的响应成功状态码
201:Object created,用于 store 操作
204:No content,操作执行成功,但是没有返回任何内容
206:Partial content,返回部分资源时使用
400:Bad request,请求验证失败
401:Unauthorized,用户需要认证
403:Forbidden,用户认证通过但是没有权限执行该操作
404:Not found,请求资源不存在
500:Internal server error,通常我们并不会显示返回这个状态码,除非程序异常中断
503:Service unavailable,一般也不会显示返回,通常用于排查问题用
xxx.php
database/factories/XxxlFactory.php
database/seeds/XxxTableSeeder.php
对用户的信息保护
游客:游客不能直接访问用户信息的修改页面 (通过中间件验证)
已登录用户:只有用户自己可以修改自己的信息(通过授权策略验证)
使用中间件
在 Controller 的 __construct()
方法中,使用 middleware()
方法注册中间件
创建策略
php artisan make:policy UserPolicy
结合 当前登录的用户 和 需要验证的用户 编写验证的方法
注册策略
AuthServiceProvider
中的 policies
属性中注册策略用户模型 => 策略
使用验证策略
$this->authorize('<策略中定义的方法>', '<需要验证的用户的实例>')
FormRequest
FormRequest
中的规则写在 rules
方法中'name' => 'required|between:3,25|regex:/^[A-Za-z0-9\-\_]+$/|unique:users,name,' . Auth::id()
, 可以验证时忽略当前用户with
方法来代替之前的 Session
方法来传送消息FormRequest
的 messages
方法来自定义验证错误信息overtrue/laravel-lang:~3.0
来进行语言的国际化resources/lang/xx/validation.php
中的 custom
数组中翻译fillable
中添加可以更新的属性Carbon
Datetime 扩展,生成友好的时间表示AppServiceProvider
是框架的核心,Laravel 启动时,最先加载AppServiceProvider
中设置 Carbon 的语言对模型的生命周期内的多个时间点进行监控,分别有 ~ing
和 ~ed
事件
每个监控方法接收 model
作为唯一参数
使用观察器
创建观察器文件,一个普通类,不需要继承什么
针对需要的事件,编写对应的 ~ing
或 ~ed
方法,方法接收 model
作为唯一参数
在 AppServiceProvider
中注册
// 在 boot 方法中
YourModel::observe(YourModelObserver::class);
使用队列可以异步执行消耗时间的任务,降低请求响应时间
配置队列
队列配置信息文件
config/queue.php
在 .env
中修改所配置的队列驱动 QUEUE_DRIVER
配置失败任务的记录
php artisan queue:failed-table
生成任务类
创建任务类
php artisan make:job QueueJob
app/Jobs
配置任务类
_construct
构建方法中,注入所需要的模型handler
方法中,开始你的任务若任务涉及到了数据库的读写,需要注意
数据库的读写直接使用DB
类,而不是使用 ORM
因为一般我们会在模型监听器中分发队列任务,此时,会形成一个死循环
通过 ORM 写数据库,触发 ORM 监听器 -> 分发队列任务 -> 任务中使用了 ORM 写数据库 -> 通过 ORM 写数据库,触发 ORM 监听器 -> …
分发任务
在模型监听器中调用 dispatch(new QueueJob($aModel))
需要注意
当创建数据时启用了队列任务时,需要在saved
监听方法中分发任务
若在saving
中分发任务,任务运行时通过数据 ID 寻找数据时可能会出错,因为saving
的时候,数据还没有写到数据库
队列监控
使用 Laravel 自带的
php artisan queue:listen
使用 Horizon
使用 Horizon
安装
composer require "laravel/horizon:~1.0"
配置
php artisan vendor:publish --provider="Laravel\Horizon\HorizonServiceProvider"
访问 Web 页面
http://project.test/horizon
启动监控
php artisan horizon
创建集合
$collection = collect([1, 2, 3]);
拆分
$chunks = $collection->chunk(4);
合并
$collapsed = $collection->collapse();
是否包含给定的项目
// 第二个参数判断 二维数组键值
$collection->contains('Desk');
参数处理
User::orderBy("id","desc")->paginate(10)->each(function($item){
$info = Artic::where("id",$item->artic_id)->get();
if($info->first()){
$item['title'] = $info[0]->title;
}else{
$item['title'] = '';
}
})
除了指定键以外的所有项目
$filtered = $collection->except(['price', 'discount']);
原理
步骤
无
/**
*发送邮件服务类
*/
class EmailService{
public function send(){
//todo 发送邮件方法
}
}
//如果任何地方要发邮件我们就复制下面这两行代码
$emailService = new EmailService();
$emailService->send();
有
$this->app->bind('emailService', function ($app) {
return new EmailService();
});
//如果任何地方要发邮件我们就复制下面这两行代码
$emailService = app('emailService');
$emailService->send();
原来
<?php
interface TrafficTool
{
public function go();
}
class Train implements TrafficTool
{
public function go()
{
echo "train....";
}
}
class Leg implements TrafficTool
{
public function go()
{
echo "leg..";
}
}
class Traveller
{
/**
* @var Leg|null|Train
* 旅行工具
*/
protected $_trafficTool;
public function __construct(TrafficTool $trafficTool)
{
$this->_trafficTool = $trafficTool;
}
public function visitTibet()
{
$this->_trafficTool->go();
}
}
//当旅行者要坐火车去旅行通常我们这样写:
$train = new Train();
$tra = new Traveller($train);
$tra->visitTibet();
变成
namespace App\Providers;
use Laravel\Lumen\Providers\EventServiceProvider as ServiceProvider;
class RepositoryServiceProvider extends ServiceProvider
{
public function register()
{
//在服务容器中绑定类
$this->app->bind( 'TrafficTool', 'Train');
$this->app->bind('Traveller', 'Traveller');
}
}
// 实例化对象
$tra = app()->make('Traveller');
$tra->visitTibet();
生成提供器
php artisan make:provider RiakServiceProvider
注册方法 register -》 $app 访问服务容器
引导方法 boot
注册提供器 config/app.php -》providers 数组
laravel5.5 使用jwt,生成key,报如下错
D:\laragon323\www\lar55>php artisan jwt:generate
In BoundMethod.php line 135:
Method Tymon\JWTAuth\Commands\JWTGenerateCommand::handle() does not exist
原因分析:在5.5中,调用句柄已改为handle而非之前的fire方法,更改命令类中相应方法即可。
找到vendor/tymon/src/Commands/JWTGenerateCommand.php文件,加上如下代码,即可。
public function handle() {
$this->fire();
}
server {
listen 80;
server_name example.com;
root /example.com/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
index index.html index.htm index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}