>  기사  >  PHP 프레임워크  >  자세한 설명 및 사례: Laravel 요청의 라이프사이클 소개

자세한 설명 및 사례: Laravel 요청의 라이프사이클 소개

WBOY
WBOY앞으로
2022-02-15 17:27:022390검색

이 글은 laravel의 요청 선언 주기에 대한 관련 지식을 제공합니다. 요청 수명 주기에는 오토로더, 커널, 서비스 제공자, 예약 요청 및 라우팅 등과 같은 다양한 용어가 있습니다. 이 글이 모든 사람에게 도움이 되기를 바랍니다. .

자세한 설명 및 사례: Laravel 요청의 라이프사이클 소개

Laravel은 강력한 PHP 프레임워크입니다. Laravel 프레임워크를 배울 때 Laravel 요청 수명 주기가 가장 좋은 출발점입니다. 이 글에서는 HTTP 요청 수신과 Laravel의 응답 사이에 어떤 일이 일어나는지 소개합니다. 요청 수명주기에 대한 심층적인 연구는 Laravel 구조를 이해하는 데 도움이 됩니다. (Laravel 8 기준)

오토로더, 커널, 서비스 제공자, 디스패치 요청 및 라우팅 등과 같은 요청 수명주기에는 다양한 용어가 있습니다. 모든 용어를 자세히 이해하면 프레임워크에 대한 더 많은 이해를 갖게 되며 원하는 대로 다양한 기능으로 확장할 수 있습니다.

Laravel 请求生命周期

Laravel 요청 수명 주기 개요

첫 번째 단계

