本篇文章給大家分享的內(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?=>?$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'?=>?path('sys')));?#?定義Laravel系統(tǒng)根目錄映射
然后是默認(rèn)使用的ORM框架
#?定義EloquentORM框架 Autoloader::map(array( 'LaravelDatabaseEloquentRelationshipsBelongs_To'? ????????????????????=>?path('sys').'database/eloquent/relationships/belongs_to'.EXT, 'LaravelDatabaseEloquentRelationshipsHas_Many'? ????????????????????=>?path('sys').'database/eloquent/relationships/has_many'.EXT, 'LaravelDatabaseEloquentRelationshipsHas_Many_And_Belongs_To'? ????????????????????=>?path('sys').'database/eloquent/relationships/has_many_and_belongs_to'.EXT, 'LaravelDatabaseEloquentRelationshipsHas_One'? ????????????????????=>?path('sys').'database/eloquent/relationships/has_one'.EXT, 'LaravelDatabaseEloquentRelationshipsHas_One_Or_Many'? ????????????????????=>?path('sys').'database/eloquent/relationships/has_one_or_many'.EXT, ));
#?Symfony組件加載 Autoloader::namespaces(array( 'SymfonyComponentConsole'? ????????????????????=>?path('sys').'vendor/Symfony/Component/Console', 'SymfonyComponentHttpFoundation' ????????????????????=>?path('sys').'vendor/Symfony/Component/HttpFoundation', ));
當(dāng)然,不要忘記了application.php中的配置
'aliases'?=>?array( 'Auth'??????? =>?'LaravelAuth', 'Authenticator'?=>?'LaravelAuthDriversDriver', 'Asset'?????? =>?'LaravelAsset', 'Autoloader'? =>?'LaravelAutoloader', 'Blade'?????? =>?'LaravelBlade', 'Bundle'????? =>?'LaravelBundle', 'Cache'?????? =>?'LaravelCache', 'Config'????? =>?'LaravelConfig', 'Controller'? =>?'LaravelRoutingController', 'Cookie'????? =>?'LaravelCookie', 'Crypter'???? =>?'LaravelCrypter', 'DB'????????? =>?'LaravelDatabase', 'Eloquent'??? =>?'LaravelDatabaseEloquentModel', 'Event'?????? =>?'LaravelEvent', 'File'??????? =>?'LaravelFile', 'Filter'????? =>?'LaravelRoutingFilter', 'Form'??????? =>?'LaravelForm', 'Hash'??????? =>?'LaravelHash', 'HTML'??????? =>?'LaravelHTML', 'Input'?????? =>?'LaravelInput', 'IoC'???????? =>?'LaravelIoC', 'Lang'??????? =>?'LaravelLang', 'Log'???????? =>?'LaravelLog', 'Memcached'?? =>?'LaravelMemcached', 'Paginator'?? =>?'LaravelPaginator', 'Profiler'?? =>?'LaravelProfilingProfiler', 'URL'???????? =>?'LaravelURL', 'Redirect'??? =>?'LaravelRedirect', 'Redis'?????? =>?'LaravelRedis', 'Request'???? =>?'LaravelRequest', 'Response'??? =>?'LaravelResponse', 'Route'?????? =>?'LaravelRoutingRoute', 'Router'????? =>?'LaravelRoutingRouter', 'Schema'????? =>?'LaravelDatabaseSchema', 'Section'???? =>?'LaravelSection', 'Session'???? =>?'LaravelSession', 'Str'???????? =>?'LaravelStr', 'Task'??????? =>?'LaravelCLITasksTask', 'URI'???????? =>?'LaravelURI', 'Validator'?? =>?'LaravelValidator', 'View'??????? =>?'LaravelView', ),
基本上流程就出來了。
牽扯的重要的文件地址:
laravel/core.php
laravel/autoloader.php
application/config/application.php
配合Ioc,夠用了。下次分析一下laravel的Ioc,不過個(gè)人感覺功能太少。使用仿spring的Ding更好
? 版權(quán)聲明
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載。
THE END