Laravel常用程式碼合集

sai0556發表於2020-08-30

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

關聯查詢

  • 一對一

    // 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);
  • 一對多

    //Model
    class Good extends Model
    {
      /**
       * 商品所屬分類
       * [@return](https://learnku.com/users/31554) \Illuminate\Database\Eloquent\Relations\BelongsTo
       */
      public function category()
      {
          return $this->belongsTo(Category::class);
      }
    }
    //使用
    $category = Category::with(['goods' => function ($query) {
          $query->where('is_sale', true);
      }])->find($categoryId);

這個可以參見之前的文章Laravel 統一錯誤處理為 JSON

失敗佇列入庫

  • 生成表
    生成failed_jobs表

    php artisan queue:failed-table
    php 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

<?php

namespace 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;
}

JWT

Laravel 配合 jwt 使用

後臺操作日誌

利用 Laravel 中介軟體給後臺加個操作日誌

Excel

Laravel6 配合 Maatwebsite\Excel 實現 Excel 匯入

後續繼續陸續補充中…

本作品採用《CC 協議》,轉載必須註明作者和本文連結
收藏前不妨點個贊試試!!! 分享開發知識,歡迎交流。qq交流群:965666112,公眾號:愛好歷史的程式設計師。 點選直達個人部落格

相關文章