中介軟體之 call_user_func 與 array_reduce

柳周侯爺發表於2019-07-03

在社群看到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 協議》,轉載必須註明作者和本文連結
-lzhy

相關文章