Laravel의 미들웨어는 어떻게 구현되나요? 이 글은 주로 라라벨 미들웨어의 구현 원리를 소개하고, 라라벨 미들웨어의 개념, 원리, 관련 방법, 활용 기술 등을 좀 더 자세히 분석하여 도움이 필요한 친구들이 참고할 수 있습니다. 그것이 모두에게 도움이 되기를 바랍니다.
상세 내용은 다음과 같습니다.
#1 미들웨어란?
웹 애플리케이션의 경우 요청이 실제로 처리되기 전에 더 깊은 수준으로 전달되기 전에 요청에 대해 다양한 판단을 내릴 수 있습니다. 그리고 만약 if else를 이렇게 사용하게 되면, 한번 더 많은 조건을 판단해야 하게 되고, 코드 유지 관리가 더 어려워지게 되고, 시스템 간의 결합도가 높아지게 되는데, 미들웨어가 이 문제를 해결할 수 있습니다. 이러한 판단을 미들웨어로 분리하여 요청을 쉽게 필터링할 수 있습니다.
#2 Laravel의 미들웨어
Laravel에서 미들웨어의 구현은 실제로 IlluminatePipelinePipeline 클래스의 구현에 의존합니다. 먼저 미들웨어를 트리거하는 코드를 살펴보겠습니다. 매우 간단합니다. 처리 후 요청을 클로저로 전송한 다음 계속 전달하면 됩니다.
public function handle($request, Closure $next) { //do something for $request return $next($request); }
#3 미들웨어 내부 구현
위에서 언급한 것처럼 미들웨어는 Pipeline으로 구현되며, 해당 호출은 IlluminateRoutingRouter
return (new Pipeline($this->container)) ->send($request) ->through($middleware) ->then(function ($request) use ($route) { return $this->prepareResponse( $request, $route->run($request) ); });
에서 이루어집니다. 미들웨어 실행 프로세스에서는 세 가지 메소드를 호출하는 것을 볼 수 있습니다. 이 세 가지 메소드의 코드를 살펴보겠습니다.
send 메소드
public function send($passable){ $this->passable = $passable; return $this; }
사실 send 메소드는 미들웨어에서 파이프라인이 필요한 객체를 설정하는 역할만 합니다. 사례.
through method
public function through($pipes){ $this->pipes = is_array($pipes) ? $pipes : func_get_args(); return $this; }
through 메소드 역시 매우 간단하며, 수행해야 할 미들웨어 처리를 설정하는 것입니다.
then method
정말 이해하기 어려운게 바로 여기에 있습니다. Then 메소드 코드는 매우 간단하지만 이해하기 쉽지 않습니다.
public function then(Closure $destination){ //then方法接受一个闭包作为参数,然后经过getInitialSlice包装,而getInitialSlice返回的其实也是一个闭包,如果还不知道什么是闭包先去看PHP文档 $firstSlice = $this->getInitialSlice($destination); //反转中间件数组,主要是利用了栈的特性,用处接下来再说 $pipes = array_reverse($this->pipes); //这个call_user_func先不要看,它其实就是执行了一个array_reduce返回的闭包 return call_user_func( //接下来用array_reduce来用回调函数处理数组,建议先去PHP文档读懂array_reduce的执行原理。其实arrary_reduce什么事情都没干,就是包装闭包然后移交给call_user_func来执行 array_reduce($pipes, $this->getSlice(), $firstSlice), $this->passable ); }
그럼 더 이상은 없습니다. 이렇게 하면 모든 미들웨어가 매우 우아해지지 않나요?
aray_reduce의 두 번째 매개변수에는 함수가 필요하므로 getSlice() 메서드의 소스 코드에 집중하겠습니다.
protected function getSlice(){ return function ($stack, $pipe) { //这里$stack return function ($passable) use ($stack, $pipe) { if ($pipe instanceof Closure) { return call_user_func($pipe, $passable, $stack); } else { list($name, $parameters) = $this->parsePipeString($pipe); return call_user_func_array([$this->container->make($name), $this->method], array_merge([$passable, $stack], $parameters)); } }; }; }
클로저가 클로저를 반환하는 것을 보면 어지러움을 느낄 수도 있습니다. 단순화하기 위해 getSlice()는 함수 A를 반환하고 함수 A는 함수 B를 반환합니다. 왜 두 개의 함수를 반환합니까? 전송 프로세스 중에 객체를 전달하기 위해 $next($request) 를 사용하고 $next($request) 는 클로저가 실행된다는 것을 의미하기 때문에 이 클로저는 함수 A이고 함수 B를 반환합니다. 다음 미들웨어.
코드를 다시 단순화해 보겠습니다.
//这里的$stack其实就是闭包,第一次遍历的时候会传入$firstSlice这个闭包,以后每次都会传入下面的那个function; 而$pipe就是每一个中间件 array_reduce($pipes, function ($stack, $pipe) { return function ($passable) use ($stack, $pipe) { }; }, $firstSlice);
이 코드를 다시 살펴보세요.
//判断是否为闭包,这里就是判断中间件形式是不是闭包,是的话直接执行并且传入$passable[请求实例]和$stack[传递给下一个中间件的闭包],并且返回 if ($pipe instanceof Closure) { return call_user_func($pipe, $passable, $stack); //不是闭包的时候就是形如这样Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode执行 } else { //解析,把名称返回,这个$parameters看了许久源码还是看不懂,应该是和参数相关,不过不影响我们的分析 list($name, $parameters) = $this->parsePipeString($pipe); //从容器中解析出中间件实例并且执行handle方法 return call_user_func_array([$this->container->make($name), $this->method], //$passable就是请求实例,而$stack就是传递的闭包 array_merge([$passable, $stack], $parameters)); }
다른 그림을 살펴보세요.
반사로 인해 모든 반복은 이전 클로저와 실행해야 하는 미들웨어에서 전달됩니다. 스택의 선입후출 방식에 따라 어레이가 전송되므로 미들웨어 3이 먼저 패키징되고 미들웨어 1이 가장 바깥쪽 레이어에 배치됩니다. array_reduce는 미들웨어 코드를 실행하지 않고 미들웨어를 래핑한다는 점을 기억하세요.
이 내용을 보고 나면 array_reduce가 결국 func3을 반환하고 call_user_func(func3,$this->passable)이 실제로
return call_user_func($middleware[0]->handle, $this->passable이라는 것을 이해해야 합니다. ) , func2);
미들웨어의 핸들 코드는
public function handle($request, Closure $next) { return $next($request); }
이것은 return func2($request)와 동일하며 여기의 $request는 이전 미들웨어에서 처리됩니다. 이렇게 Zhengguo 미들웨어 프로세스는 끝났으며, 미들웨어 코드는 결국 가장 바깥쪽의 call_user_func에 의해 실행된다는 점만 기억하세요.
관련 권장사항:
Laravel Optimization Split Routing Files
Laravel은 페이지 매김 플러그인을 사용하여 사용자 정의 페이징을 구현합니다.
laravel은 APP 인터페이스(API)를 작성합니다
위 내용은 Laravel의 미들웨어 구현 방법 살펴보기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

aphpdectionenceindectioncontainerisatoolthatmanagesclassdependencies, 향상 Codemodularity, testability 및 maintainability.itactAsacentralHubForCreatingAndingDinjectingDingingDingingdecting.

대규모 응용 프로그램의 경우 SELLENCIONINGESS (DI)를 선택하십시오. ServicElocator는 소규모 프로젝트 또는 프로토 타입에 적합합니다. 1) DI는 생성자 주입을 통한 코드의 테스트 가능성과 모듈성을 향상시킵니다. 2) Servicelocator는 센터 등록을 통해 서비스를 얻습니다. 이는 편리하지만 코드 커플 링이 증가 할 수 있습니다.

phPapplicationSCanBeoptimizedForsPeedandefficiencyby : 1) ENABLEOPCACHEINPHP.INI, 2) PREPAREDSTATEMENTSWITHPDOFORDATABASEQUERIES 사용

