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'));
}
让我们把这个混乱的东西转换成漂亮的过滤管道。
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'));
}
*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'));
}
}
排序类
在 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'));
}
}
就是这样。
现在,如果我想添加其他过滤器,我需要创建新的类,Published
并在方法中创建这个类through()
,并在类方法中实现过滤器逻辑handle
。
结论
仅为两个过滤器实现管道可能会让人感到不知所措,但对于大量过滤器或任何其他复杂的实现来说,它会更加干净和有益。
清洁过滤器类别
附言:我们可以通过提取基类中的通用代码来清理过滤器类。如果您希望在下一篇文章中重构过滤器类,请在下方留言。
下次再见,
Ahmad