이 기사는 Laravel의 파이프라인을 이해하고 파이프라인 설계 패러다임에 대해 이야기하는 데 도움이 되기를 바랍니다.
일반적으로 Laravel에서는 파이프를 사용하면 여러 클래스 간에 객체를 원활하게 전달하여 모든 유형의 작업을 수행한 후 결과 값을 반환할 수 있습니다.
다음으로 Laravel 파이프라인에 대해 자세히 알아볼 수 있습니다.
파이프라인이 실행되는 방식과 관련하여 가장 확실한 예는 실제로 프레임워크 자체에서 가장 일반적으로 사용되는 구성 요소 중 하나입니다. 예, 미들웨어에 대해 이야기하고 있습니다.
미들웨어는 애플리케이션에 들어오는 HTTP 요청을 필터링하기 위한 편리한 메커니즘을 제공합니다.
기본 미들웨어는 다음과 같아야 합니다.
<?php namespace App\Http\Middleware; use Closure; class TestMiddleware { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { // Here you can add your code return $next($request); } }
이 "미들웨어"는 실제로 필요한 작업을 수행하기 위해 요청이 전송되는 파이프라인입니다. 여기서 요청이 HTTP 요청인지, JSON 요청인지, 인증된 사용자 정보가 있는지 등을 확인할 수 있습니다.
IlluminateFoundationHttpKernel
클래스를 빠르게 살펴보고 싶다면 Pipeline
클래스의 새 인스턴스를 사용하여 미들웨어를 실행하는 방법을 살펴보세요. IlluminateFoundationHttpKernel
类, 你将看到如何使用 Pipeline
类的新实例来执行中间件。
/** * Send the given request through the middleware / router. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ protected function sendRequestThroughRouter($request) { $this->app->instance('request', $request); Facade::clearResolvedInstance('request'); $this->bootstrap(); return (new Pipeline($this->app)) ->send($request) ->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware) ->then($this->dispatchToRouter()); }
你可以在代码中看到类似的内容:通过中间件列表发送请求的新管道,然后发送路由。
如果这让你看起来有点不知所措也不用担心。让我们试着用以下这个例子来阐明这个概念。
让我们来看一种场景。 比方说,你建立了一个人们可以发帖并发表评论的论坛。但是,您的用户请求您自动删除标签或在创建时在每一个内容上编辑标签。
此时你被要求做的事情如下:
用纯文本替换链接标记;
用“*”替换敏感词;
从内容中完全删除脚本标记。
可能你最终会创建类来处理这些 “tasks”。
$pipes = [ RemoveBadWords::class ReplaceLinkTags::class RemoveScriptTags::class ];
我们要做的是将给定的“内容”传递给每个任务,然后将结果返回给下一个任务。我们可以使用pipeline来做到这一点。
<?php public function create(Request $request) { $pipes = [ RemoveBadWords::class, ReplaceLinkTags::class, RemoveScriptTags::class ]; $post = app(Pipeline::class) ->send($request->content) ->through($pipes) ->then(function ($content) { return Post::create(['content' => 'content']); }); // return any type of response }
每个“task”类应该有一个“handle”方法来执行操作。也许每个类都有统一的约束是一个不错的选择:
<?php namespace App; use Closure; interface Pipe { public function handle($content, Closure $next); }
命名是个困难的事情 ¯_(ツ)_/¯
<?php namespace App; use Closure; class RemoveBadWords implements Pipe { public function handle($content, Closure $next) { // Here you perform the task and return the updated $content // to the next pipe return $next($content); } }
用于执行任务的方法应该接收两个参数,第一个参数是合格的对象,第二个参数是当前操作处理完后会接管的下一个闭包(匿名函数)。
您可以使用自定义方法名称而不是“handle”。然后你需要指定pipeline要使用的方法名称,比如:
app(Pipeline::class) ->send($content) ->through($pipes) ->via('customMethodName') // <---- This one :) ->then(function ($content) { return Post::create(['content' => $content]); });
提交的内容将会被各个$pipes
$post = app(Pipeline::class) ->send($request->all()) ->through($pipes) ->then(function ($content) { return Post::create(['content' => $content]); });
콘텐츠에서 스크립트 태그를 완전히 제거하세요.
링크 태그를 일반 텍스트로 바꾸세요.
" *" 사용 민감한 단어 바꾸기
아마도 이러한 "작업"을 처리하기 위해 클래스를 만들게 될 것입니다. rrreee
우리가 원하는 것은 주어진 "콘텐츠"를 각 작업에 전달하고 그 결과를 다음 작업에 반환하는 것입니다. 이를 위해 파이프라인을 사용할 수 있습니다. 🎜rrreee🎜모든 "task" 클래스에는 작업을 수행하기 위한 "handle" 메서드가 있어야 합니다. 아마도 각 클래스에 대해 통일된 제약 조건을 갖는 것이 좋은 선택이 될 것입니다. 🎜rrreee🎜🎜🎜이름 지정은 어려운 일입니다. ̅_(ツ)_/̅🎜🎜🎜rrreee🎜 작업을 수행하는 데 사용되는 메서드는 두 개의 매개 변수를 받아야 합니다. 첫 번째 매개변수는 정규화된 객체이고, 두 번째 매개변수는 현재 작업이 처리된 후 인계받을 다음 클로저(익명 함수)입니다. 🎜🎜"handle" 대신 사용자 정의 메소드 이름을 사용할 수 있습니다. 그런 다음 다음과 같이 파이프라인에서 사용할 메서드 이름을 지정해야 합니다.🎜rrreee$pipes
별로 처리되며, 처리된 결과는 저장됩니다. 🎜rrreee🎜🎜🎜에필로그🎜🎜🎜🎜 이러한 유형의 문제를 해결하는 방법에는 여러 가지가 있다는 점을 기억하세요. 어떻게 선택하느냐는 본인의 선택에 달려있습니다. 필요할 때 이 도구를 사용할 수 있다는 점만 알아두세요. 이 예를 통해 "Laravel 파이프라인"과 이를 사용하는 방법을 더 잘 이해할 수 있기를 바랍니다. 더 알고 싶거나 더 알고 싶다면 Laravel의 API 문서를 확인하세요🎜laravel.com/api/5.4/Illuminate/Pip...🎜🎜🎜🎜원본 주소: https://medium.com/@jeffochoa/understanding -laravel-pipelines-a7191f75c351🎜🎜번역 주소: https://learnku.com/laravel/t/7543/pipeline-pipeline-design-paradigm-in-laravel🎜🎜🎜[관련 권장 사항: 🎜laravel 비디오 튜토리얼🎜]🎜
위 내용은 한 기사를 통해 Laravel의 파이프라인에 대해 알아보세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!