Pipeline 中 thenReturn 和 then 的区别
Overview
我们知道,Laravel 中 Pipeline 其实是一种装饰者模式。我们去看 Pipeline 的源码,会发现有两个方法,thenReturn
和 then
,那么有什么区别吗?
一言以蔽之:
- then 是对将传递的值作为参数,从而计算出结果。例如 Laravel 中间件就是以
request
为参数,经过重重的中间件计算出response
- thenReturn 是将传递的参数进行加工,最后返回加工的结果
案例介绍
then 的案例
可以看我的一个 Pipeline 的使用场景中介绍的使用场景。
thenReturn 的案例
沿用用户贷款的场景(参考:一个 Pipeline 的使用场景),现在我需要将用户将用户的评估值作为用户的属性,最后返回该用户
代码实现
index.php
$user = [
'credit_value' => 100,
'have_car' => true,
'car_value' => 30,
'is_marray' => false,
'have_home' => false,
];
$pipes = [
\App\Service\Credit\PersonalCreditAssess::class,
\App\Service\Credit\MarrayAssess::class,
\App\Service\Credit\HomeAssess::class,
\App\Service\Credit\CarAssess::class,
];
$user = (new Pipeline(app()))
->send($user)
->through($pipes)
->thenReturn();
dd($user);
PersonalCreditAssess
class PersonalCreditAssess
{
public function handle($user, $next)
{
$credit = 0;
if ($user['credit_value'] >= 550) {
$credit = 300;
} elseif ($user['credit_value'] >= 300) {
$credit = 150;
} elseif ($user['credit_value'] >= 100) {
$credit = 50;
} else {
$credit = 0;
}
// 对 user 进行属性添加
if (isset($user['credit'])) {
$user['credit'] += $credit;
} else {
$user['credit'] = $credit;
}
return $next($user);
}
}
MarrayAssess
class MarrayAssess
{
public function handle($user, $next)
{
$credit = 0;
if ($user['is_marray']) {
$credit = 100;
}
if (isset($user['credit'])) {
$user['credit'] += $credit;
} else {
$user['credit'] = $credit;
}
return $next($user);
}
}
HomeAssess
class HomeAssess
{
public function handle($user, $next)
{
$credit = 0;
if ($user['have_home']) {
$credit = 300;
}
if (isset($user['credit'])) {
$user['credit'] += $credit;
} else {
$user['credit'] = $credit;
}
return $next($user);
}
}
….
结果
^ array:6 [
"credit_value" => 100
"have_car" => true
"car_value" => 30
"is_marray" => false
"have_home" => false
"credit" => 350
]
本作品采用《CC 协议》,转载必须注明作者和本文链接