本来打算自己写一系列分析文章,不过人家有了,而且写得很好,拿来给有需要的人参考
优秀参考资料
- 核心设计版分析博客 Laravel源码分析
- 运行流程版分析博客 Laravel源码分析
- 分析视频 Laravel源码分析视频
这个三个资料,最好的,当然是视频版,可惜,只有一讲,后续作者没有更新。然后就是核心设计版,对我这种没怎么研究过源码的小白,很友好。然后是运行流程版,相当于对着主要流程讲了一遍。建议在看懂简版后,再阅读。
领会到的Laravel源码精要思想
容器相关思想
- 将变量(比如 类 ,实例化类的方法 ,实例化后的单例模式的实例)存放在容器类中;
- 实现依赖注入,解决代码中写new 某类的问题 (因为容器中,存放了实例化某类的方法(闭包))
单独使用Laravel的容器类,或者说如何在自己的项目中,使用Laravel容器类 参考:单独使用Laravel容器
// 以composer方式 引入容器包 省略
class Application extends Illuminate\Container\Container{
public function __construct()
{
static::setInstance($this);
}
//启动静态代理
public function withFacades($aliases = true, $userAliases = [])
{
Illuminate\Support\Facades\Facade::setFacadeApplication($this);
}
}
//app()这个函数太常被定义了, 所以另外起了个名字
function center_app($abstract = null, array $parameters = [])
{
if (is_null($abstract)) {
//辅助函数返回容器本身
return Illuminate\Container\Container::getInstance();
}
//返回别名对应的实例
return Illuminate\Container\Container::getInstance()->make($abstract, $parameters);
}
$app=new Application();
// app()->withFacades();//处理静态代理
$app->bind('redis1',function(){
return new Predis\Client([],['prefix'=>'shrimp']);
});//注册一个实例化某个抽象的闭包方法,此时未实例化;
//定义了一个单例模式的类,别名为redis
$app->singleton('redis2',function(){
$redis=new Predis\Client([],['prefix'=>'shrimp']);
$redis->select(7);
return $redis;
});//注册一个实例化某个抽象的闭包方法,此时未实例化,单例模式;
$redis_client=new Redis();
$app->instance('redis3',$redis_client); //instance方法,往容器中,防止一个已经实例化好的类()
$re=$app->make('redis3');//从容器中拿出redis3实例
//容器能通过反射类(一个PHP自带的类),自动处理其依赖关系 默认就是new 某类
//laravel 服务提供者的本质 是在容器中绑定,某个服务的实例化方法 且该方法的执行顺序,优先于默认的 new 某类
//laravel 静态代理的思想 得到被代理类的完整命名空间类名,通过容器,得到该类的实例,执行被静态调用的方法
管道 中间件实现
关键思想 两层闭包 参考资料 理解了参考中的计数器的例子,就能明白了
单独使用Laravel database类
在自己项目中 使用Laravel的ORM操作数据库,真香 参考资料,单独使用Laravel