>  기사  >  백엔드 개발  >  Laravel 파이프라인(코드) 심층 분석

Laravel 파이프라인(코드) 심층 분석

不言
不言원래의
2018-07-23 11:55:441312검색

이 글에서 공유한 내용은 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());
}

이 코드에서 볼 수 있듯이 파이프라인 인스턴스는 요청을 미들웨어 세트에 보내고 이를 라우터에 배포합니다.

이 코드가 다소 혼란스러워도 걱정하지 마세요. 몇 가지 예를 들어 관련 개념을 설명하겠습니다.

여러 작업을 실행해야 하는 수업을 진행하는 중

이 시나리오를 고려해보세요. 사용자가 주제를 만들고 메시지를 남길 수 있는 포럼 시스템을 만들어야 합니다. 하지만 클라이언트에서는 태그를 생성하거나 편집할 때 태그를 자동으로 삭제하도록 요구합니다.

당신이 해야 할 일은 다음과 같습니다:

  1. 텍스트의 링크 태그를 바꾸세요.

  2. 민감한 단어를 바꾸려면 "*"를 사용하세요.

  3. 텍스트에서 스크립트 태그를 제거하세요.

아마도 결국 이러한 "작업"을 처리하기 위해 관련 클래스를 만들게 될 것입니다.

$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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.