【Laravel5】EloquentとAuth No.2

【Laravel5】EloquentとAuth No.1

guards

【Laravel5】EloquentとAuth No.2

こちらのサイトのまとめです。

Easy Auth – Laravel5 Fundamentals

GitHubにサンプルプロジェクトがあります。

ryo-ogata/learning-laravel-5

はじめに

Laravel5には簡単で役に立つ認証処理モジュールが含まれています。今回はこれらを中心に紹介したいと思います。前回の記事に引き続き、認証処理から記事登録を行う画面を実装していきます。

記事(articles)を修正する

認証はこれで実装できました。実際には、ここで認証したユーザー情報をArticleControllerでも使いたいかと思います。Laravel5では、この処理も簡単に実装することができます。

  1. 記事登録画面を編集する。
    • resources/views/article/form.blade.php

      前回まで、仮に設定していたhidden項目を削除しましょう。

  2. 記事登録処理を編集する。
    • app/Http/Controllers/ArticleController.php

      LL言語出身ではない方は、違和感があるかもしれません。普通は(語弊がありますが)、$article['user_id'] = $request->get('user_id')と書きたいところです。

      しかし、EloquentORMだと、Auth->user()というのが認証したユーザーを取得し、さらにそのまま記事コレクション(1対Nのため)を取得し、$articleを保存することができます。とても簡単ですね。Auth::user()->articles()は前回紹介したEloquent ORMのリレーションを利用しています。

      • なぜsave()メソッドが呼べるのか?

        articles()はご期待の通りコレクションを関数ですが、なぜか単体の$articleを保存するためのsave()メソッドを呼び出すことができます。以下のコマンド出力を見てください。

        このようにするとCollectionが取得でき、

        これはクラス名がIlluminate\Database\Eloquent\Relations\HasManyクラスとなっています。これがさらにIlluminate\Database\Eloquent\Relations\HasOneOrManyクラスを継承していて、そこにsave()メソッドがあります。ここで親オブジェクトUserの値をモデルに追加しているようです。

        jQueryのDOM操作などでも使われているように、1件、または複数件のオブジェクトをあたかも同じかのように扱うということなので、デザインパターンでいうところのCompositeパターンを想像すれば理解しやすいかと思います。そのへんはLL言語らしく簡単に吸収できているようです。

  3. 記事を登録する。

    まずはログインします。

    http://localhost:8000/auth/login

    ログインに成功し、記事一覧画面にリダイレクトしました。

    【Laravel5】EloquentとAuth No.1
    【Laravel5】EloquentとAuth No.1

    記事を登録してみましょう。

    http://localhost:8000/articles/create

    【Laravel5】EloquentとAuth No.1
    【Laravel5】EloquentとAuth No.1
    【Laravel5】EloquentとAuth No.1
    【Laravel5】EloquentとAuth No.1
  4. 確認する

    まずはユーザーを取得します。

    続いて、記事を取得します。

    しっかりとuser_id付きで登録されています。

  5. 今回の実装をコマンドラインのみで実現してみます。(補足)

まとめ

<

p>認証情報をAuth::user()で受け取り、そのユーザー情報を元に記事を登録することができました。
何も気にせずにユーザー情報を取得できるのは大きなメリットではないかなと思います。

次回は特定のリクエストに対してのみ処理を追加したりできるミドルウェアと呼ばれる機能について、紹介したいと思います。

Comments are closed, but trackbacks and pingbacks are open.