質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

3回答

1166閲覧

Laravel5にて、データベースから取得した値が空の際の対応

gobindar

総合スコア51

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2019/02/19 07:54

編集2019/02/20 00:39

お世話になっております。
当方Laravel5.5にてWebSiteを構築しております、
環境はmac OS Mojave10.14.2
ブラウザはGoogle Chrome バージョン: 71.0.3578.98になります。

やりたいこと

仮登録→メール認証→本登録の
機能を有するWebSiteで、
ログイン画面の挙動を下記の通りとしたいです。

<挙動の順序>
①ユーザーがログインするため、アドレスとパスワードを入力する
②アドレスとパスワードが正しければ、標準の機能通りログインする
アドレスもしくはパスワードが正しくない場合、
下記の手順でエラーを出す。

②-1
アドレスと一致するレコードを会員テーブルから
取得する。
②-2
なかった場合、(会員の登録進捗を表す)「status」に3をセットする。
あった場合、
a)
「status」が本登録済を表す
1であればログインする。
b)
レコードの項目「status」が1でなければ、
下記に合わせてエラーを出す。
i)仮会員登録済かつメール認証前(status:0)
ii)メール認証済かつ本登録前(status:2)
iii)退会済(status:9)
iv)例外(上記以外)

疑問

上記「挙動の順序」の②-2にて
アドレスが一致するレコードが
会員テーブルにない場合、
会員テーブルからレコードを取得する
返り値がnullになるかと存じますが、
その際にどのように「status」に3をセットするか
悩んでいます。
下記の現状でよいのかどうか、
ご教示頂けますと幸甚です。

現状

会員テーブルにアクセスし、
レコードを取得し、
空であった場合は\stdClassで
インスタンスを作成し、status項目に3
を入れています。

php

1 2 /* ログイン失敗時のメッセージ制御 */ 3 protected function sendFailedLoginResponse(Request $request) 4 { 5 $user = User::where('email', $request->email)->first(); 6 if (empty($user)) { 7 $user = new \stdClass; 8 $user ->status = 3; 9 } 10 11 if($user->status === 0 or $user->status === 2){ 12 $url_main_registration = url('/register_individual/verify/'.$user->email_verify_token); 13 throw ValidationException::withMessages( 14 [ 15 $this->username() => [trans('auth.failed_provisional')], 16 $this->url_main_registration() => [trans($url_main_registration)] 17 ]); 18 }elseif($user->status === 9){ 19 throw ValidationException::withMessages([ 20 $this->username() => [trans('auth.failed_quit')], 21 ]); 22 }else{ 23 throw ValidationException::withMessages([ 24 $this->username() => [trans('auth.failed')], 25 ]); 26 } 27 }

宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/02/19 08:00

>「挙動の順序」のc 挙げられてないようですが・・
gobindar

2019/02/19 08:01

大変失礼致しました。 記載を修正致しましたので、 再度ご確認頂けますと幸甚です。
xenbeat

2019/02/23 08:17

> $user = new \stdClass; Laravelで(フレームワークを使っていて)ビルトインクラスを使うというのは、そもそも設計がまずいです。 やりたいこととロジックを整理しましょう。 sendFailedLoginResponseは名前の通り「ログインを試みたあとに失敗のレスポンスを作る」ところです。
gobindar

2019/02/24 02:45

xenbeat様 コメント有難うございます。 結局、アドレスが一致するレコードがなかった場合に エラーを出したかっただけだったので、 ifを1段階ネストにして対処しました。 低レベルなご質問で申し訳ありませんでした…。 <修正後のコーディング> /* ログイン失敗時のメッセージ制御 */ protected function sendFailedLoginResponse(Request $request) { $user = User::where('email', $request->email)->first(); if (empty($user)) { throw ValidationException::withMessages([ $this->username() => [trans('auth.failed')], ]); } else{ if($user->status === 0 or $user->status === 2){ $url_main_registration = url('/register_individual/verify/'.$user->email_verify_token); throw ValidationException::withMessages( [ $this->username() => [trans('auth.failed_provisional')], $this->url_main_registration() => [trans($url_main_registration)] ]); }elseif($user->status === 9){ throw ValidationException::withMessages([ $this->username() => [trans('auth.failed_quit')], ]); }else{ throw ValidationException::withMessages([ $this->username() => [trans('auth.failed')], ]); } } }
xenbeat

2019/02/24 04:37

自己解決として質問をクローズください。
guest

回答3

0

Laravelには初めから認証の仕組みがあるのでそれを使う。
ログインの仕組みをあえて自作したいのであれば、Laravelを使わない。
https://readouble.com/laravel/5.5/ja/authentication.html

投稿2019/02/19 15:44

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gobindar

2019/02/20 00:41

Kosuke_Shibuya様 ご回答ありがとうございます。 大変失礼致しました。 記載に一部誤りがありましたので、修正致しました。 標準の認証の仕組みを利用した上で、 エラー表示の箇所をカスタマイズしております。 再度ご質問を確認頂けますでしょうか。
guest

0

質問者が初学者の前提で回答します
最近のログインシステムにおいて、以下の方法は不適切です。

②アドレスとパスワードが合致するレコードを

テーブルから取得する。

パスワード検証方法を再検討してください。
大きく設計が変わるので、この質問はあまり意味を持たなくなります。

投稿2019/02/19 14:31

編集2019/02/19 15:34
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gobindar

2019/02/20 00:40

te2ji様 ご回答ありがとうございます。 大変失礼致しました。 ご質問に記載させて頂きました内容に誤りがありましたので、 修正させて頂きました。 私がカスタマイズしている部分は、 標準のログイン機能のうち、 エラーを出力する部分のみです。
guest

0

自己解決

アドレスが一致するレコードがなかった場合に
エラーを出したかっただけだったので、
ifを1段階ネストにして対処しました。
ご回答頂いた皆様、有難うございました。

<修正後のコーディング>
/* ログイン失敗時のメッセージ制御 */
protected function sendFailedLoginResponse(Request $request)
{
$user = User::where('email', $request->email)->first();
if (empty($user)) {
throw ValidationException::withMessages([
$this->username() => [trans('auth.failed')],
]);
}
else{
if($user->status === 0 or $user->status === 2){
$url_main_registration = url('/register_individual/verify/'.$user->email_verify_token);
throw ValidationException::withMessages(
[
$this->username() => [trans('auth.failed_provisional')],
$this->url_main_registration() => [trans($url_main_registration)]
]);
}elseif($user->status === 9){
throw ValidationException::withMessages([
$this->username() => [trans('auth.failed_quit')],
]);
}else{
throw ValidationException::withMessages([
$this->username() => [trans('auth.failed')],
]);
}
}
}

投稿2019/02/24 09:31

gobindar

総合スコア51

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問