本篇文章给大家分享的内容是关于Laravel框架中Autoloader模块的代码分析,有一定的参考价值,希望可以帮助到有需要的朋友。
首先是中文注释:
<?php namespace Laravel; class Autoloader { /** * 类名到文件名得映射 * * @var array */ public static $mappings = array(); /** * PSR-0命名转换目录 * * @var array */ public static $directories = array(); /** * 命名空间和目录的映射 * * @var array */ public static $namespaces = array(); /** * 下划线类库和目录映射 * * @var array */ public static $underscored = array(); /** * 自动加载类的别名 * * @var array */ public static $aliases = array(); /** * Load the file corresponding to a given class. * * This method is registered in the bootstrap file as an SPL auto-loader. * * @param string $class * @return void */ public static function load($class) { // 尝试类是否有别名 if (isset(static::$aliases[$class])) { return class_alias(static::$aliases[$class], $class); } // 查找映射 elseif (isset(static::$mappings[$class])) { require static::$mappings[$class]; return; } // 加载这个新的类 foreach (static::$namespaces as $namespace => $directory) { # 支持函数 是否命名空间开头 在helpers.php中 if (starts_with($class, $namespace)) { return static::load_namespaced($class, $namespace, $directory); } } static::load_psr($class); } /** * 从给定的目录加载命名空间 * * @param string $class * @param string $namespace * @param string $directory * @return void */ protected static function load_namespaced($class, $namespace, $directory) { return static::load_psr(substr($class, strlen($namespace)), $directory); } /** * 使用PSR-0标准来试图解析一个类 * * @param string $class * @param string $directory * @return void */ protected static function load_psr($class, $directory = null) { // 用PSR-0来解析类 使之变成路径字符串 $file = str_replace(array('\\', '_'), '/', $class); $directories = $directory ?: static::$directories; // 获得类路径 $lower = strtolower($file); # 默认全部小写 // 尝试解析 foreach ((array) $directories as $directory) { if (file_exists($path = $directory.$lower.EXT)) { return require $path; } elseif (file_exists($path = $directory.$file.EXT)) { return require $path; } } } /** * 注册一个数组 包含类路径映射 * * @param array $mappings * @return void */ public static function map($mappings) { static::$mappings = array_merge(static::$mappings, $mappings); } /** * 注册类的别名 * * @param string $class * @param string $alias * @return void */ public static function alias($class, $alias) { static::$aliases[$alias] = $class; } /** * 注册目录 * * @param string|array $directory * @return void */ public static function directories($directory) { $directories = static::format($directory); static::$directories = array_unique(array_merge(static::$directories, $directories)); } /** * 映射命名空间和目录 * * @param array $mappings * @param string $append * @return void */ public static function namespaces($mappings, $append = '\\') { $mappings = static::format_mappings($mappings, $append); static::$namespaces = array_merge($mappings, static::$namespaces); # 合并之后: (array "命名空间", array "命名空间","路径") } /** * 注册下划线命名空间 * * @param array $mappings * @return void */ public static function underscored($mappings) { static::namespaces($mappings, '_'); # 下划线风格 } /** * 格式目录映射 * * @param array $mappings * @param string $append * @return array */ protected static function format_mappings($mappings, $append) { foreach ($mappings as $namespace => $directory) { # 清理命名空间 $namespace = trim($namespace, $append).$append; unset(static::$namespaces[$namespace]); # 去除之前的 如果存在的话 $namespaces[$namespace] = head(static::format($directory)); # 一个命名空间只能对应一个目录 } return $namespaces; } /** * 格式化一个目录数组 * * @param array $directories * @return array */ protected static function format($directories) { return array_map(function($directory) { return rtrim($directory, DS).DS;# 清理目录 }, (array) $directories); // 用map遍历目录数组 } }
改类被自动装在到spl中:
spl_autoload_register(array('Laravel\\Autoloader', 'load')); # spl_autoload_register array 命名空间,具体方法
注册好之后,就载入一些预先设置好的配置:
定义系统root
Autoloader::namespaces(array('Laravel' => path('sys'))); # 定义Laravel系统根目录映射
然后是默认使用的ORM框架
# 定义EloquentORM框架 Autoloader::map(array( 'Laravel\\Database\\Eloquent\\Relationships\\Belongs_To' => path('sys').'database/eloquent/relationships/belongs_to'.EXT, 'Laravel\\Database\\Eloquent\\Relationships\\Has_Many' => path('sys').'database/eloquent/relationships/has_many'.EXT, 'Laravel\\Database\\Eloquent\\Relationships\\Has_Many_And_Belongs_To' => path('sys').'database/eloquent/relationships/has_many_and_belongs_to'.EXT, 'Laravel\\Database\\Eloquent\\Relationships\\Has_One' => path('sys').'database/eloquent/relationships/has_one'.EXT, 'Laravel\\Database\\Eloquent\\Relationships\\Has_One_Or_Many' => path('sys').'database/eloquent/relationships/has_one_or_many'.EXT, ));
随后是Symfony的HTTP组件和Console组件
# Symfony组件加载 Autoloader::namespaces(array( 'Symfony\Component\Console' => path('sys').'vendor/Symfony/Component/Console', 'Symfony\Component\HttpFoundation' => path('sys').'vendor/Symfony/Component/HttpFoundation', ));
当然,不要忘记了application.php中的配置
'aliases' => array( 'Auth' => 'Laravel\\Auth', 'Authenticator' => 'Laravel\\Auth\\Drivers\\Driver', 'Asset' => 'Laravel\\Asset', 'Autoloader' => 'Laravel\\Autoloader', 'Blade' => 'Laravel\\Blade', 'Bundle' => 'Laravel\\Bundle', 'Cache' => 'Laravel\\Cache', 'Config' => 'Laravel\\Config', 'Controller' => 'Laravel\\Routing\\Controller', 'Cookie' => 'Laravel\\Cookie', 'Crypter' => 'Laravel\\Crypter', 'DB' => 'Laravel\\Database', 'Eloquent' => 'Laravel\\Database\\Eloquent\\Model', 'Event' => 'Laravel\\Event', 'File' => 'Laravel\\File', 'Filter' => 'Laravel\\Routing\\Filter', 'Form' => 'Laravel\\Form', 'Hash' => 'Laravel\\Hash', 'HTML' => 'Laravel\\HTML', 'Input' => 'Laravel\\Input', 'IoC' => 'Laravel\\IoC', 'Lang' => 'Laravel\\Lang', 'Log' => 'Laravel\\Log', 'Memcached' => 'Laravel\\Memcached', 'Paginator' => 'Laravel\\Paginator', 'Profiler' => 'Laravel\\Profiling\\Profiler', 'URL' => 'Laravel\\URL', 'Redirect' => 'Laravel\\Redirect', 'Redis' => 'Laravel\\Redis', 'Request' => 'Laravel\\Request', 'Response' => 'Laravel\\Response', 'Route' => 'Laravel\\Routing\\Route', 'Router' => 'Laravel\\Routing\\Router', 'Schema' => 'Laravel\\Database\\Schema', 'Section' => 'Laravel\\Section', 'Session' => 'Laravel\\Session', 'Str' => 'Laravel\\Str', 'Task' => 'Laravel\\CLI\\Tasks\\Task', 'URI' => 'Laravel\\URI', 'Validator' => 'Laravel\\Validator', 'View' => 'Laravel\\View', ),
基本上流程就出来了。
牵扯的重要的文件地址:
laravel/core.php
laravel/autoloader.php
application/config/application.php
配合Ioc,够用了。下次分析一下laravel的Ioc,不过个人感觉功能太少。使用仿spring的Ding更好
以上就是本篇文章的全部内容了,更多laravel内容请关注laravel框架入门教程。
相关文章推荐:
实时聊天室:基于Laravel+Pusher+Vue通过事件广播实现
laravel框架中TokenMismatchException的异常处理内容
相关课程推荐:
위 내용은 Laravel 프레임워크의 Autoloader 모듈 코드 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

React, vue, andangularcanbeintegratedwithlaravelbyfollowspecificsetupsteps.1) forreact : installEactusingLaravelui, setupcomponentsinApp.js.2) Forvue : Uselaravel'sbuilt-Invuesupport, configureinApt.3)

