Pipeline 中 thenReturn 和 then 的区别

Overview

我们知道,Laravel 中 Pipeline 其实是一种装饰者模式。我们去看 Pipeline 的源码,会发现有两个方法,thenReturnthen,那么有什么区别吗?

一言以蔽之:

  • 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 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!