一直想寫點技術部落格,又沒有特別想寫的,太過簡單的動態一搜一大推,太複雜的自己都沒搞懂,只有寫寫技巧了。。。
庫地址: 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 協議》,轉載必須註明作者和本文連結