Self-Curation

新卒社会人で営業マンになりました

Laravel#5 ログイン情報に紐づけて投稿する

f:id:scuration:20200802232227p:plain

第2回目でユーザー認証機能、3回目で簡単な投稿フォームを作成しました。


今回はログインしているユーザー情報に紐づけた投稿機能を実装したいと思います。


ゴールとしては

・投稿時にログインユーザーのIDを取得
・投稿テーブルのuser_idに取得したログインユーザーIDを保存

という感じです。

ログイン時のみ投稿フォームにアクセス

ミドルウェアとは

ログインユーザーのみ投稿フォームにアクセスできるようにしたい。
ということで今回はミドルウェアを使います。


ミドルウェアそのものはHTTPリクエストを送ったときに、中間に差し込む処理のことです。


今回のケースでは投稿フォームを開くためのリクエストを送ったときに、ページを表示する前にユーザーがログインしているかチェックするミドルウェアを差し込みます。

ミドルウェアの使用方法


1つ目の方法はアクセスに認証制限を加えたいページのControllerにconstructで記述することです。


前回は新規投稿画面と投稿機能に対応するNewpostControllerを作成したのでこちらを編集します。

class NewpostController extends Controller
{
    //middlewareによる認証制限を追加
    public function __construct()
    {
        $this->middleware('auth');
    }

    //viewの表示
    public function Newpost() {
        return view('newpost');
}
}

投稿情報とUserテーブルを紐づける

リレーションの設定


modelファイルにテーブル同士の関係性を記述していきます。


今回は「1人のユーザーが複数の投稿を持つ」という一対多の関係になります。


まずuserは複数のpostsを持つのでApp\User.phpを開き、以下のように追記します。

class User extends Authenticatable
{
    use Notifiable;

   ---省略---
     //追記
    public function posts()
    {
        return $this->hasMany('App\Post'); 
    }
}


postsは1つのuserに属するのでApp\Post.phpには以下のように記述します。

class Post extends Model
{
    //追記
    public function user()
    {
        return $this->belongsTo('App\User');
    }
}


それぞれ単数形、複数形に注意してください。

Controllerにユーザー情報を継承


Authファサードを使用することで現在ログインしているユーザー情報を簡単に取得できる。


$user = Auth::user();
$id = Auth::id();
※このとき同Controller内にuse Illuminate\Support\Facades\Auth;を記述しておく必要あるので注意

Controllerのサンプル


①ログインしている状態でのみ投稿フォームを表示
②投稿時にログインユーザーのIDも登録


上記2つを反映したNewpostController.phpのコードを記載しておきます。

use Illuminate\Support\Facades\Auth;
use App\Post;
use App\User;
use Illuminate\Support\Facades\DB; 
use Illuminate\Support\Facades\Config; 

class NewpostController extends Controller
{
    //middlewareによる認証制限
    public function __construct()
    {
        $this->middleware('auth');
    }

    //viewの表示
    public function Newpost() {
        return view('newpost');
}
    public function create(Request $request) {

    // フォームに入力される情報
    $name = $request->input('name');
    $comment = $request->input('comment');

   //ログインしているユーザーIDを取得
    $user_id = Auth::id();

    Post::insert(
        [
           "name" => $name,
           "comment" => $comment,
           "user_id" => $user_id,
         ]);
}  
}
|php|<


*動作確認

上記で作成したフォームが実際に動作するか確認してみましょう。


いつものようにローカルサーバーを立ち上げます。
/newpostを開くと/loginに遷移しました。
[f:id:scuration:20200814010144p:plain]


田中太郎さんというテストアカウントを作成してログインしました。
user_idは「1」です。
[f:id:scuration:20200814010216p:plain]


投稿したあとにMyPHPAdminにログインしてみると、user_idに1番が入っておりました。