🖥️

【Laravel】php artisan make:auth で実行される処理内容

2022/07/16に公開

はじめに

php artisan make:authは、認証機能を手軽に実装できるLaravel標準で用意されているコマンドです。大変便利でよく使用していたのですが、Laravel側で実際にどのような処理が実行されているのかを知らなかったので調べることにしました。

目的

当記事の目的は、php artisan make:authコマンドによって実行される処理を明らかにすることです。

環境

FW バージョン
Laravel 5.5.50

結論

下記の4つが実行されます。

  1. ディレクトリ作成
  2. view作成
  3. Controller作成
  4. ルーティング記述
Illuminate\Auth\Console\AuthMakeCommand.php
public function handle()
{
    $this->createDirectories();  // ①ディレクトリ作成

    $this->exportViews();        // ②view作成

    if (! $this->option('views')) {
        file_put_contents(    // ③Controller作成
            app_path('Http/Controllers/HomeController.php'),
            $this->compileControllerStub()
        );

        file_put_contents(       // ④route記述
            base_path('routes/web.php'),
            file_get_contents(__DIR__.'/stubs/make/routes.stub'),
            FILE_APPEND
        );
    }

    $this->info('Authentication scaffolding generated successfully.');
}

1. ディレクトリ作成

viewsディレクトリ下に、下記のディレクトリを作成します。

  • /layouts
  • /auth/passwords
Illuminate\Auth\Console\AuthMakeCommand.php
protected function createDirectories()
{
    if (! is_dir($directory = resource_path('views/layouts'))) {
        mkdir($directory, 0755, true);
    }

    if (! is_dir($directory = resource_path('views/auth/passwords'))) {
        mkdir($directory, 0755, true);
    }
}

2. view作成

下記のviewを作成します。

  • auth/login.blade.php
  • auth/register.blade.php
  • auth/passwords/email.blade.php
  • auth/passwords/reset.blade.php
  • layouts/app.blade.php
  • home.blade.php
Illuminate\Auth\Console\AuthMakeCommand.php
protected function exportViews()
{
    foreach ($this->views as $key => $value) {
        if (file_exists($view = 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,
            $view
        );
    }
}

$this->viewsの中身がこちらです。

Illuminate\Auth\Console\AuthMakeCommand.php
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',
];

3. Controller作成

HomeController.phpを作成します。

Illuminate\Auth\Console\AuthMakeCommand.php
public function handle()
{
    ~~~~省略~~~~
    if (! $this->option('views')) {
        file_put_contents(    // ③Controller作成
            app_path('Http/Controllers/HomeController.php'),
            $this->compileControllerStub()
        );
    ~~~~省略~~~~
}

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

4. ルーティング記述

routes/web.phpにルーティングを記述します。

Illuminate\Auth\Console\AuthMakeCommand.php
public function handle()
{
   ~~~~省略~~~~
    file_put_contents(       // ④route記述
        base_path('routes/web.php'),
        file_get_contents(__DIR__.'/stubs/make/routes.stub'),
        FILE_APPEND
    );
    ~~~~省略~~~~
}

routes.stubの内容をweb.phpに記述します。

Illuminate\Auth\Console\stub\make\routes.stub
Auth::routes();

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

ちなみに、Auth::routes();の内容はこちらに記述されています。

Illuminate\Routing\Router.php
public function auth()
{
    // Authentication Routes...
    $this->get('login', 'Auth\LoginController@showLoginForm')->name('login');
    $this->post('login', 'Auth\LoginController@login');
    $this->post('logout', 'Auth\LoginController@logout')->name('logout');

    // Registration Routes...
    $this->get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
    $this->post('register', 'Auth\RegisterController@register');

    // Password Reset Routes...
    $this->get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
    $this->post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
    $this->get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
    $this->post('password/reset', 'Auth\ResetPasswordController@reset');
}

まとめ

php artisan make:authでは下記の4つの処理が実行されます。

  1. ディレクトリ作成
  2. view作成
  3. Controller作成
  4. ルーティング記述

今までは意識せずに魔法のコマンドとして使用してきましたが、処理内容を理解するとカスタマイズしやすくなったりするので個人的には知っておいて損はないなと感じました。

Discussion