phpeMailValidationInvoLvestHreesteps : 1) formatValidationUsingRegularexpressionsTochemailformat; 2) dnsValidationToErethedomainHasaValidMxRecord; 3) smtpvalidation, theSTHOROUGHMETHOD, theCheckSiftheCefTHECCECKSOCCONNECTERTETETETETETETWERTETWERTETWER

TomakePhPapplicationSfaster, followthesesteps : 1) useopCodeCaching likeOpcachetOrpectipiledScriptBecode.2) MinimizedAtabaseQueriesByUsingQueryCachingandEfficientIndexing.3) leveragephp7 assistorBetterCodeeficiession.4) 구현 전략적 지시

toImprovePhPapplicationSpeed, followthesesteps : 1) enableOpCodeCachingWithApcuTeCeScripteXecutionTime.2) 구현 구현

의존성 주입 (DI)은 명시 적으로 전이적 종속성에 의해 PHP 코드의 테스트 가능성을 크게 향상시킵니다. 1) DI 디퍼 커플 링 클래스 및 특정 구현은 테스트 및 유지 보수를보다 유연하게 만듭니다. 2) 세 가지 유형 중에서, 생성자는 상태를 일관성있게 유지하기 위해 명시 적 표현 의존성을 주입합니다. 3) DI 컨테이너를 사용하여 복잡한 종속성을 관리하여 코드 품질 및 개발 효율성을 향상시킵니다.

DatabaseQuesyOptimizationInphPinVolvesVesstoigiestoInsperferferferferformance.1) SelectOnlyNecessaryColumnstoredAtatatransfer.2) useinDexingTeSpeedUpdatarretieval.3) ubstractOrerEresultSoffRequeries.4) UtilizePreDstatements Offeffi


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

VSCode Windows 64비트 다운로드
Microsoft에서 출시한 강력한 무료 IDE 편집기

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

WebStorm Mac 버전
유용한 JavaScript 개발 도구

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

Eclipse용 SAP NetWeaver 서버 어댑터
Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.