>PHP 프레임워크 >Laravel >Laravel 파이프라인 해석

Laravel 파이프라인 해석

藏色散人
藏色散人앞으로
2021-06-21 17:06:032182검색

다음은 laravel튜토리얼 칼럼에 나온 Laravel Pipeline에 대한 설명입니다. 도움이 필요한 친구들에게 도움이 되길 바랍니다!

안녕하세요 여러분, 오늘은 라라벨 프레임워크의 파이프라인을 소개하겠습니다.
코드 구조를 매우 명확하게 만들어주는 매우 사용하기 쉬운 컴포넌트입니다. Laravel의 미들웨어 메커니즘은 이를 기반으로 구현됩니다.

파이프라인을 통해 APO 프로그래밍을 쉽게 구현할 수 있습니다.

공식 GIT 주소

https://github.com/illuminate/pipeline

다음 코드는 제가 구현한 단순화된 버전입니다.

class Pipeline
{

    /**
     * The method to call on each pipe
     * @var string
     */
    protected $method = 'handle';

    /**
     * The object being passed throw the pipeline
     * @var mixed
     */
    protected $passable;

    /**
     * The array of class pipes
     * @var array
     */
    protected $pipes = [];

    /**
     * Set the object being sent through the pipeline
     *
     * @param $passable
     * @return $this
     */
    public function send($passable)
    {
        $this->passable = $passable;
        return $this;
    }

    /**
     * Set the method to call on the pipes
     * @param array $pipes
     * @return $this
     */
    public function through($pipes)
    {
        $this->pipes = $pipes;
        return $this;
    }

    /**
     * @param \Closure $destination
     * @return mixed
     */
    public function then(\Closure $destination)
    {
        $pipeline = array_reduce(array_reverse($this->pipes), $this->getSlice(), $destination);
        return $pipeline($this->passable);
    }


    /**
     * Get a Closure that represents a slice of the application onion
     * @return \Closure
     */
    protected function getSlice()
    {
        return function($stack, $pipe){
            return function ($request) use ($stack, $pipe) {
                return $pipe::{$this->method}($request, $stack);
            };
        };
    }

}

이 유형의 주요 논리는 then 및 getSlice 메소드에 있습니다. array_reduce를 통해 하나의 매개변수를 허용하는 익명 함수를 생성한 다음 호출을 실행합니다.

간단한 사용 예

class ALogic
{
    public static function handle($data, \Clourse $next)
    {
        print "开始 A 逻辑";
        $ret = $next($data);
        print "结束 A 逻辑";
        return $ret;
    }
}

class BLogic
{
    public static function handle($data, \Clourse $next)
    {
        print "开始 B 逻辑";
        $ret = $next($data);
        print "结束 B 逻辑";
        return $ret;
    }
}

class CLogic
{
    public static function handle($data, \Clourse $next)
    {
        print "开始 C 逻辑";
        $ret = $next($data);
        print "结束 C 逻辑";
        return $ret;
    }
}
$pipes = [
    ALogic::class,
    BLogic::class,
    CLogic::class
];

$data = "any things";
(new Pipeline())->send($data)->through($pipes)->then(function($data){ print $data;});
실행 결과:
"开始 A 逻辑"
"开始 B 逻辑"
"开始 C 逻辑"
"any things"
"结束 C 逻辑"
"结束 B 逻辑"
"结束 A 逻辑"

AOP 예

AOP의 장점은 다른 레벨에 영향을 주지 않고 동적으로 기능을 추가할 수 있다는 점이며, 기능을 추가하거나 삭제하는 것이 매우 편리할 수 있습니다.

rreee

위 내용은 Laravel 파이프라인 해석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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