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 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

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