[靈性程式設計]函式委託,自動事件

selden發表於2021-05-28

一直想寫點技術部落格,又沒有特別想寫的,太過簡單的動態一搜一大推,太複雜的自己都沒搞懂,只有寫寫技巧了。。。

庫地址: github.com/ctfang/laravel-watch

函式委託執行,特別適用於擴充套件業務時又不需要侵入原有程式碼。

composer require ctfang/laravel-watch

如果使用Phpstorm, 可以安裝擴充套件 PHP Annotations 方便提示。

在app目錄下任意類的函式註釋上加 @Watch(test::class,"func") 就會自動經過 test->func

1。先設計一個場景,一個登陸需求。
原來程式碼是這樣的,只實現了登陸功能,成功返回使用者資訊。

<?php


namespace App\Http\Controllers\User;


use Illuminate\Http\Request;

class LoginController
{
    public function login(Request $request)
    {
        // 登陸成功
        return ['request' => $request , 'user_id' => 1];
    }
}

2。需求有變動,需要加上登陸流水、登陸途徑和流失記錄(登陸失敗也記錄)

新增邏輯類 LoginLogic, 實現邏輯

<?php


namespace App\Logics\User;


use Ctfang\LaravelWatch\Context;

class LoginLogic
{
    /**
     * 記錄上傳引數
     * @param  \Ctfang\LaravelWatch\Context  $context
     * @param  \Closure  $next
     * @return mixed
     */
    public function watchLogin(Context $context, \Closure $next)
    {
        /** @var \Illuminate\Http\Request $request 輸入引數獲取 */
        $request = $context->getInput('request');

        // 邏輯處理

        // 途徑處理完後再登陸
        return $next($context);
    }

    /**
     * 記錄登陸日記
     * @param  \Ctfang\LaravelWatch\Context  $context
     * @param  \Closure  $next
     * @return mixed
     */
    public function loginLog(Context $context, \Closure $next)
    {
        // 登陸成功後才記錄流失
        $response = $next($context);
        $userId   = $response['user_id'];

        // 記錄邏輯

        return $response;
    }
}

修改 LoginController 檔案新增註釋程式碼, 注意註釋的類使用也是要use進來的

<?php


namespace App\Http\Controllers\User;


use Illuminate\Http\Request;
use Ctfang\LaravelWatch\Annotations\Watch;
use App\Logics\User\LoginLogic;

class LoginController
{
    /**
     * @Watch(LoginLogic::class,"watchLogin")
     * @Watch(LoginLogic::class,"loginLog")
     */
    public function login(Request $request)
    {
        return ['request' => $request , 'user_id' => 1];
    }
}

為了更方便委託,logic類必須需要make方式或者laravel注入方式例項類

例如一個檢視使用者info的函式需要代理,controller 函式需要這樣子寫,LoginLogic需要注入或者app('LoginLogic')

    public function info(Request $request, LoginLogic $logic)
    {
        $userId = $request->input('user_id');

        return ['user' => $logic->info($userId)];
    }

info的函式程式碼


    /**
     * @Watch(LoginLogic::class,'infoWatch')
     */
    public function info(int $id)
    {
        return [];
    }

    public function infoWatch(Context $context, \Closure $next)
    {
        $id = $context->getInput('id');

        echo "玩家被讀取" . $id;
    }
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章