이 글은 laravel의 요청 선언 주기에 대한 관련 지식을 제공합니다. 요청 수명 주기에는 오토로더, 커널, 서비스 제공자, 예약 요청 및 라우팅 등과 같은 다양한 용어가 있습니다. 이 글이 모든 사람에게 도움이 되기를 바랍니다. .
Laravel은 강력한 PHP 프레임워크입니다. Laravel 프레임워크를 배울 때 Laravel 요청 수명 주기가 가장 좋은 출발점입니다. 이 글에서는 HTTP 요청 수신과 Laravel의 응답 사이에 어떤 일이 일어나는지 소개합니다. 요청 수명주기에 대한 심층적인 연구는 Laravel 구조를 이해하는 데 도움이 됩니다. (Laravel 8 기준)
오토로더, 커널, 서비스 제공자, 디스패치 요청 및 라우팅 등과 같은 요청 수명주기에는 다양한 용어가 있습니다. 모든 용어를 자세히 이해하면 프레임워크에 대한 더 많은 이해를 갖게 되며 원하는 대로 다양한 기능으로 확장할 수 있습니다.
프로젝트 종속성을 로드하고 Laravel 애플리케이션 인스턴스를 생성하세요
Laravel 애플리케이션의 모든 요청에 대한 진입점은 public/index.php
입니다. > 문서. 모든 요청은 웹 서버(Apache/Nginx) 구성에 의해 이 파일로 전달됩니다. 해당 index.php 파일에는 많은 코드가 포함되어 있지 않습니다. 대신, 나머지 프레임을 로드하기 위한 시작점이 됩니다. public/index.php
文件。所有请求都由你的 web 服务器(Apache/Nginx)配置定向到此文件。那个 index.php 文件不包含太多代码。相反,它是加载框架其余部分的起点。
# 1、加载项目依赖require __DIR__.'/../vendor/autoload.php'; $app = require_once __DIR__.'/../bootstrap/app.php';
该 index.php
文件将加载 Composer 生成的自动加载器定义,然后从 bootstrap/app.php
中检索 Laravel 应用程序的实例。
bootstrap/app.php:
<?php # 2、创建应用实例 $app = new Illuminate\Foundation\Application( $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__) ); # 3、完成内核绑定 $app->singleton( Illuminate\Contracts\Http\Kernel::class, App\Http\Kernel::class ); $app->singleton( Illuminate\Contracts\Console\Kernel::class, App\Console\Kernel::class ); $app->singleton( Illuminate\Contracts\Debug\ExceptionHandler::class, App\Exceptions\Handler::class ); return $app;
之后,它将引导 Laravel 框架使用并生成应用程序实例。
public/index.php:
# 4、接收请求并响应$kernel = $app->make(Kernel::class);// 处理请求$response = tap($kernel->handle( // 创建请求实例 $request = Request::capture()// 发送响应))->send();$kernel->terminate($request, $response);
一旦应用程序实例生成,传入请求将由内核处理。
接下来,传入请求被发送到 HTTP 内核还是 Console 内核,具体取决于进入应用的请求类型。这两个内核充当所有请求流经的中心位置。现在,让我们只关注 HTTP 内核,它位于 app/Http/Kernel.php
中。
HTTP 内核扩展了 IlluminateFoundationHttpkernel
类,该类定义了一个将在执行请求之前运行的 bootstrappers 数组。这些引导程序用来配置异常处理、配置日志、检测应用程序环境 ,并执行在实际处理请求之前需要完成的其他任务。通常情况下,你不需要在意这些配置。
HTTP 内核还定义了一个 HTTP 中间件列表,所有请求在被应用程序处理之前必须通过这些中间件。这些中间件处理 HTTP 会话的读写、确定应用程序是否处于维护模式、验证 CSRF 令牌等。我们接下来会做详细的讨论。
HTTP 内核的 handle 方法的签名非常简单:它接收 Request 接口并返回 Response 接口。把内核想象成一个代表整个应用程序的大黑匣子。向它提供 HTTP 请求,它将返回 HTTP 响应。
通过配置中间件和其他功能,HTTP 内核还加载服务提供者。
最重要的内核引导操作之一是为应用程序加载 service providers
。应用程序的所有服务提供程序都在 config/app.php
中的 providers
数组。
Laravel 将遍历这个提供者列表并实例化它们中的每一个。实例化提供程序后,将对所有提供程序调用 register
方法。然后,一旦注册了所有提供程序,就会对每个提供程序调用boot
方法。
服务提供者负责引导框架的所有不同组件,如数据库、队列、验证和路由组件。基本上,Laravel 提供的每个主要功能都是由服务提供商引导和配置的。由于它们引导和配置框架提供的许多特性,服务提供者是整个 Laravel 引导过程中最重要的部分。
您可能想知道,为什么在对任何服务提供者调用 boot
方法之前都要调用每个服务提供者的 register 方法。答案很简单。通过首先调用每个服务提供程序的 register 方法,服务提供者可能依赖于在执行 boot 方法时注册并可用的每个容器绑定。
服务提供者是引导 Laravel 应用程序的关键。应用程序实例被创建,服务提供者被注册,请求被交给引导的应用程序。真的就是这么简单!
牢牢掌握 Laravel 应用程序如何通过服务提供商构建和引导是非常有价值的。您的应用程序的默认服务提供者存储在该app/Providers
rrreee
index.php
파일은 Composer가 생성한 오토로더 정의를 로드한 다음 bootstrap/app.php
에서 Laravel 애플리케이션의 인스턴스를 검색합니다. bootstrap/app.php:🎜rrreee🎜그런 다음 Laravel 프레임워크를 부트스트랩하여 애플리케이션 인스턴스를 사용하고 생성합니다. 🎜🎜public/index.php: 🎜rrreee🎜 애플리케이션 인스턴스가 생성되면 들어오는 요청은 커널에 의해 처리됩니다. 🎜🎜HTTP 또는 콘솔 커널🎜🎜다음으로, 애플리케이션으로 들어오는 요청 유형에 따라 들어오는 요청이 HTTP 커널 또는 콘솔 커널로 전송됩니다. 이 두 코어는 모든 요청이 흐르는 중앙 위치 역할을 합니다. 지금은 app/Http/Kernel.php
에 있는 HTTP 커널에만 집중하겠습니다. 🎜🎜HTTP 커널은 요청을 실행하기 전에 실행될 부트스트래퍼 배열을 정의하는 IlluminateFoundationHttpkernel
클래스를 확장합니다. 이러한 부트스트랩은 예외 처리 구성, 로깅 구성, 애플리케이션 환경 감지 및 요청이 실제로 처리되기 전에 완료해야 하는 기타 작업을 수행하는 데 사용됩니다. 일반적으로 이러한 구성에 대해 걱정할 필요가 없습니다. 🎜🎜HTTP 코어는 모든 요청이 애플리케이션에서 처리되기 전에 통과해야 하는 HTTP 미들웨어 목록도 정의합니다. 이러한 미들웨어는 HTTP 세션 읽기 및 쓰기, 애플리케이션이 유지 관리 모드에 있는지 확인, CSRF 토큰 유효성 검사 등을 처리합니다. 이에 대해서는 다음에 자세히 논의하겠습니다. 🎜🎜HTTP 커널 핸들 메소드의 서명은 매우 간단합니다. 요청 인터페이스를 수신하고 응답 인터페이스를 반환합니다. 커널을 전체 애플리케이션을 나타내는 큰 블랙박스로 생각하십시오. HTTP 요청을 하면 HTTP 응답이 반환됩니다. 🎜🎜미들웨어 및 기타 기능을 구성하여 HTTP 커널은 서비스 공급자도 로드합니다. 🎜🎜서비스 제공자🎜🎜가장 중요한 커널 부팅 작업 중 하나는 애플리케이션에 대한 서비스 제공자
를 로드하는 것입니다. 애플리케이션의 모든 서비스 제공자는 config/app.php
의 providers
배열에 있습니다. 🎜🎜Laravel은 이 공급자 목록을 반복하고 각 공급자를 인스턴스화합니다. 공급자가 인스턴스화되면 모든 공급자에서 register
메서드가 호출됩니다. 그런 다음 모든 공급자가 등록되면 각 공급자에서 boot
메서드가 호출됩니다. 🎜🎜서비스 제공자는 데이터베이스, 대기열, 유효성 검사 및 라우팅 구성 요소와 같은 프레임워크의 모든 다양한 구성 요소를 부트스트랩할 책임이 있습니다. 기본적으로 Laravel이 제공하는 모든 주요 기능은 서비스 제공자에 의해 부트스트랩되고 구성됩니다. 서비스 제공자는 부트스트래핑 및 구성 프레임워크에서 제공하는 많은 기능으로 인해 전체 Laravel 부트스트래핑 프로세스에서 가장 중요한 부분입니다. 🎜🎜어떠한 서비스 제공자에서 boot
메소드를 호출하기 전에 각 서비스 제공자의 등록 메소드가 호출되는 이유가 궁금할 것입니다. 대답은 간단합니다. 각 서비스 제공자의 등록 메소드를 먼저 호출함으로써 서비스 제공자는 부트 메소드가 실행될 때 등록되고 사용 가능한 각 컨테이너 바인딩에 의존할 수 있습니다. 🎜🎜서비스 제공자는 Laravel 애플리케이션을 부트스트랩하는 핵심입니다. 애플리케이션 인스턴스가 생성되고, 서비스 공급자가 등록되며, 요청이 부트스트래핑 애플리케이션으로 전달됩니다. 정말 간단해요! 🎜🎜Laravel 애플리케이션이 어떻게 구축되고 서비스 제공자를 통해 부트스트랩되는지 확실히 이해하는 것은 매우 중요합니다. 애플리케이션의 기본 서비스 제공자는 app/Providers
디렉토리에 저장됩니다. 🎜🎜기본적으로 AppServiceProvider는 비어 있습니다. 이 절차는 애플리케이션의 자체 부트스트랩 및 서비스 컨테이너 바인딩을 추가하기에 좋은 장소입니다. 대규모 애플리케이션의 경우 애플리케이션에서 사용하는 특정 서비스에 대해 각각 더 세부적인 지침을 제공하는 여러 서비스 공급자를 생성할 수 있습니다. 🎜애플리케이션이 부트스트랩되고 모든 서비스 제공자가 등록 및 부트스트랩되면 요청은 발송을 위해 라우터로 전달됩니다.
애플리케이션에서 가장 중요한 서비스 제공자 중 하나는 AppProvidersRouteServiceProvider
입니다. 이 서비스 제공자는 애플리케이션의 routes
디렉토리에 포함된 경로 파일을 로드합니다. AppProvidersRouteServiceProvider
。此服务提供程序加载应用程序的 routes
目录中包含的路由文件。
路由器将请求发送到路由或控制器,并运行任何路由特定的中间件。
中间件为过滤或检查进入应用程序的 HTTP 请求提供了一种方便的机制。例如,Laravel 包含一个这样的中间件,用于验证应用程序的用户是否经过身份验证。如果用户未通过身份验证,中间件将用户重定向到登录页。但是,如果用户经过身份验证,中间件将允许请求进一步进入应用程序。一些中间件被分配给应用程序中的所有路由,比如那些在 HTTP 内核的 $middleware
属性中定义的路由,而一些只被分配给特定的路由或路由组。您可以通过阅读完整的 中间件 文档来了解更多关于中间件的信息。
如果请求通过了所有匹配路由分配的中间件,则将 HTTP 请求定向到控制器或通过省略控制器直接返回视图或响应
控制器 app/Http/Controllers/
执行特定操作并将数据发送到视图。
视图 resources/views/
适当地格式化数据,提供 HTTP 响应。
一旦路由或控制器方法返回一个响应,该响应将通过路由的中间件返回,从而使应用程序有机会修改或检查传出的响应。
通常,不会只从路由操作中返回简单的字符串或数组。而是返回完整的 IlluminateHttpResponse
实例或视图。
Response 实例派生自 SymfonyComponentHttpFoundationResponse
类,它提供了许多构造 HTTP 响应的方法。
最后,一旦响应通过中间件传回,HTTP 内核的 handle 方法将返回响应对象,并且index.php
$middleware
속성에 정의된 것과 같이 애플리케이션의 모든 경로에 할당되는 반면 일부는 특정 경로 또는 경로 그룹에만 할당됩니다. 전체 미들웨어 설명서를 읽으면 미들웨어에 대해 자세히 알아볼 수 있습니다. HTTP 요청을 컨트롤러로 전달하거나 요청이 일치하는 경로
Controller 🎜🎜Controllerapp/Http/Controllers/에 의해 할당된 모든 미들웨어를 통과하는 경우 컨트롤러를 생략하여 보기 또는 응답을 직접 반환합니다. 특정 작업을 수행하고 데이터를 뷰로 보냅니다. 🎜🎜Views🎜🎜Views <code>resources/views/
데이터 형식을 적절하게 지정하여 HTTP 응답을 제공합니다. 🎜🎜마지막으로🎜🎜경로나 컨트롤러 메서드가 응답을 반환하면 해당 응답은 경로의 미들웨어를 통해 반환되어 애플리케이션이 나가는 응답을 수정하거나 검사할 수 있는 기회를 제공합니다. 🎜🎜일반적으로 라우팅 작업에서 단순한 문자열이나 배열만 반환하지는 않습니다. 대신 완전한 IlluminateHttpResponse
인스턴스 또는 뷰가 반환됩니다. 🎜🎜Response 인스턴스는 HTTP 응답을 구성하기 위한 다양한 메서드를 제공하는 SymfonyComponentHttpFoundationResponse
클래스에서 파생됩니다. 🎜🎜마지막으로 응답이 미들웨어를 통해 다시 전달되면 HTTP 커널의 핸들 메서드는 응답 개체를 반환하고 index.php
파일은 반환된 응답에 대해 send 메서드를 호출합니다. send 메소드는 응답 내용을 사용자의 웹 브라우저로 보냅니다. 🎜🎜이 시점에서 우리는 전체 Laravel 요청 라이프사이클의 모든 단계를 완료했습니다! 🎜🎜【관련 추천: 🎜laravel 동영상 튜토리얼🎜】🎜위 내용은 자세한 설명 및 사례: Laravel 요청의 라이프사이클 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!