当前位置: 首页 > 后端技术 > PHP

Laravel源码解读:phpartisanmake-auth

时间:2023-03-30 01:37:35 PHP

学习Laravel和Vuejs,真的应该来codecasts.com,里面有免费的优质视频!在Laravel5.2中,官方为我们提供了make:auth命令,可以让我们在执行一条命令的情况下实现用户注册登录、忘记密码、找回密码的过程!这篇文章来看看make:auth的源代码。源码还是一样,直接用编辑器的搜索功能搜索MakeAuthCommand,会找到Illuminate\Auth\Console\MakeAuthCommand这个文件,而这些artisan命令,我们重点关注fire()方法:publicfunctionfire(){$this->createDirectories();//其他代码...}1.创建目录首先createDirectories()创建必要的目录:/布局'),0755,真);}if(!is_dir(resource_path('views/auth/passwords'))){mkdir(resource_path('views/auth/passwords''),0755,true);}}这里可以看到这个命令会创建两个文件夹,分别是resources/views/layouts和resources/views/auth/password2。将文件复制到目录后,在fire()方法中,createDirectories()后面,大概有这样一行代码:publicfunctionfire(){//othercodes...$this->exportViews();//其他代码...}然后exportViews()做事情是复制文件:protectedfunctionexportViews(){foreach($this->viewsas$key=>$value){if(file_exists(resource_path('views/'.$value))&&!$this->option('force')){if(!$this->confirm("[{$value}]视图已经存在。你想替换它吗?")){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():stub'));}可以看到,思路是这样的:1.获取原来定义的controller文件-->2.将{{namespace}}替换成getAppNamespace;这样我们就可以正确的判断控制器的命名空间。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:publicstaticfunctionroutes(){static::$app->make('router')->auth();}和最后在Illuminate\Routing\Router的auth()方法中执行路由注册:publicfunctionauth(){//routescodes...}最后,这些view文件,controller文件和routing文件在哪里?揭秘:就在vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make目录下,打开这个目录就可以看到这些魔法的真相了!HappyHacking结束记得关注codecast公众号,定时送书福利哦!