在社群看到Laravel中介軟體,管道之面向切面程式設計,介紹了中介軟體實現原理。主要的實現就兩個函式:
call_user_func() 把第一個引數作為回撥函式呼叫
array_reduce() 用回撥函式迭代地將陣列簡化為單一的值
單看手冊這兩個函式都很簡單,我也都知道。對call_user_func()
理解就停留在既然知道函式名,直接呼叫就行了,何必要引數傳入作為回撥函式呼叫,這不是多此一舉麼?array_reduce()
無非就是能拼接個字串或者求個和,拼接字串我可以用implode()
實現,複雜點還可以迭代陣列實現,求和array_sum()
就能完成了。看完文章才發現原來還能這麼用,還是得多學多看啊。
想到Express也是有中介軟體的,試著寫了下js的實現。
function VerfiyCsrfToekn(next){
console.log('驗證csrf Token');
next();
}
function VerfiyAuth(next){
console.log('驗證是否登入');
next();
}
function SetCookie(next){
next();
console.log('設定cookie資訊!');
}
const pipe_arr = [
'VerfiyCsrfToekn',
'VerfiyAuth',
'SetCookie',
];
const callback = pipe_arr.reduce(function(stack,pipe){
return `function(){${pipe}(${stack})}`
},function(){
console.log('當前要執行的程式');
});
console.log(eval(`(${callback})()`));
本作品採用《CC 協議》,轉載必須註明作者和本文連結