Laravel框架 核心构成以及工作方式是怎么样的?

作者 : 超级管理员 本文共9068个字,预计阅读时间需要23分钟 发布时间: 2021-08-4 共200人阅读

laravel 结构核心组成:

1.  服务容器(service container)
2. 服务提供者(service provider)
3. (facades)
4. 契约(contract)

laravel请求生命周期

所有请求的入口文件index.php:

<?php 
//注册composer自动加载器 require __DIR__.'/../bootstrap/autoload.php'; 
//引导程序启动框架,创建服务容器实例 
$app = require_once __DIR__.'/../bootstrap/app.php'; 
//创建kernel处理请求。 
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); 
$response = $kernel->handle( $request = Illuminate\Http\Request::capture() );
 //返回结果 $response->send(); 
$kernel->terminate($request, $response);
Laravel框架_核心构成以及工作方式是怎么样的?
    • 流程

      • 所有请求的起点都是从入口文件index.php开始。
      • 加载composer类加载器 注册composer类加载器,实现文件自动加载。
      • 创建服务容器
      • 创建 http Kernel核心程序 所有的请求都是它来处理。
      • 路由 route 路由分发到相应的控制器
      • 控制器 contrainer 控制逻辑及显示页面
      • 显示页面 view
      初始化服务容器
      • 设置项目基本路径
      • 容器绑定一些基本实例
        app,Container,PackageManifest等。
      • 注册基本服务提供者
        事件服务提供者,日志服务提供者,路由服务提供者。

      初始化完容器之后。会向容器绑定三个重要的实例:
      http/kernel和console/kernel,以及异常处理ExceptionHandler

      http kernels

      创建kernel,初始化,调用handle()方法处理请求。
      http kernels:位于app/Http/Kernel.php,继承Illuminate\Foundation\Http\Kernel class,这个类定义了一些列bootstrappers 。

      bootstrapper

      bootstrappers包括配置,检测应用环境等,这类任务需要在请求处理前进行处理。
      bootstraping 操作最重要的一件事是加载service providers。

      启动引导程序,按顺序启动:

      • LoadEnvironmentVariables::class,
      • //加载环境变量
      • LoadConfiguration::class,
      • //加载配置文件,方便后面引用。
      • HandleExceptions::class,
      • RegisterFacades::class,
      • RegisterProviders::class,
      • BootProviders::class,
      中间件middleware

      这个类还定义了很多中间件,所有的请求都要经过的中间件,例如:http session, csrf token等。

      service provider

      所有的服务提供在在config/app.php文件里providers数组。
      首先,所有的服务提供者调用register()方法。当所有的服务提供者都注册了,那么boot方法启动。
      service providers是启动laravel 应用的关键。创建应用实例,service providers注册,请求递交到启动的应用。
      应用的service providers默认是app/providers目录下。
      AppServiceProvider 是添加启动和服务容器绑定的最佳位置。

      服务容器 Service Container

      Laravel 服务容器是一个用于管理类依赖和执行依赖注入的强大工具。
      依赖注入的本质是:通过构造器或者“setter”方法,将依赖的类注入到类中。
      service container 就是装满服务的容器,我们通过注册(register)服务将服务放到容器里面。在类里面,我们注入依赖的类(要调用的类),然后调用。
      可以简单的理解服务容器其实就是一个全局的数组(或者说类),我们把类的信息放在这个数组里,然后根据需要从这里获取。

      服务提供者 Service Provider

      服务提供者是laravel 应用的启动核心。laravel 的核心服务都是通过服务提供者启动。
      但是,我们所谓的“启动”指的是什么?
      通常,这意味着注册服务,包括注册服务容器绑定、事件监听器、中间件甚至路由。服务提供者是应用配置的中心。服务提供者是应用配置的中心(配置了应用主要的服务)。
      config/app.php的provides数组定义了项目要加载的服务。

      别名静态调用 Facade

      laravel facades 为应用服务容器中的绑定类提供了一个“静态”接口。
      laravel facades 作为服务容器的底层类的‘静态代理。相对于传统静态方法,facades更加简洁和灵活。

      用静态方法的形式来调用方法,使用更简单。但其本质还是创建一个实例,调用实例的方法。
      基于php的动态方法调用(dynamic methods)。

      facades实际被service container解析和管理。

      facades vs helper

      helper方法和facades方法没有本质区别。helper functions的实质是调用底层的类facades方法。

      缺点

      facades 最大的危险是将类的范围蔓延了。类有可能被撑的很大。所以保持类的精简。
      当构建一个第三方包与laravel交互时,最好不用使用facades,而是使用contracts。

      facade工作

      laravel facades是一个类提供方法从容器获取对象。
      所有的facades都继承了”Illuminate\Support\Facades\Facade“类。
      Facade 基类使用__callStatic 魔术方法来延迟调用你的facade从容器解析的对象。
      facade的任何调用都将通过laravel的service实例。
      facade 基类定义了getFacadeAccessor()方法,这个方法返回绑定的服务容器名字。
      当调用facade方法时候,laravel 从service container解析getFacadeAccessor方法中的对象,并运行该对象方法。

      facade默认的服务容器注册

      文件路径:laravel\framework\src\Illuminate\Foundation\Application.php
      在该文件构造方法中调用registerCoreContainerAliases()方法,来注册服务容器的别名。
      例如: ”URL“ facade-》对应“url”服务容器-》 实际类对应“ \Illuminate\Routing\UrlGenerator”

    • Facade实际引用的实际类对照

      Facade Class Service Container Binding
      App Illuminate\Foundation\Application app
      Artisan Illuminate\Contracts\Console\Kernel artisan
      Auth Illuminate\Auth\AuthManager auth
      Auth (Instance) Illuminate\Contracts\Auth\Guard auth.driver
      Blade Illuminate\View\Compilers\BladeCompiler blade.compiler
      Broadcast Illuminate\Contracts\Broadcasting\Factory
      Broadcast (Instance) Illuminate\Contracts\Broadcasting\Broadcaster
      Bus Illuminate\Contracts\Bus\Dispatcher
      Cache Illuminate\Cache\CacheManager cache
      Cache (Instance) Illuminate\Cache\Repository cache.store
      Config Illuminate\Config\Repository config
      Cookie Illuminate\Cookie\CookieJar cookie
      Crypt Illuminate\Encryption\Encrypter encrypter
      DB Illuminate\Database\DatabaseManager db
      DB (Instance) Illuminate\Database\Connection db.connection
      Event Illuminate\Events\Dispatcher events
      File Illuminate\Filesystem\Filesystem files
      Gate Illuminate\Contracts\Auth\Access\Gate
      Hash Illuminate\Contracts\Hashing\Hasher hash
      Lang Illuminate\Translation\Translator translator
      Log Illuminate\Log\LogManager log
      Mail Illuminate\Mail\Mailer mailer
      Notification Illuminate\Notifications\ChannelManager
      Password Illuminate\Auth\Passwords\PasswordBrokerManager auth.password
      Password (Instance) Illuminate\Auth\Passwords\PasswordBroker auth.password.broker
      Queue Illuminate\Queue\QueueManager queue
      Queue (Instance) Illuminate\Contracts\Queue\Queue queue.connection
      Queue (Base Class) Illuminate\Queue\Queue
      Redirect Illuminate\Routing\Redirector redirect
      Redis Illuminate\Redis\RedisManager redis
      Redis (Instance) Illuminate\Redis\Connections\Connection redis.connection
      Request Illuminate\Http\Request request
      Response Illuminate\Contracts\Routing\ResponseFactory
      Response (Instance) Illuminate\Http\Response
      Route Illuminate\Routing\Router router
      Schema Illuminate\Database\Schema\Builder
      Session Illuminate\Session\SessionManager session
      Session (Instance) Illuminate\Session\Store session.store
      Storage Illuminate\Filesystem\FilesystemManager filesystem
      Storage (Instance) Illuminate\Contracts\Filesystem\Filesystem filesystem.disk
      URL Illuminate\Routing\UrlGenerator url
      Validator Illuminate\Validation\Factory validator
      Validator (Instance) Illuminate\Validation\Validator
      View Illuminate\View\Factory view
      View (Instance) Illuminate\View\View

      契约接口 Contract

      laravel’s contracts 是一系列接口,被框架定义了核心服务提供的接口。
      每一个contract框架在laravel中都有相应的实现。
      所有的contract都有他们自己的实现在github库。

      contracts vs facades

      laravel facade和helper functions 提供了简单的利用laravel的service,不需要类型提示和从服务容器(service container)中解析contracts (契约),在大多数情况下,每一个facades都有一个相等的contract。
      与facades功能相似,实现不同。
      与facades不同的是,facades 不需要你引入依赖在你的构造方法中,contracts 允许你显示的定义依赖在类中。
      一般contract和facades使用没什么差别。但是如果你是做一个包的话,强烈建议使用constract,contract更容易在包中测试。

      所有的laravel 服务都定义为简单的contracts接口。contracts成为laravel框架的特征的一个简单文档了。这样使类更加精简了。

      contract使用

      很多class在Laravel都是通过service container解析。包括控制器,事件监听,中间件,队列任务,甚至路由。而实现contract,我们可以在class的构造器中输入接口class进行解析。

      Contract 与 Facades类的关联对照

      Contract References Facade
      Illuminate\Contracts\Auth\Access\Authorizable
      Illuminate\Contracts\Auth\Access\Gate Gate
      Illuminate\Contracts\Auth\Authenticatable
      Illuminate\Contracts\Auth\CanResetPassword
      Illuminate\Contracts\Auth\Factory Auth
      Illuminate\Contracts\Auth\Guard Auth::guard()
      Illuminate\Contracts\Auth\PasswordBroker Password::broker()
      Illuminate\Contracts\Auth\PasswordBrokerFactory Password
      Illuminate\Contracts\Auth\StatefulGuard
      Illuminate\Contracts\Auth\SupportsBasicAuth
      Illuminate\Contracts\Auth\UserProvider
      Illuminate\Contracts\Bus\Dispatcher Bus
      Illuminate\Contracts\Bus\QueueingDispatcher Bus::dispatchToQueue()
      Illuminate\Contracts\Broadcasting\Factory Broadcast
      Illuminate\Contracts\Broadcasting\Broadcaster Broadcast::connection()
      Illuminate\Contracts\Broadcasting\ShouldBroadcast
      Illuminate\Contracts\Broadcasting\ShouldBroadcastNow
      Illuminate\Contracts\Cache\Factory Cache
      Illuminate\Contracts\Cache\Lock
      Illuminate\Contracts\Cache\LockProvider
      Illuminate\Contracts\Cache\Repository Cache::driver()
      Illuminate\Contracts\Cache\Store
      Illuminate\Contracts\Config\Repository Config
      Illuminate\Contracts\Console\Application
      Illuminate\Contracts\Console\Kernel Artisan
      Illuminate\Contracts\Container\Container App
      Illuminate\Contracts\Cookie\Factory Cookie
      Illuminate\Contracts\Cookie\QueueingFactory Cookie::queue()
      Illuminate\Contracts\Database\ModelIdentifier
      Illuminate\Contracts\Debug\ExceptionHandler
      Illuminate\Contracts\Encryption\Encrypter Crypt
      Illuminate\Contracts\Events\Dispatcher Event
      Illuminate\Contracts\Filesystem\Cloud Storage::cloud()
      Illuminate\Contracts\Filesystem\Factory Storage
      Illuminate\Contracts\Filesystem\Filesystem Storage::disk()
      Illuminate\Contracts\Foundation\Application App
      Illuminate\Contracts\Hashing\Hasher Hash
      Illuminate\Contracts\Http\Kernel
      Illuminate\Contracts\Mail\MailQueue Mail::queue()
      Illuminate\Contracts\Mail\Mailable
      Illuminate\Contracts\Mail\Mailer Mail
      Illuminate\Contracts\Notifications\Dispatcher Notification
      Illuminate\Contracts\Notifications\Factory Notification
      Illuminate\Contracts\Pagination\LengthAwarePaginator
      Illuminate\Contracts\Pagination\Paginator
      Illuminate\Contracts\Pipeline\Hub
      Illuminate\Contracts\Pipeline\Pipeline
      Illuminate\Contracts\Queue\EntityResolver
      Illuminate\Contracts\Queue\Factory Queue
      Illuminate\Contracts\Queue\Job
      Illuminate\Contracts\Queue\Monitor Queue
      Illuminate\Contracts\Queue\Queue Queue::connection()
      Illuminate\Contracts\Queue\QueueableCollection
      Illuminate\Contracts\Queue\QueueableEntity
      Illuminate\Contracts\Queue\ShouldQueue
      Illuminate\Contracts\Redis\Factory Redis
      Illuminate\Contracts\Routing\BindingRegistrar Route
      Illuminate\Contracts\Routing\Registrar Route
      Illuminate\Contracts\Routing\ResponseFactory Response
      Illuminate\Contracts\Routing\UrlGenerator URL
      Illuminate\Contracts\Routing\UrlRoutable
      Illuminate\Contracts\Session\Session Session::driver()
      Illuminate\Contracts\Support\Arrayable
      Illuminate\Contracts\Support\Htmlable
      Illuminate\Contracts\Support\Jsonable
      Illuminate\Contracts\Support\MessageBag
      Illuminate\Contracts\Support\MessageProvider
      Illuminate\Contracts\Support\Renderable
      Illuminate\Contracts\Support\Responsable
      Illuminate\Contracts\Translation\Loader
      Illuminate\Contracts\Translation\Translator Lang
      Illuminate\Contracts\Validation\Factory Validator
      Illuminate\Contracts\Validation\ImplicitRule
      Illuminate\Contracts\Validation\Rule
      Illuminate\Contracts\Validation\ValidatesWhenResolved
      Illuminate\Contracts\Validation\Validator Validator::make()
      Illuminate\Contracts\View\Engine
      Illuminate\Contracts\View\Factory View
      Illuminate\Contracts\View\View View::make()
本站所发布的资源均来源于互联网,仅限用于研究学习,不得将软件用于商业或者非法用途,否则一切后果请用户自负!如果侵犯了您的权益请与我们联系!您必须在下载后的24个小时之内,从您的手机和电脑中彻底删除。 如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请与我们联系处理!
互利网 » Laravel框架 核心构成以及工作方式是怎么样的?

常见问题FAQ

免费下载或者VIP会员专享资源能否直接商用?
本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
提示下载完但解压或打开不了?
最常见的情况是下载不完整:可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。 若排除这种情况,可在对应资源底部留言,或联络我们。

发表评论