用Laravel也有不短的工夫了,也用过不少版本了,以下代码是在日常我的项目中收集,作为笔记,也分享进去,心愿对你有点用途。
注:版本没标注,若有不兼容的问题,微调即可。

验证

不太习惯独自弄个Request验证类,比拟习惯上面的写法:

use Illuminate\Http\Request;use Illuminate\Support\Facades\Validator;    $inputData = $request->only(['name', 'address', 'mobile', 'draw_id']);    $messages = [        'required'=>':attribute为必填项',         'int'=>':attribute参数类型谬误',         'max'=>':attribute长度不得超过 :size',    ];    $validator = Validator::make($inputData, [        'draw_id' => 'required|int',        'name' => 'required',        'mobile' => 'required',        'address' => 'required',    ], $messages,[        'name'=>'收货人姓名',        'mobile'=>'手机号码',        'address'=>'收货地址',    ]);    if ($validator->fails()) {        return self::response([], current($validator->errors()->all()), 2);    }

自定义验证

比方罕用的手机号验证:

php artisan make:rule Mobile

而后改一下:

    /**     * Mobile次要代码     * 验证是否通过     *     * @param  string  $attribute     * @param  mixed  $value     * @return bool     */    public function passes($attribute, $value)    {        //        return preg_match('/^1\d{10}$/', $value);    }    /**     * 错误信息     *     * @return string     */    public function message()    {        return '手机号格局不正确';    }

而后这么用起来:

$columns = [    'college' => 'required|max:32',    'mobile' => ['required', new Mobile()],    'qq' => 'required',];

ORM

关联查问

  • 一对一
// Model定义,关联外键class User extends Model{    ...        public function userIntegral()    {        return $this->hasOne('App\Models\UserIntegral', 'user_id', 'id');    }}// 应用with查问(new User())->with('userIntegral')->orderBy('id', 'desc')->paginate($limit);
  • 一对多
//Modelnamespace App\Models;use Illuminate\Database\Eloquent\Model;class Hotel extends Model{    public function orders()    {        return $this->hasMany('App\Models\Order');    }}//应用,比方查问某个Hotel下status=30的Order$hotel = Hotel::with(['orders' => function ($query) {        $query->where('status', 30);    }])->find(4);

对立异样解决

这个能够参见之前的文章Laravel 对立错误处理为 JSON

队列

失败队列入库

  • 生成表

生成failed_jobs表

php artisan queue:failed-tablephp artisan migrate
  • 独自解决

能够在Job中独自解决失败,Job失败也会写入下面生成的failed_jobs表

/*** 工作失败的处理过程** @param  Exception  $exception* [@return](https://learnku.com/users/31554) void*/public function failed(Exception $exception){    // 解决}

重试队列

有时候代码有破绽可能会有队列执行失败的情况,这时候咱们就须要重试。

  • 查看所有失败
php artisan queue:failed
  • 重试所有失败
php artisan queue:retry all
  • 重试单个失败
php artisan queue:retry 13
  • 清空失败(重要的队列数据万不可这么操作)
php artisan queue:flush

另外,手动去操作的确不太不便,你能够设置个cron,定时重试所有失败,但务必要留神音讯揭示,免得队列始终重试始终失败,往返运行,影响了失常的队列性能。

其余罕用代码

文件上传OSS

<?phpnamespace App\Http\Controllers;use Illuminate\Http\Request;use Controller;use Illuminate\Support\Facades\Storage;use Illuminate\Support\Facades\Validator;use OSS\OssClient;use OSS\Core\OssException;class UploadController extends Controller{    public function index(Request $request)    {        $file = $request->file('file');        if ($file->isValid()) {            $ext = $file->getClientOriginalExtension();            $realPath = $file->getRealPath();            $filepath = config('app.env').'/' . md5(uniqid('', true));            $result = $this->uploadOss($realPath, $filepath.".".$ext);            if ($result['code']) {                return response(['code' => 2, 'msg' => $result['msg']]);            } else {                return response(['code' => 0, 'msg' => '上传胜利', 'data' => [                    'filepath' => $result['data']['url'],                    'data' => $request->all()                ]]);            }        }    }    /**     * 上传oss     * @param $filePath  以后门路     * @param $object   预约义文件名,可含文件夹     * [@return](https://learnku.com/users/31554) array     */    public function uploadOss($filePath, $object)    {        $accessKeyId = config('filesystems.disks')[config('filesystems.default')]['access_key'];        $accessKeySecret = config('filesystems.disks')[config('filesystems.default')]['secret_key'];        $endpoint = config('filesystems.disks')[config('filesystems.default')]['endpoint'];        $bucket= config('filesystems.disks')[config('filesystems.default')]['bucket'];        $url = config('filesystems.disks')[config('filesystems.default')]['host'];        try{            $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);            $ossClient->uploadFile($bucket, $object, $filePath);            return [                'code' => 0,                'data' => [                    'url' => $url.'/'.$object                ]            ];        } catch(OssException $e) {            return [                'code' => 1,                'msg' => $e->getMessage()            ];        }    }}// -------// 配置'oss' => [  'driver' => 'oss',  'root' => '',  'access_key' => env('OSS_ACCESS_KEY'),  'secret_key' => env('OSS_SECRET_KEY'),  'endpoint' => env('OSS_ENDPOINT'), // 应用 ssl 这里设置如: https://oss-cn-beijing.aliyuncs.com  'bucket' => env('OSS_BUCKET'),  'isCName' => env('OSS_IS_CNAME', false), // 如果 isCname 为 false,endpoint 应配置 oss 提供的域名如:`oss-cn-beijing.aliyuncs.com`,否则为自定义域名,,cname 或 cdn 请自行到阿里 oss 后盾配置并绑定 bucket  'host' => env('OSS_HOST', '')],

json输入

protected static $code = 0;protected static $msg = 'ok';public function response($data = [], $msg = '', $code = 0){    if (is_null($data)) {        $data = new \stdClass();    }    return response()->json([        'code' => $code? $code : self::$code,        'msg' => $msg? $msg : self::$msg,        'data' => $data,    ], 200);}

过程锁

  • 一般版本
// $autoDel字段删除,$ttl 过期工夫,秒public function  processLock($key, $autoDel = true, $ttl = 60){    $key = 'processLock:'.$key;    // 不同版本或redis扩大,会有稍微不同,自行调整下代码即可    if (Redis::Command('set', [$key, 1, 'EX', $ttl, 'NX'])) {        if ($autoDel) {            register_shutdown_function(function () use ($key) {                Redis::del($key);            });        }                return true;    }    return false;}
  • lua版本
    public function getScript()    {        return <<<LUA        local ret = redis.call("setnx", KEYS[1], ARGV[1])        if ret == 1 then            return redis.call("expire", KEYS[1], ARGV[2])        else            return 0        endLUA;    }    public function processLock($key, $autoDel = true, $ttl = 60)    {        if (Redis::eval($this->getScript(), 1, $key, 1, $ttl)) {            if ($autoDel) {                register_shutdown_function(function () use ($key) {                    Redis::del($key);                });            }                        return true;        }        return false;    }

阐明:Redis::eval行第一个1示意key的数量,是为了辨别KEYS和ARGV。

JWT

Laravel 配合 jwt 应用

零碎告诉到钉钉

咱们能够应用队列,把一些重要的告诉投到钉钉,次要代码如下:

<?phpnamespace App\Jobs;use Illuminate\Bus\Queueable;use Illuminate\Contracts\Queue\ShouldQueue;use Illuminate\Foundation\Bus\Dispatchable;use Illuminate\Queue\InteractsWithQueue;use Illuminate\Queue\SerializesModels;use Illuminate\Support\Facades\Log;use GuzzleHttp\Client;class SystemNotify implements ShouldQueue{    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;    private $title;    private $content;    private $type;    private $robot;    const DD_URL = 'https://oapi.dingtalk.com';    /**     * Create a new job instance.     *     * @param $title     * @param string $content     * @param string $type text, markdown     * @param int $robot     */    public function __construct($title, $content = '', $type = 'markdown', $robot = 1)    {        // 独自应用SystemNotify队列        $this->queue = 'SystemNotify';        $this->title = $title;        $this->content = $content;        $this->type = $type;        $this->robot = $robot;    }    /**     * Execute the job.     *     * @return void     */    public function handle()    {        // 能够不应用关键字,倡议钉钉机器人应用IP段设置,更为平安        switch ($this->type){            case 'markdown':                $params = [                    'msgtype' => $this->type,                    $this->type => [                        'title' => $this->title.'[关键字]',                        'text' => $this->content                    ]                ];                break;            default:                $params = [                    'msgtype' => $this->type,                    $this->type => [                        'content' => $this->content.'[关键字]',                    ]                ];                break;        }        $params = json_encode($params, JSON_UNESCAPED_UNICODE);        $uri = self::URL_MAPPING[$this->robot];        $this->getClient()->request('POST', $uri, [            'headers' => [                'Content-Type' => 'application/json;charset=utf-8'            ],            'body' => $params        ]);    }    // 对应不同的钉钉群告诉,批改access_token参数即可    const URL_MAPPING = [        1 => '/robot/send?access_token=@1',        2 => '/robot/send?access_token=@2'    ];    public function getClient()    {        return new Client([            'base_uri' => 'https://oapi.dingtalk.com',            'timeout'  => 30,            'verify' => false        ]);    }}

阐明:告诉内容能够自定义,增加智能机器人操作比较简单就不赘述了

  • 钉钉文档

后盾操作日志

利用 Laravel 中间件给后盾加个操作日志

Excel

Laravel6 配合 MaatwebsiteExcel 实现 Excel 导入

Laravel6 配合 MaatwebsiteExcel 实现 Excel 导出

陆续补充中...