通过读dcat-admin源码学习laravel
第一次接触laravel,直接去读文档总觉得有点生涩,就想通过一个项目入手对laravel进行学习,于是通过官方推荐对dcat-admin在homestead环境中进行了安装启动。好家伙,可以见到的页面的代码我竟然找不到,那么就带着问题去找一下答案吧~
-
运行网站时,如何加载dcat-admin dcat-admin源码
通过查看laravel的请求周期可知道,在页面请求执行前,Illuminate\Foundation\Http\Kernel类会先去调用bootstrappers数组定义的相关执行任务,其中包括’Dcat\\Admin\\AdminServiceProvider’,打开该服务提供者查看相关的register以及boot函数如下
其中register中
- 给admin设置别名;
- 注册dcat-admin其他扩展服务提供者;
- 加载admin的配置文件;
- 注册路由中间件;
- 注册dcat-admin扩展的Artisan命令;
boot函数启动的步骤有
- 注册后台页面头部导航、用户面板、左侧导航面板、左侧导航菜单等默认系统后台页面固定模块;
- 注册视图命名空间
- 支持https
- 注册dcat-admin携带的路由
- 资源发布注册
- 禁止laravel 5.6或更高版本中启用双编码的默认特性、
2、Dcat-admin源码运行过程中、怎样运行到渲染grid列表
例如当访问url:http://你的测试环境域名/admin/auth/users
的时候,根据路由文件app/Admin/routes.php文件中先引入系统模块路由得知,自定义应用之前的路由定义在/vendor/dcat/laravel-admin/src/Admin.php::routes
通过查看routes()源码,可见routes里面定义了,访问/auth/users 的时候将指向控制器Dcat\Admin\Controllers\UserControlle\
查看UserController源码,该控制器继承了AdminController父类,AdminController中生声明了index成员方法如下图,通过依赖注入声明参数类型自动注入Content类并返回Content实例。
看到这里的时候,我就纳闷,这样的控制器怎样渲染页面呢?还有就是grid成员方法每行只写一下成员属性就能将整个主体内容页面布局出来了?
在这里不得不说,debug_backtrace()方法简直太好用了。通过进入Grid类make里面看,不过是返回类实例
根据经验,渲染肯定使用到render函数,于是搜到疑似的Helper::render()方法,在Helper::render里面打印产生一条回溯跟踪(backtrace) ,如下图
果然是在这里渲染出table。运行页面,查看回溯追踪打印结果,查看调用过程,一步步跟进。
原来是在laravel生命周期过程中,Respose初始化的时候通过setContent调用了render,根据回溯追踪打印出来的数组、一步步追踪到laravel使用路由调用请求控制器方法,返回到管道模式调用中,调用完全部的中间件后,再根据路由创建Content实例的过程特别的巧妙,感兴趣的可以看我前一篇转载的文章(https://blog.csdn.net/CouryLove/article/details/108054622),太妙了。
3、Dcat-admin 控制器中返回每一行一个新的成员名称的时候实际返回的是什么、调用的是什么。
读到前面的代码也让我吃鲸,为什么grid()函数中,编写几行成员名称即可渲染出整个表格,于是,根据上文提到的,会调用render()函数进行渲染,render()中调用Grid类中的doWrap()进行渲染,Grid类初始化的时候已经设置了渲染的模版引擎文件$view = 'admin::grid.data-table',成员属性variables则在实例化的时候获取到全部的成员属性,
Grid类中的__call()魔术方法已经实现了将控制器中的每行转化成实例的成员属性列元素的功能,因此在variables中直接给variables[‘grid’]赋值即可获得全部成员列元素。
总结:
以上就是在初次接触laravel以及dcat-admin源码的一次思考过程,整个过程中,学习到很多前辈很多关于设计模式、依赖注入、门面、中间件、管道模式、观察者模式等方法,深深感叹laravel的优雅,下面附上几篇学习博文。
- 理解依赖注入以及容器反转
https://blog.csdn.net/CouryLove/article/details/107665507
- 理解RESTful架构
http://www.ruanyifeng.com/blog/2011/09/restful.html
- 设计模式
https://xueyuanjun.com/books/php-design-pattern
- Dcat-admin 使用手册
https://learnku.com/docs/dcat-admin/1.x/basic-use/8089
5、深入浅出 Laravel Macroable
https://learnku.com/articles/35970
6、Laravel Event——事件系统的启动与运行源码分析
https://learnku.com/articles/6957/laravel-event-starting-and-running-source-analysis-of-event-system
7、深入laravel核心
https://learnku.com/docs/laravel-core-concept/5.5