taskManagementToolsEnsentialForeMoteProjectManagementByPirizingTaskSandTrackingProgress.1) USETOOLSLIKETRELLOANATOSETPRIORITIESWITHLABELSORTAGS.2) EmployToolslikeJiraanddonday.comforvisualTrackingWithGantTchartSandprogressbars.3) k

Laravel10EnhancesPerformancetHroughseveralKeyFeatures.1) ItinTroduceSqueryBuilderCachingTucedAtabaseload.2) ITOPTIMIZESELOQUENTMODELLOADINGWITHLAZYLOWNEDPROXIES.3) ITIMPROVESTINGWITHANEWCACHINGSYSTEM.4) ITENHANCES WITHENTEMPHANCES BLOWTETETEMPLOTETEMPHENCESTEMPHENTSE

최고의 풀 스택 Laravel 애플리케이션 배포 전략에는 다음이 포함됩니다. 1. 제로 다운 타임 배포, 2. 청록색 배포, 3. 연속 배포 및 4. Canary Release. 1. 제로 다운 타임 배포는 Envoy 또는 배치자를 사용하여 배포 프로세스를 자동화하여 업데이트 될 때 애플리케이션을 사용할 수 있도록합니다. 2. Blue 및 Green Deployment는 두 가지 환경을 유지하여 다운 타임 배포를 가능하게하며 빠른 롤백을 허용합니다. 3. 지속적인 배포는 githubactions 또는 gitlabci/cd를 통해 전체 배포 프로세스를 자동화합니다. 4. Canary는 NGINX 구성을 통해 출시되어 성능 최적화와 빠른 롤백을 보장하기 위해 사용자에게 새 버전을 점차 홍보합니다.

ToscalealaravelApplicationeficationfictically, Focusondatabasesharding, 캐싱, 하중 발행 및 Microservices.1) 구현 대자 방당 분배 된 분산 된 타타 이탈 라제스 퍼포먼스

TovercomeCommunicationBarriersindistributedTeams, 사용 : 1) videocallsforface-to-faceintercation, 2) setClearResponsetImeexpectations, 3) ChooseAppropriateCommunicationTools, 4) CreateAteAmcommunicationGuide, 및 5) spuctionPersonalboundIVestOverventBurnout

laravelbladeenhancesfrontendtemplatinginfull-stackprojectsbyofferingcleansyntaxandpowerfulfeatures.1) itallowsforeasyvaribledisplayandcontrolstructures.2) bladesupportscreatingAndAndErscreatingCreatingScreatingAndErsingComponents, aidingininagingComplexUis.3) iteffort handleslyous

laravelisidealforfull-stackapplicationsduetoitselegantsyntax, 포괄적 인 Cosystem 및 powerfulfeatures.1) audeeloquentormforintucive backenddatamanipulation, butavoidn 1queryisss.2) Employblatingforcleanfrontendviews, beencautiousofoversing@i


핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

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

안전한 시험 브라우저
안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.
