Laravel 中的管道模式

2025-06-04

Laravel 中的管道模式

PP = 管道模式

今天,我们将学习管道模式以及如何在 Laravel 中使用它。您可以点击此处深入了解管道模式。管道模式可以用任何语言以不同的方式实现,但我们将在 PHP Laravel中看到,因为 Laravel 的核心已经使用了这种模式

什么是管道模式

管道模式

管道是一种专门优化的设计模式,用于处理对象的分步更改。想象一下一条装配线,每个步骤都是一个管道,在生产线的末端,你就得到了转换后的对象。

PP 的实现有很多种,但为了便于理解,让我们使用管道模式和 Laravel 实现过滤功能。

例子

假设我们在 Laravel 中构建过滤系统,我们可以通过不同的参数过滤帖子,例如是否处于活动状态,按 ASC 或 DESC 排序。

在实施 PP 之前。

PostController.php

在该index方法中,我们正在执行过滤。



public function index(Request $request)
    {
        $query = Post::query();

        if ($request->has('active')) {
            $query->where('active', $request->input('active'));
        }

       if ($request->has('sort')) {
            $query->orderBy('title', $request->input('sort'));
        }

        /* get filtered data */
        $posts = $query->get();

        return view('demo', compact('posts'));
    }


Enter fullscreen mode Exit fullscreen mode

让我们把这个混乱的东西转换成漂亮的过滤管道。

PostController.php

为了实现管道模式,我们需要进行一些重构。Index方法如下所示



public function index(Request $request)
    {
     $posts = app(Pipeline::class)
            ->send(Post::query())
            ->through([
                \App\Filters\Active::class,
                \App\Filters\Sort::class
            ])
            ->thenReturn()
            ->get();

     return view('demo', compact('posts'));
    }


Enter fullscreen mode Exit fullscreen mode

*send()方法会将您的查询传递给处理方法
*through()方法将参数作为类来传递。简而言之,这是过滤器类的列表
*thenReturn()将返回最终输出。
所有这些都由 Laravel 提供,除了我们需要创建在方法中传递的过滤器类through()

活跃班级

在 app/Filters 命名空间下创建 Active 类。



namespace App\Filters;

use Closure;

class Active
{
public function handle($request, Closure $next)
{
if (! request()->has('active')) {
return $next($request);
}

    return $next($request)->where('active', request()->input('active'));
}
Enter fullscreen mode Exit fullscreen mode

}

Enter fullscreen mode Exit fullscreen mode




排序类

在 app/Filters 命名空间下创建 Active 类。



namespace App\Filters;

use Closure;

class Sort
{
public function handle($request, Closure $next)
{
if (! request()->has('sort')) {
return $next($request);
}

    return $next($request)->orderBy('title', $request->input('sort'));
}
Enter fullscreen mode Exit fullscreen mode

}

Enter fullscreen mode Exit fullscreen mode




就是这样。

现在,如果我想添加其他过滤器,我需要创建新的类,Published并在方法中创建这个类through(),并在类方法中实现过滤器逻辑handle

结论

仅为两个过滤器实现管道可能会让人感到不知所措,但对于大量过滤器或任何其他复杂的实现来说,它会更加干净和有益。

清洁过滤器类别

附言:我们可以通过提取基类中的通用代码来清理过滤器类。如果您希望在下一篇文章中重构过滤器类,请在下方留言。
下次再见,
Ahmad

文章来源:https://dev.to/abrardev99/pipeline-pattern-in-laravel-278p
PREV
5 个让你微笑的开源项目 无代码 FizzBu​​zzEnterpriseEdition
NEXT
React 风格指南 React 风格指南 (2021)