Webアプリ習作#8

前記事に引き続き主にこちらを参考にしました。
Laravel Socialiteを使ってTwitterアカウントでログイン機能 - Crieit

モデルのディレクトリ構成の変更

Laravelのプロジェクト作成時にUserモデルのファイル(User.php)がapp直下に自動生成されるが、app/Modelsディレクトリを作成しその下に移動させる
それに伴いUser.phpの中身も変更

namespace App;
↓
namespace App\Models;

また、プロジェクトディレクトリ以下を検索して

App\User

と書かれている箇所を

App\Models\User

に置換する
具体的には以下の三か所
app\Http\Controllers\Auth\RegisterController.php

use App\User;
↓
use App\Models\User;

config\auth.php

   'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],
↓
    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\Models\User::class,
        ],

database\factories\UserFactory.php

use App\User;
↓
use App\Models\User;
social_usersに対応するモデル作成

プロジェクトディレクトリで以下コマンドを実行

php artisan make:model Models/SocialUser

app\ModelsにSocialUser.phpが生成されたことを確認
app\Models\User.phpに以下のメソッドを追加してSocialUserモデルと連携

    public function socialUsers()
    {
        return $this->hasMany(SocialUser::class);
    }

app\Models\SocialUser.phpの方にも以下を追加

class SocialUser extends Model
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

これでusersとsocial_usersが連携される

callbackメソッドの実装

app\Http\Controllers\TwitterAuthController.phpに以下のuseキーワードの記述を追加

// ここからを追加.
use App\Models\User;
use App\Models\SocialUser;
use Auth;
use DB;
// ここまでを追加.
use Illuminate\Http\Request;
use Socialite;

同じくapp\Http\Controllers\TwitterAuthController.phpのcallbackメソッドを修正

    public function callback()
    {
        $providerUser = Socialite::driver('Twitter')->user();

        // 既存ユーザーか.
        $socialUser = SocialUser::where('provider_user_id', $providerUser->id)->first();

        if ($socialUser) {
            // 既存ユーザーならログインしてトップページへ.
            Auth::login($socialUser->user, true);
            return redirect('/');
        }

        // 新しいユーザーを作成.
        $user = new User();
        $user->unique_id = $providerUser->nickname;
        $user->name = $providerUser->name;
        $user->avatar = $providerUser->user['profile_image_url_https'];
        $user->bio = $providerUser->user['description'];

        $socialUser = new SocialUser();
        $socialUser->provider_user_id = $providerUser->id;

        DB::transaction(function () use ($user, $socialUser) {
            $user->save();
            $user->socialUsers()->save($socialUser);
        });

        // 作成したユーザーでログイン.
        Auth::login($user, true);
        return redirect('/');
    }
アクセス確認

ローカルサーバを起動してログインURLにアクセス
http://localhost:8000/auth/twitter
Twitterのアプリケーション認証画面を介してLaravelのホーム画面へ移行することを確認

DBを確認

psqlを起動してDBに接続

\c twiapp_db

テーブル一覧を表示してユーザー情報が一人分生成されていることを確認

select * from users;
select * from social_users;
再度ログイン確認

もう一度ログインURLにアクセスして正常にログインできることを確認
その後DBにアクセスしてデータが複数生成されていないことも確認