【发布时间】:2023-03-18 17:05:01
【问题描述】:
我正在使用 Laravel 6.9.0。这是我的付款控制器:
class PaymentController extends Controller
{
public function __construct(){
$this->middleware('payment.test');
$this->middleware('payment.check');
}
public function pay(){
$this->payment->pay();
}
public function refund(){
$this->payment->refund();
}
public function checkOrder(){
$this->payment->checkOrder();
}
}
payment.test 中间件执行以下操作:
- 写请求日志
- 检查商家是否存在
- 解密请求
payment.check middlware 用于检查付款方式,例如 applepay 或 googlelpay。
但是从官方文档来看,中间件是用来过滤HTTP请求的, 验证您的应用程序的用户是否已通过身份验证。
看来payment.check 不属于这个。因此,我将payment.check 中间件更改为控制器。因为所有的方法都要检查支付,所以我把它放在了构造函数中。但是,我必须在检查之前解密请求,
所以我的构造函数现在是
$this->middleware('payment.test');
$this->middleware(function ($request, $next) {
$this->checkPayment($request);
return $next($request);
});
checkPayment 看起来像这样:
private function checkPayment($request){
if($request->aaa == 'aaa'){
switch($request->type){
case '001':
$type = 'apple';
break;
case '111':
$type = 'google';
break;
...
}
}else{
switch($request->code){
case 'android':
$type = 'android';
break;
...
}
}
$this->payment = app($type);
}
这让我的控制器很丑。我觉得将它写入中间件看起来更加模块化和清晰。将它写入控制器真的比中间件更好吗?或者有什么其他建议?
【问题讨论】:
-
我猜 $this->payment 是 paymentProvider 的实现?如果有,您是否有一个主接口、抽象类或类似的东西?
-
是的,它是paymetsProvider的实现。我有一个接口和一个抽象类,所有的支付都必须扩展抽象类。
标签: laravel controller middleware