이 글에서 공유한 내용은 Laravel 파이프라인에 대한 심층 분석(코드)입니다. 도움이 필요한 친구들이 참고할 수 있습니다.
기본적으로 laravel 파이프라인을 사용하여 객체를 여러 클래스에 전달하여 체인 작업을 기반으로 모든 유형의 작업을 수행하고 모든 "작업"이 완료된 후 최종 결과를 한 번에 반환할 수 있습니다.
관리 작동 방식에 대한 가장 일반적인 예는 프레임워크 자체의 구성 요소 내에서 사용하는 것입니다. 여기서 말하는 것은 "미들웨어"입니다.
미들웨어는 애플리케이션으로 전송된 HTTP 요청을 필터링하는 편리한 메커니즘을 제공합니다...
기본 미들웨어 예는 다음과 같습니다.
<?php namespace App\Http\Middleware; use Closure; class TestMiddleware { /** * 处理请求 * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { // 在这里加入你的代码 return $next($request); } }
이러한 "미들웨어"는 실제로 실행에 필요한 작업을 처리하기 위해 들어오는 요청을 받아들이는 파이프입니다. 여기서 현재 수락된 요청이 HTTP 요청인지, JSON 요청인지, 사용자 인증인지 여부를 감지할 수 있습니다.
IlluminateFoundationHttpKernel 클래스를 잠깐 살펴보면 Pipeline 개체 내에서 미들웨어가 어떻게 실행되는지 확인할 수 있습니다.
/** * 将请求传入到指定的 中间件/路由。 * @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()); }
이 코드에서 볼 수 있듯이 파이프라인 인스턴스는 요청을 미들웨어 세트에 보내고 이를 라우터에 배포합니다.
이 코드가 다소 혼란스러워도 걱정하지 마세요. 몇 가지 예를 들어 관련 개념을 설명하겠습니다.
이 시나리오를 고려해보세요. 사용자가 주제를 만들고 메시지를 남길 수 있는 포럼 시스템을 만들어야 합니다. 하지만 클라이언트에서는 태그를 생성하거나 편집할 때 태그를 자동으로 삭제하도록 요구합니다.
당신이 해야 할 일은 다음과 같습니다:
텍스트의 링크 태그를 바꾸세요.
민감한 단어를 바꾸려면 "*"를 사용하세요.
텍스트에서 스크립트 태그를 제거하세요.
아마도 결국 이러한 "작업"을 처리하기 위해 관련 클래스를 만들게 될 것입니다.
$pipes = [ RemoveBadWords::class ReplaceLinkTags::clas RemoveScriptTags::class ];
우리가 해야 할 일은 "콘텐츠"를 각 작업에 차례로 전달한 다음 이전 작업의 처리 결과를 다음 작업에 전달하는 것입니다. 파이프를 사용하여 이 작업을 처리할 수 있습니다.
public function create(Request $request) { $pipes = [ RemoveBadWords::class, ReplaceLinkTags::class, RemoveScriptTags::class ]; $post = app(Pipeline::class) ->send($request) ->through($pipes) ->then(function ($content) { return Post::create(['content' => $content]); }); // 返回响应 }
각 "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) { // 在这里处理任务,返回待更新的 **$content** 给到下一个管道任务。 return $next($content); } }
작업을 처리하는 데 사용되는 메서드는 두 개의 매개 변수를 받습니다. 첫 번째는 통과 가능한 객체인 경우, 두 번째 객체는 마지막 파이프라인을 실행한 후 객체가 리디렉션될 클로저입니다.
메서드 이름을 사용자 정의하여 "핸들" 메서드 이름을 대체할 수도 있습니다. 그런 다음 파이프에서 사용할 메서드 이름을 다음과 같이 지정해야 합니다.
app(Pipeline::class) ->send($content) ->through($pipes) ->via('customMethodName') // <---- 就是这个 :) ->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]); });
이러한 유형의 문제를 처리하는 방법에는 여러 가지가 있다는 점을 기억하세요. 선택 방법은 귀하에게 달려 있습니다. 하지만 필요할 때 이미 구축된 지식 기반에 이 새로운 무기에 대한 지식이 있다는 사실을 기쁘게 생각합니다.
이 예제를 통해 "Laravel Pipelines"에 대한 더 깊은 이해와 사용법을 알 수 있기를 바랍니다.
작동 방식에 대해 더 알고 싶다면 laravel api 문서를 확인해 보세요.
관련 권장 사항:
Laravel Docker 개발 환경을 직접 구축하는 방법
위 내용은 Laravel 파이프라인(코드) 심층 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!