Laravel框架中Autoloader模块的代码分析
发布时间 - 2018-07-31 00:00:00 点击率:次本篇文章给大家分享的内容是关于laravel框架中autoloader模块的代码分析,有一定的参考价值,希望可以帮助到有需要的朋友。
首先是中文注释:
$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框架中外观模式的深入解析
相关课程推荐:
2017年最新的五个Laravel视频教程推荐
# php
# symfony
# laravel
# spring
# console
# 事件
# http
# 下划线
# 加载
# 遍历
# 有一定
# 相关文章
# 用了
# 给大家
# 太少
# 使之
# 可以帮助
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知
Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】
个人摄影网站制作流程,摄影爱好者都去什么网站?
Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道
Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复
制作企业网站建设方案,怎样建设一个公司网站?
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
EditPlus中的正则表达式实战(6)
Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程
如何在云服务器上快速搭建个人网站?
Laravel如何生成URL和重定向?(路由助手函数)
佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】
iOS发送验证码倒计时应用
EditPlus 正则表达式 实战(3)
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
Laravel怎么实现验证码(Captcha)功能
Laravel怎么使用artisan命令缓存配置和视图
JavaScript Ajax实现异步通信
Android中AutoCompleteTextView自动提示
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
Laravel中的withCount方法怎么高效统计关联模型数量
Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
如何使用 jQuery 正确渲染 Instagram 风格的标签列表
重庆市网站制作公司,重庆招聘网站哪个好?
Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】
用v-html解决Vue.js渲染中html标签不被解析的问题
QQ浏览器网页版登录入口 个人中心在线进入
Laravel如何使用Sanctum进行API认证?(SPA实战)
米侠浏览器网页背景异常怎么办 米侠显示修复
如何在IIS中新建站点并配置端口与IP地址?
Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议
1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤
Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
Android实现代码画虚线边框背景效果
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程
成都网站制作公司哪家好,四川省职工服务网是做什么用?
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
canvas 画布在主流浏览器中的尺寸限制详细介绍
node.js报错:Cannot find module 'ejs'的解决办法
怎么用AI帮你为初创公司进行市场定位分析?


' => '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',
),