Laravel 源码解读:php artisan make:auth
學 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/layouts 和 resources/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\Router 的 auth() 方法:
public function auth(){// routes codes ...}最后揭秘
那么這些視圖文件,控制器文件和路由文件在哪呢?揭秘:就在 vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make 目錄,你打開這個目錄就可以看到這些魔法的真相!
Happy Hacking
最后記得關注 codecasts 公眾號,定期送書送福利!
總結
以上是生活随笔為你收集整理的Laravel 源码解读:php artisan make:auth的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 总结6月的成果
- 下一篇: 为什么说能源管理是分布式光伏发电的突破口