学 Laravel 和 Vuejs,你真应该来 codecasts.com ,有免费高质量视频!

在 Laravel 5.2 的时候,官方给我们提供了 make:auth 命令,这个命令使得我们在执行一条命令的情况下实现用户注册和登录,忘记密码,找回密码的过程!本文来看一下 make:auth 的源码。

源码在哪

还是一样的,使用编辑器的搜索功能,直接搜索 MakeAuthCommand,你会找到这个文件 Illuminate\Auth\Console\MakeAuthCommand,而这些 artisan 的命令,我们关注的重点就是 fire() 这个方法:

public function fire(){$this->createDirectories();// other codes ...}    

1.创建目录

首先 createDirectories() 创建必要的目录:


protected function createDirectories()
{if (! is_dir(resource_path('views/layouts'))) {mkdir(resource_path('views/layouts'), 0755, true);}if (! is_dir(resource_path('views/auth/passwords'))) {mkdir(resource_path('views/auth/passwords'), 0755, true);}
}

这里可以看到此命令会创建两个文件夹,就是 resources/views/layoutsresources/views/auth/password

2.复制文件

有了目录之后,在 fire() 方法里,createDirectories() 的后面,大概有这样的一行代码:

public function fire()
{// other codes ...$this->exportViews();// other codes ...
}

那么 exportViews() 做的事情就是复制文件了:

 protected function exportViews()
{
foreach ($this->views as $key => $value) {
if (file_exists(resource_path('views/'.$value)) && ! $this->option('force')) {if (! $this->confirm("The [{$value}] view already exists. Do you want to replace it?")) {continue;}
}copy(__DIR__.'/stubs/make/views/'.$key,resource_path('views/'.$value)
);
}
}

首先通过 foreach 检查要复制的文件是否存在,不存在的话,直接使用 copy() 复制文件,这些文件名字的定义在 $this->views 里面:

 protected $views = [
'auth/login.stub' => 'auth/login.blade.php',
'auth/register.stub' => 'auth/register.blade.php',
'auth/passwords/email.stub' => 'auth/passwords/email.blade.php',
'auth/passwords/reset.stub' => 'auth/passwords/reset.blade.php',
'layouts/app.stub' => 'layouts/app.blade.php',
'home.stub' => 'home.blade.php',
];

这个定义就在 MakeAuthCommand 文件里面。然后这里你就可以清楚地看到我们要复制的视图文件有哪些了!

3.生成控制器

还是在 fire() 方法中,通过下面几行代码生成控制器:

file_put_contents(
app_path('Http/Controllers/HomeController.php'),
$this->compileControllerStub()
);

我们来看看 compileControllerStub() 具体怎么实现:

protected function compileControllerStub()
{
return str_replace(
'{{namespace}}',
$this->getAppNamespace(),file_get_contents(__DIR__.'/stubs/make/controllers/HomeController.stub')
);
}

可以看到,思路是这样的:1.获取原先定义好的控制器文件 --> 2.用 getAppNamespace 替换 {{namespace}} ;这样我们就可以正确确定控制器的命名空间。

4.添加路由

在 fire() 方法中,通过下面几行代码添加路由:

 file_put_contents(
base_path('routes/web.php'),file_get_contents(__DIR__.'/stubs/make/routes.stub'),FILE_APPEND
);

注意 FILE_APPEND 这个参数,就是将 routes.stub 这个文件的内容附加在原来路由文件的后面,并不会将原来的路由清零。那么添加的是下面的这两条路由:

Auth::routes();
Route::get('/home', 'HomeController@index')->name('home');

其中的 Auth::routes() 方法可以直接在 Illuminate\Support\Facades\Auth:

public static function routes()
{static::$app->make('router')->auth();
}

最终执行路由注册的在 Illuminate\Routing\Routerauth() 方法:

 public function auth(){// routes codes ...}

最后揭秘

那么这些视图文件控制器文件路由文件在哪呢?揭秘:就在 vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make 目录,你打开这个目录就可以看到这些魔法的真相!

Happy Hacking

最后记得关注 codecasts 公众号,定期送书送福利!

Laravel 源码解读:php artisan make:auth相关推荐

  1. php artisan code,源码解读 Laravel PHP artisan config:cache

    再来一篇源码解读系列,其实包含本篇 config:cache 源码解读在内,这三篇的源码解读都是跟线上环境部署 Laravel 项目有关,因为我们通常会使用这三个 artisan 命令来提高项目的执行 ...

  2. php artisan实现机制,源码解读:php artisan serve

    在学习 Laravel 的时候,可能很多人接触的第一个 artisan 的命令就是:php artisan serve,这样我们就可以跑起第一个 Laravel 的应用.本文来尝试解读一下这个命令行的 ...

  3. Laravel源码剖析之请求的处理上(四)

    上篇讲了make方法-->Laravel源码剖析之make详解(三)_Attitude_do_it的博客-CSDN博客, 根据make方法的分析可以得出: $kernel = $app-> ...

  4. Laravel源码学习文章汇总

    过去一年时间写了20多篇文章来探讨了我认为的Larave框架最核心部分的设计思路.代码实现.通过更新文章自己在软件设计.文字表达方面都有所提高,在刚开始决定写Laravel源码分析地文章的时候我地期望 ...

  5. Requests源码解读

    Requests源码解读01-README文件&api模块&session模块 Requests是什么? 为什么要用Requests 源码分析 README文件 api.py get方 ...

  6. Bert系列(二)——源码解读之模型主体

    本篇文章主要是解读模型主体代码modeling.py.在阅读这篇文章之前希望读者们对bert的相关理论有一定的了解,尤其是transformer的结构原理,网上的资料很多,本文内容对原理部分就不做过多 ...

  7. Bert系列(三)——源码解读之Pre-train

    https://www.jianshu.com/p/22e462f01d8c pre-train是迁移学习的基础,虽然Google已经发布了各种预训练好的模型,而且因为资源消耗巨大,自己再预训练也不现 ...

  8. linux下free源码,linux命令free源码解读:Procps free.c

    linux命令free源码解读 linux命令free源码解读:Procps free.c 作者:isayme 发布时间:September 26, 2011 分类:Linux 我们讨论的是linux ...

  9. nodeJS之eventproxy源码解读

    1.源码缩影 !(function (name, definition) { var hasDefine = typeof define === 'function', //检查上下文环境是否为AMD ...

最新文章

  1. 互联网协议 — TLS — SNI
  2. 《精通Unreal游戏引擎》一第4步 使用BSP创建地图
  3. mysql 交集_MySQL 查询结果取交集的实现方法
  4. SQL Server优化50法
  5. 缓存中间件-mac下Memcache 安装
  6. 介绍4个大神常用而你不常用的python函数--assert,map,filter,reduce
  7. Mybatis 入门案例分享
  8. java实现点卡生成
  9. 八皇后问题 (25分)
  10. 《延禧攻略》不仅是中国色,还藏着中国美了千年的风景!
  11. 易优cms 后台登录报:验证码错误 Eyoucms快速入门
  12. C++不规则窗体编程跳棋游戏实例!
  13. git clone报错warning:Clone succeeded,but checkout failed
  14. 2304558-25-4,DBCO-PEG2-acid分子量是464.5的小分子PEG试剂带有PEG连接物和DBCO基团
  15. 浏览器被hao123劫持首页处理
  16. iOS签名校验那些事儿
  17. 鸿蒙操作系统全面屏,首发鸿蒙操作系统!华为P50 Pro稳了:居中开孔全面屏
  18. ElasticSearch使用学习
  19. matlab绘制引力场_玩引力场和漂亮的色彩
  20. ACM素数打表(模版)

热门文章

  1. Android序列化:Serializable Parcelable
  2. 三章:CentOS6.5 更改时区设置、安装samba、install VMware、install XFS 、install XFS --parted
  3. 自己服务器上部署APP应用(安卓和IOS版),下载页面的代码,以及IOS的xxx.plist文件的建立
  4. 第一篇:Mysql数据类型
  5. 计算机义务维修队,我院捷诚义务维修服务队电脑维修服务活动
  6. linux怎么编译并安装busybox,linux下安装busybox
  7. 怎么用python自制计算公式_自制计算经纬度位移 python 程序
  8. Linux下的tar归档及解压缩功能详解
  9. websvn mysql_Centos 5.3 Nginx+php+mysql配置 独立的 Subversion (SVN)服务器
  10. mysql回收权限_mysql回收权限不成功,请问如何破?