프로젝트 종속성을 로드하고 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[&#39;APP_BASE_PATH&#39;] ?? 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 内核还是 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/Providersrrreee

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.phpproviders 배열에 있습니다. 🎜🎜Laravel은 이 공급자 목록을 반복하고 각 공급자를 인스턴스화합니다. 공급자가 인스턴스화되면 모든 공급자에서 register 메서드가 호출됩니다. 그런 다음 모든 공급자가 등록되면 각 공급자에서 boot 메서드가 호출됩니다. 🎜🎜서비스 제공자는 데이터베이스, 대기열, 유효성 검사 및 라우팅 구성 요소와 같은 프레임워크의 모든 다양한 구성 요소를 부트스트랩할 책임이 있습니다. 기본적으로 Laravel이 제공하는 모든 주요 기능은 서비스 제공자에 의해 부트스트랩되고 구성됩니다. 서비스 제공자는 부트스트래핑 및 구성 프레임워크에서 제공하는 많은 기능으로 인해 전체 Laravel 부트스트래핑 프로세스에서 가장 중요한 부분입니다. 🎜🎜어떠한 서비스 제공자에서 boot 메소드를 호출하기 전에 각 서비스 제공자의 등록 메소드가 호출되는 이유가 궁금할 것입니다. 대답은 간단합니다. 각 서비스 제공자의 등록 메소드를 먼저 호출함으로써 서비스 제공자는 부트 메소드가 실행될 때 등록되고 사용 가능한 각 컨테이너 바인딩에 의존할 수 있습니다. 🎜🎜서비스 제공자는 Laravel 애플리케이션을 부트스트랩하는 핵심입니다. 애플리케이션 인스턴스가 생성되고, 서비스 공급자가 등록되며, 요청이 부트스트래핑 애플리케이션으로 전달됩니다. 정말 간단해요! 🎜🎜Laravel 애플리케이션이 어떻게 구축되고 서비스 제공자를 통해 부트스트랩되는지 확실히 이해하는 것은 매우 중요합니다. 애플리케이션의 기본 서비스 제공자는 app/Providers 디렉토리에 저장됩니다. 🎜🎜기본적으로 AppServiceProvider는 비어 있습니다. 이 절차는 애플리케이션의 자체 부트스트랩 및 서비스 컨테이너 바인딩을 추가하기에 좋은 장소입니다. 대규모 애플리케이션의 경우 애플리케이션에서 사용하는 특정 서비스에 대해 각각 더 세부적인 지침을 제공하는 여러 서비스 공급자를 생성할 수 있습니다. 🎜

애플리케이션이 부트스트랩되고 모든 서비스 제공자가 등록 및 부트스트랩되면 요청은 발송을 위해 라우터로 전달됩니다.

Routing

애플리케이션에서 가장 중요한 서비스 제공자 중 하나는 AppProvidersRouteServiceProvider입니다. 이 서비스 제공자는 애플리케이션의 routes 디렉토리에 포함된 경로 파일을 로드합니다. AppProvidersRouteServiceProvider。此服务提供程序加载应用程序的 routes 目录中包含的路由文件。

路由器将请求发送到路由或控制器,并运行任何路由特定的中间件。

中间件为过滤或检查进入应用程序的 HTTP 请求提供了一种方便的机制。例如,Laravel 包含一个这样的中间件,用于验证应用程序的用户是否经过身份验证。如果用户未通过身份验证,中间件将用户重定向到登录页。但是,如果用户经过身份验证,中间件将允许请求进一步进入应用程序。一些中间件被分配给应用程序中的所有路由,比如那些在 HTTP 内核的 $middleware属性中定义的路由,而一些只被分配给特定的路由或路由组。您可以通过阅读完整的 中间件 文档来了解更多关于中间件的信息。

如果请求通过了所有匹配路由分配的中间件,则将 HTTP 请求定向到控制器或通过省略控制器直接返回视图或响应

控制器

控制器 app/Http/Controllers/ 执行特定操作并将数据发送到视图。

视图

视图 resources/views/ 适当地格式化数据,提供 HTTP 响应。

最后

一旦路由或控制器方法返回一个响应,该响应将通过路由的中间件返回,从而使应用程序有机会修改或检查传出的响应。

通常,不会只从路由操作中返回简单的字符串或数组。而是返回完整的 IlluminateHttpResponse 实例或视图。

Response 实例派生自 SymfonyComponentHttpFoundationResponse 类,它提供了许多构造 HTTP 响应的方法。

最后,一旦响应通过中间件传回,HTTP 内核的 handle 方法将返回响应对象,并且index.php

라우터는 요청을 경로나 컨트롤러에 보내고 경로별 미들웨어를 실행합니다.

미들웨어는 애플리케이션에 들어오는 HTTP 요청을 필터링하거나 검사하는 편리한 메커니즘을 제공합니다. 예를 들어, Laravel에는 애플리케이션 사용자가 인증되었는지 확인하는 미들웨어가 포함되어 있습니다. 사용자가 인증되지 않으면 미들웨어는 사용자를 로그인 페이지로 리디렉션합니다. 그러나 사용자가 인증되면 미들웨어는 애플리케이션에 대한 추가 요청을 허용합니다. 일부 미들웨어는 HTTP 커널의 $middleware 속성에 정의된 것과 같이 애플리케이션의 모든 경로에 할당되는 반면 일부는 특정 경로 또는 경로 그룹에만 할당됩니다. 전체 미들웨어 설명서를 읽으면 미들웨어에 대해 자세히 알아볼 수 있습니다.

HTTP 요청을 컨트롤러로 전달하거나 요청이 일치하는 경로

Controller 🎜🎜Controller app/Http/Controllers/에 의해 할당된 모든 미들웨어를 통과하는 경우 컨트롤러를 생략하여 보기 또는 응답을 직접 반환합니다. 특정 작업을 수행하고 데이터를 뷰로 보냅니다. 🎜🎜Views🎜🎜Views <code>resources/views/ 데이터 형식을 적절하게 지정하여 HTTP 응답을 제공합니다. 🎜🎜마지막으로🎜🎜경로나 컨트롤러 메서드가 응답을 반환하면 해당 응답은 경로의 미들웨어를 통해 반환되어 애플리케이션이 나가는 응답을 수정하거나 검사할 수 있는 기회를 제공합니다. 🎜🎜일반적으로 라우팅 작업에서 단순한 문자열이나 배열만 반환하지는 않습니다. 대신 완전한 IlluminateHttpResponse 인스턴스 또는 뷰가 반환됩니다. 🎜🎜Response 인스턴스는 HTTP 응답을 구성하기 위한 다양한 메서드를 제공하는 SymfonyComponentHttpFoundationResponse 클래스에서 파생됩니다. 🎜🎜마지막으로 응답이 미들웨어를 통해 다시 전달되면 HTTP 커널의 핸들 메서드는 응답 개체를 반환하고 index.php 파일은 반환된 응답에 대해 send 메서드를 호출합니다. send 메소드는 응답 내용을 사용자의 웹 브라우저로 보냅니다. 🎜🎜이 시점에서 우리는 전체 Laravel 요청 라이프사이클의 모든 단계를 완료했습니다! 🎜🎜【관련 추천: 🎜laravel 동영상 튜토리얼🎜】🎜

위 내용은 자세한 설명 및 사례: Laravel 요청의 라이프사이클 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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