Laravel 8 任務(wù)中間件

2021-07-19 11:00 更新

任務(wù)中間件允許你圍繞排隊(duì)任務(wù)的執(zhí)行封裝自定義邏輯,從而減少了任務(wù)本身的樣板代碼。例如,看下面的 handle 方法,它利用了 Laravel 的 Redis 速率限制特性,允許每 5 秒只處理一個(gè)任務(wù):

/**
 * 執(zhí)行任務(wù)
 *
 * @return void
 */
public function handle()
{
    Redis::throttle('key')->block(0)->allow(1)->every(5)->then(function () {
        info('獲取鎖 ...');

        // 處理任務(wù) ...
    }, function () {
        // 無法獲取鎖 ...

        return $this->release(5);
    });
} 

雖然這段代碼是有效的, 但是 handle 方法的結(jié)構(gòu)卻變得雜亂,因?yàn)樗鼡诫s了 Redis 速率限制邏輯。此外,其他任務(wù)需要使用速率限制的時(shí)候,只能將限制邏輯復(fù)制一次。

我們可以定義一個(gè)處理速率限制的任務(wù)中間件,而不是在 handle 方法中定義速率限制。Laravel 沒有任務(wù)中間件的默認(rèn)位置,所以你可以將任務(wù)中間件放置在你喜歡的任何位置。在本例中,我們將把中間件放在 app/Jobs/Middleware 目錄:

<?php

namespace App\Jobs\Middleware;

use Illuminate\Support\Facades\Redis;

class RateLimited
{
    /**
     * 讓隊(duì)列任務(wù)慢慢執(zhí)行
     *
     * @param  mixed  $job
     * @param  callable  $next
     * @return mixed
     */
    public function handle($job, $next)
    {
        Redis::throttle('key')
                ->block(0)->allow(1)->every(5)
                ->then(function () use ($job, $next) {
                    // 獲取鎖 ...

                    $next($job);
                }, function () use ($job) {
                    // 無法獲取鎖 ...

                    $job->release(5);
                });
    }
} 

正如你看到的,類似于 路由中間件,任務(wù)中間件接收一個(gè)被生成的任務(wù)以及一個(gè)為了任務(wù)被繼續(xù)進(jìn)行而需要被注入的回調(diào)。

在任務(wù)中間件被創(chuàng)建以后,他們可能被關(guān)聯(lián)到通過從任務(wù)的 middleware 方法返回的任務(wù)。這個(gè)方法并不存在于 make:job Artisan 命令搭建的任務(wù)中,所以你需要將它添加到你自己的任務(wù)類的定義中:

use App\Jobs\Middleware\RateLimited;

/**
 * 獲取一個(gè)可以被傳遞通過的中間件任務(wù)
 *
 * @return array
 */
public function middleware()
{
    return [new RateLimited];
} 


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號