>  기사  >  PHP 프레임워크  >  한 기사를 통해 Laravel의 파이프라인에 대해 알아보세요.

한 기사를 통해 Laravel의 파이프라인에 대해 알아보세요.

青灯夜游
青灯夜游앞으로
2022-11-16 20:49:571701검색

이 기사는 Laravel의 파이프라인을 이해하고 파이프라인 설계 패러다임에 대해 이야기하는 데 도움이 되기를 바랍니다.

한 기사를 통해 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(&#39;request&#39;, $request);
    Facade::clearResolvedInstance(&#39;request&#39;);
    $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([&#39;content&#39; => &#39;content&#39;]);
        });
    // 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(&#39;customMethodName&#39;) // <---- This one :)
 ->then(function ($content) {
     return Post::create([&#39;content&#39; => $content]);
 });

最后产生的效果是什么 ?

提交的内容将会被各个$pipes

$post = app(Pipeline::class)
    ->send($request->all())
    ->through($pipes)
    ->then(function ($content) {
        return Post::create([&#39;content&#39; => $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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제