用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
後臺操作日誌
Excel
Laravel6 配合 Maatwebsite\Excel 實現 Excel 匯入
後續繼續陸續補充中…
本作品採用《CC 協議》,轉載必須註明作者和本文連結
收藏前不妨點個贊試試!!!
分享開發知識,歡迎交流。qq交流群:965666112,公眾號:愛好歷史的程式設計師。
點選直達個人部落格