laravel 知识总结1

屠君墨
2023-12-01

开始

jwt

自定义 数据表 区别于 auth 中的 users 表

url

  1.  修改jwt配置文件中  'user' => 'App\Models\ApiUser',
        在认证的时候,调用 JWTAuth::fromUser ($user),$user 是从 api_user 表中读取的数据
    
  2. 修改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'));
        });
    }
    

多表(多用户端)验证隔离

url

常用

HTTP 状态码

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,一般也不会显示返回,通常用于排查问题用

假数据填充的步骤

url

测试,清除

  1. 定义好模型 xxx.php
  2. 定义好数据生成的规则 database/factories/XxxlFactory.php
  3. 写入生成数据的代码,控制好生成的数据数目,对生成后的数据做出修改 database/seeds/XxxTableSeeder.php
  4. 注册

用户权限

  • 对用户的信息保护

  • 游客:游客不能直接访问用户信息的修改页面 (通过中间件验证)

  • 已登录用户:只有用户自己可以修改自己的信息(通过授权策略验证)

  • 使用中间件

在 Controller 的 __construct() 方法中,使用 middleware() 方法注册中间件

  • 使用策略
  1. 创建策略

    php artisan make:policy UserPolicy
    
  2. 结合 当前登录的用户需要验证的用户 编写验证的方法

  3. 注册策略

    • AuthServiceProvider 中的 policies 属性中注册策略
    • 键值为 用户模型 => 策略
  4. 使用验证策略

    • 在控制器中,涉及到用户修改的方法中使用
    • $this->authorize('<策略中定义的方法>', '<需要验证的用户的实例>')

国际化,模型

  1. 表单请求验证 FormRequest
  2. FormRequest 中的规则写在 rules 方法中
  3. 'name' => 'required|between:3,25|regex:/^[A-Za-z0-9\-\_]+$/|unique:users,name,' . Auth::id(), 可以验证时忽略当前用户
  4. 使用 with 方法来代替之前的 Session 方法来传送消息
  5. 使用 FormRequestmessages 方法来自定义验证错误信息
  6. 使用 overtrue/laravel-lang:~3.0 来进行语言的国际化
  7. 国际化时,需要在 resources/lang/xx/validation.php 中的 custom 数组中翻译
  8. 模型添加了新属性后,记得要在 fillable 中添加可以更新的属性
  9. 使用 Carbon Datetime 扩展,生成友好的时间表示
  10. AppServiceProvider 是框架的核心,Laravel 启动时,最先加载
  11. 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 是 Laravel 的一员,提供友好的界面监控
  • 使用 Horizon

安装

composer require "laravel/horizon:~1.0"

配置

php artisan vendor:publish --provider="Laravel\Horizon\HorizonServiceProvider"

访问 Web 页面

http://project.test/horizon

启动监控

php artisan horizon

文档学习

Collection

  • 创建集合

    • $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']);
      

Provider

服务容器

  • 在 Controller
  • 事件监听器
  • 队列任务
  • 中间件

原理

  • 由上层去决定使用方式

步骤

  • 写好类(Contracts)契约
  • 绑定(服务容器提供者)
    • 简单绑定
    • 单例
    • 实例
  • 解析(控制器)
    • make
    • makeWith 传参数
例子-发送邮件

/**
 *发送邮件服务类
 */
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 数组

admin-temp 目录结构解析

  • App\Http\Requests
    • 参数请求过滤
  • App\Models
    • 模型创建
  • App\Http\Resources
    • 返回格式处理

error

jwt

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(); 
}

RuntimeException No application encryption key has been specified.

  • php artisan key:generate
  • 该命令会生成APP_KEY并写入到.env文件中,重新运行

结束

nginx 配置

配置链接

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;
    }
}
 类似资料: