2015年8月30日日曜日

Laravel標準の認証機能を利用していてハマる

Laravel標準の認証機能でユーザ追加やログインの処理が出来るのは分かったが、認証された状態では/homeにリダイレクトされてしまい困る。

ここにリダイレクトする輩は、
  • ¥Illuminate¥Foundation¥Auth¥RedirectsUsers@redirectPath
  • ¥Illuminate¥Foundation¥Auth¥ResetsPasswords@redirectPath
  • app¥Http¥Middleware¥RedirectIfAuthenticated@handle
のお三方である。

最初の二つは、ユーザ認証・登録やパスワードリセットの操作の時のみに発動するっぽいので、最後のが怪しい。で、このクラスを呼んでいるファイルを調べると、app¥Http¥Kernelであった。$routeMiddlewareという変数にこのクラスが設定されている。何のことかと言うと、

Laravel 5 の Global Middleware ではルートの名前がとれない?

なるほど、「特定のルートに割り当てる Middleware」のことのようだ。そして、その解釈からすると、このクラスは guestという特定のルートに割り当てられている様だ。

(続く)

2015年8月16日日曜日

Laravel5標準の認証機能

ログインに成功すると/homeというパスにリダイレクトされる。

これは、RedirectsUsersトレイトのredirectPathメソッドにハードコードされている。

但し、上記メソッド内の実装の通り、下記のプロパティを順番に調べて、プロパティが存在すればそちらを代わりに返す事になっている。
  1. redirectPath
  2. redirectTo
なるほどね。

この場合、最終的に RedirectsUsersトレイトの実装を使っているクラスはAuthControllerなので、こちらに上記のプロパティどちらかを実装して値を設定すれば、ログイン後のリダイレクト先を/homeから変更出来るというわけ。

ちなみに、調べてみると両者は下記のクラスのredirectPathメソッド内 で参照されている。
  • Illuminate/Foundation/Auth/RedirectsUsers.php
  • Illuminate/Foundation/Auth/ResetsPasswords.php
で、なんで二つあるんだろうと思ったのだが、過去のLaravelの更新履歴を見ると、どうやらredirectPathが正しく、redirectToは歴史的な理由(もしくは、過去のLaravelを使っているコードとの互換性の関係)で残されているっぽい。

When to set redirectPath property in Laravel 5 auth trait

なるほどね〜。ソースを見ると色々な事が分かりますな。

Homesteadのmysql

HomesteadのMySQLにログインする時は、HomesteadのVM上で下記のコマンドを打つ。

% mysql -u root -psecret homestead

あとはSHOW TABLESするなりお好きに。

2015年8月15日土曜日

LaravelとPHPのトレイト(Trait)とView周り色々

最近のPHPにはトレイト(Trait)という機能がある。初めて知った。

PHP: トレイト - Manual

要は、多重継承出来ない PHPで、実装をうまく再利用する為の機能らしい。私はC++で多重継承の経験があるけれど、確かにあれはとっちらかってワケが分からなくなるので、単一継承の方が良いと思う(Javaが単一継承を選んだ時もそう思った)が、実装を再利用するにはちょっと不便なのも事実。

PHPのトレイトでは、メソッドだけで無くプロパティも設定出来たり、抽象メソッドも設定出来たりする。殆ど実体化(instantiate)出来ないだけのクラスって感じだな。

クラス内でトレイトを指定すると、現クラスの実装→トレイトの実装→親クラスの実装、という順番で優先順位が設定され実装がオーバーライドされる。

で、例えばLaravelのAuthControllerAuthenticatesAndRegistersUsersトレイトを使っている。このAuthenticatesAndRegistersUsersトレイトは、AuthenticatesUsersトレイトとRegistersUsersトレイトを使っている。このAuthenticatesUsersトレイトが、例えばgetLogin, postLogin, getLogout等のメソッドの実装を持っている。

getLoginの実装ではauth.authenticateというViewがあればそれを、無ければauth.loginというViewを返す。このauth.loginというViewの名前は、自動的にプロジェクト内の/resources/views/auth/login.blade.phpというパスに変換され、該当するファイルを表示する。

HTML Formの表示には、Laravel5ではオプションになったHTMLヘルパを使う事が出来る。

Laravel5で新規データの作成

HTMLタグで書く事も出来るが、ヘルパを使うメリットとしては、HTMLタグにPHPコードを埋め込む際にタイプ(文字)数が減るとか、そういうメリットがあるというところか。