Laravel框架中Autoloader模塊的代碼分析

本篇文章給大家分享的內(nèi)容是關(guān)于laravel框架中autoloader模塊的代碼分析,有一定的參考價(jià)值,希望可以幫助到有需要的朋友。

首先是中文注釋:

<?php  namespace laravel;  class Autoloader {  	/** 	 * 類名到文件名得映射 	 * 	 * @var array 	 */ 	public static $mappings = array();  	/**      * PSR-0命名轉(zhuǎn)換目錄 	 * 	 * @var array 	 */ 	public static $directories = array();  	/** 	 * 命名空間和目錄的映射 	 * 	 * @var array 	 */ 	public static $namespaces = array();  	/** 	 * 下劃線類庫和目錄映射 	 * 	 * @var array 	 */ 	public static $underscored = array();  	/** 	 * 自動(dòng)加載類的別名 	 * 	 * @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; 		}  		// 加載這個(gè)新的類 		foreach (static::$namespaces as $namespace =>?$directory) 		{ ????????????#?支持函數(shù)?是否命名空間開頭?在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標(biāo)準(zhǔn)來試圖解析一個(gè)類 	?* 	?*?@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);?#?默認(rèn)全部小寫  		//?嘗試解析 		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; 			} 		} 	}  	/** 	?*?注冊一個(gè)數(shù)組?包含類路徑映射 	?* 	?*?@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,?'_');?#?下劃線風(fēng)格 	}  	/** 	?*?格式目錄映射 	?* 	?*?@param??array???$mappings 	?*?@param??string??$append 	?*?@return?array 	?*/ 	protected?static?function?format_mappings($mappings,?$append) 	{ 		foreach?($mappings?as?$namespace?=&gt;?$directory) 		{ 			#?清理命名空間 			$namespace?=?trim($namespace,?$append).$append;  			unset(static::$namespaces[$namespace]);?#?去除之前的?如果存在的話  			$namespaces[$namespace]?=?head(static::format($directory));?#?一個(gè)命名空間只能對應(yīng)一個(gè)目錄 		}  		return?$namespaces; 	}  	/** 	?*?格式化一個(gè)目錄數(shù)組 	?* 	?*?@param??array??$directories 	?*?@return?array 	?*/ 	protected?static?function?format($directories) 	{ 		return?array_map(function($directory) 		{ 			return?rtrim($directory,?DS).DS;#?清理目錄 		 		},?(array)?$directories);?//?用map遍歷目錄數(shù)組 	}  }

改類被自動(dòng)裝在到spl中:

spl_autoload_register(array('LaravelAutoloader',?'load'));?#?spl_autoload_register?array?命名空間,具體方法

注冊好之后,就載入一些預(yù)先設(shè)置好的配置:

定義系統(tǒng)root

Autoloader::namespaces(array('Laravel'?=&gt;?path('sys')));?#?定義Laravel系統(tǒng)根目錄映射

然后是默認(rèn)使用的ORM框架

#?定義EloquentORM框架 Autoloader::map(array( 	'LaravelDatabaseEloquentRelationshipsBelongs_To'? ????????????????????=&gt;?path('sys').'database/eloquent/relationships/belongs_to'.EXT, 	'LaravelDatabaseEloquentRelationshipsHas_Many'? ????????????????????=&gt;?path('sys').'database/eloquent/relationships/has_many'.EXT, 	'LaravelDatabaseEloquentRelationshipsHas_Many_And_Belongs_To'? ????????????????????=&gt;?path('sys').'database/eloquent/relationships/has_many_and_belongs_to'.EXT, 	'LaravelDatabaseEloquentRelationshipsHas_One'? ????????????????????=&gt;?path('sys').'database/eloquent/relationships/has_one'.EXT, 	'LaravelDatabaseEloquentRelationshipsHas_One_Or_Many'? ????????????????????=&gt;?path('sys').'database/eloquent/relationships/has_one_or_many'.EXT, ));

隨后是symfonyhttp組件和console組件

#?Symfony組件加載 Autoloader::namespaces(array( 	'SymfonyComponentConsole'? ????????????????????=&gt;?path('sys').'vendor/Symfony/Component/Console', 	'SymfonyComponentHttpFoundation' ????????????????????=&gt;?path('sys').'vendor/Symfony/Component/HttpFoundation', ));

當(dāng)然,不要忘記了application.php中的配置

'aliases'?=&gt;?array( 		'Auth'???????	=&gt;?'LaravelAuth', 		'Authenticator'?=&gt;?'LaravelAuthDriversDriver', 		'Asset'??????	=&gt;?'LaravelAsset', 		'Autoloader'?	=&gt;?'LaravelAutoloader', 		'Blade'??????	=&gt;?'LaravelBlade', 		'Bundle'?????	=&gt;?'LaravelBundle', 		'Cache'??????	=&gt;?'LaravelCache', 		'Config'?????	=&gt;?'LaravelConfig', 		'Controller'?	=&gt;?'LaravelRoutingController', 		'Cookie'?????	=&gt;?'LaravelCookie', 		'Crypter'????	=&gt;?'LaravelCrypter', 		'DB'?????????	=&gt;?'LaravelDatabase', 		'Eloquent'???	=&gt;?'LaravelDatabaseEloquentModel', 		'Event'??????	=&gt;?'LaravelEvent', 		'File'???????	=&gt;?'LaravelFile', 		'Filter'?????	=&gt;?'LaravelRoutingFilter', 		'Form'???????	=&gt;?'LaravelForm', 		'Hash'???????	=&gt;?'LaravelHash', 		'HTML'???????	=&gt;?'LaravelHTML', 		'Input'??????	=&gt;?'LaravelInput', 		'IoC'????????	=&gt;?'LaravelIoC', 		'Lang'???????	=&gt;?'LaravelLang', 		'Log'????????	=&gt;?'LaravelLog', 		'Memcached'??	=&gt;?'LaravelMemcached', 		'Paginator'??	=&gt;?'LaravelPaginator', 		'Profiler'??	=&gt;?'LaravelProfilingProfiler', 		'URL'????????	=&gt;?'LaravelURL', 		'Redirect'???	=&gt;?'LaravelRedirect', 		'Redis'??????	=&gt;?'LaravelRedis', 		'Request'????	=&gt;?'LaravelRequest', 		'Response'???	=&gt;?'LaravelResponse', 		'Route'??????	=&gt;?'LaravelRoutingRoute', 		'Router'?????	=&gt;?'LaravelRoutingRouter', 		'Schema'?????	=&gt;?'LaravelDatabaseSchema', 		'Section'????	=&gt;?'LaravelSection', 		'Session'????	=&gt;?'LaravelSession', 		'Str'????????	=&gt;?'LaravelStr', 		'Task'???????	=&gt;?'LaravelCLITasksTask', 		'URI'????????	=&gt;?'LaravelURI', 		'Validator'??	=&gt;?'LaravelValidator', 		'View'???????	=&gt;?'LaravelView', 	),

基本上流程就出來了。

牽扯的重要的文件地址:

laravel/core.php
laravel/autoloader.php
application/config/application.php

配合Ioc,夠用了。下次分析一下laravel的Ioc,不過個(gè)人感覺功能太少。使用仿spring的Ding更好

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊8 分享