🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

Q&A

解決済

3回答

1035閲覧

laravelのフォームリクエストを使用し要件を満たしたい。

twinparadox

総合スコア42

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

0グッド

0クリップ

投稿2019/12/05 13:46

編集2019/12/10 05:10

現在学習内容を元にアウトプットを試みています。行き詰まってしまったのでこちらで質問させて頂きたいです。

環境 Laravel Framework 6.5.0
#問題点
フォームリクエストを使用してバリデーション機能を実装させたい

#現状どのようになっているか
新規登録ページからバリデーションが通ったらホームへ遷移させ、通らなければ新規登録ページでエラーを表示させたいが、登録ボタンからでは/Signupへしか遷移されない。
URLを直接/Homeと入力すれば遷移されるのでGETは通ってそうです。

###要件

※以下の条件を満たせていない場合エラーを表示させホーム画面へ遷移させない。
パスワードが7文字以上
パスワードが確認用と一致している
全ての項目が入力されている

以下ソースコード

web.php

<?php /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('/', function () { return view('welcome'); }); Route::get('Login', 'UserController@Login')->name('Login'); Route::get('Signup', 'UserController@Signup')->name('Signup'); Route::get('Home', 'UserController@Home')->name('Home'); Route::group(['middleware' => ['web']], function () { Route::post('Home', 'UserController@postCreate'); });

UserController.php

namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests\CreateUserRequest; class UserController extends Controller { public function Login() { return view('Lessons.Login'); } public function Signup() { return view('Lessons.Signup'); } public function Home(Request $request) { $name = $request->input('name'); return view('Lessons.Home', compact('name')); } public function postCreate(CreateUserRequest $req) { /** * 拡張クラスに書いたルールでリクエストが自動的に検証される    * バリデーションをパスするとこの後の処理が実行される    */ $this->userService->createUser($req->all()); return view('Lessons.Home'); } }

CreateUserRequest.php

namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class CreateUserRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; } /** * パスワード7文字以上 * パスワード(確認用)の入力チェック * 全ての項目が入力されているか * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'username' => 'required|max:20', 'email' => 'required|email|max:100', 'password' => 'required|min:7|confirmed', // ]; } }

home.blade.php

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>home</title> <link rel="stylesheet" type="text/css" href="login.css" media="all" /> <style> .top-username { position: absolute; right: 120px; top: 18px; color: lightcoral; text-decoration: none; } .top-logout { position: absolute; right: 30px; top: 18px; color: lightcoral; text-decoration: none; } #form { background: #053352; background-image: -webkit-linear-gradient(top, #053352, Courier New); background-image: -moz-linear-gradient(top, #053352, Courier New); background-image: -ms-linear-gradient(top, #053352, Courier New); background-image: -o-linear-gradient(top, #053352, Courier New); background-image: linear-gradient(to bottom, #053352, Courier New); -webkit-border-radius: 6; -moz-border-radius: 6; border-radius: 6px; font-family: Courier New; color: #ffffff; font-size: 30px; padding: 20px 20px 20px 20px; text-decoration: none; text-align: center; } </style> </head> <body> <p><a class="top-username" href={{ route('Home')}}>username</a></p> <p><a class="top-logout" href={{ route('Login')}}>ログアウト</a></p> <br> <br> <br> <br> <br> <div id="form"> <form method="POST" action="/Home"> <p>Welcome!</p> <p>Your Home Page!</p> </form> </div> </body> </html>

signup.blade.php

@extends('layouts.Loginapp') @section('title') 新規登録 @endsection @section('form') <p>名前</p> <p class="name"><input type="text" name="name" maxlength="32" autocomplete="OFF" /></p> <p>メールアドレス</p> <p class="mailaddress"><input type="text" name="mailaddress" maxlength="32" autocomplete="OFF" /></p> <p>パスワード</p> <p class="password"><input type="password" name="password" maxlength="32" autocomplete="OFF" /></p> <p>パスワード(確認用)</p> <p class="Confirm password"><input type="password" name="password_confirmation" maxlength="32" autocomplete="OFF" /></p> <p class="submit"><input type="submit" value="登録" class="top-username" href={{ route('Home')}}></p> @endsection

loginapp.blade.php

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>@yield('title')</title> <link rel="stylesheet" type="text/css" href="login.css" media="all" /> <style> body, p, form, input { margin: 0 } .top-login { position: absolute; right: 120px; top: 18px; color: lightcoral; text-decoration: none; } .top-signup { position: absolute; right: 30px; top: 18px; color: lightcoral; text-decoration: none; } #form { width: 350px; margin: 30px auto; padding: 20px; border: 1px solid #555; } form p { font-size: 14px; } .form-title { font-size: 20px; text-align: center; margin-bottom: 20px; border-bottom: solid 3px #fff; " } .name { margin-bottom: 20px; } .mailaddress { margin-bottom: 20px; } .password { margin-bottom: 20px; } .confirm password { margin-bottom: 20px; } input[type="text"], input[type="password"] { width: 350px; padding: 4px; font-size: 14px; margin: 0 auto; } .submit { text-align: center; } /* skin */ #form { background: #053352; background-image: -webkit-linear-gradient(top, #053352, Courier New); background-image: -moz-linear-gradient(top, #053352, Courier New); background-image: -ms-linear-gradient(top, #053352, Courier New); background-image: -o-linear-gradient(top, #053352, Courier New); background-image: linear-gradient(to bottom, #053352, Courier New); -webkit-border-radius: 6; -moz-border-radius: 6; border-radius: 6px; font-family: Courier New; color: #ffffff; font-size: 20px; padding: 20px 20px 20px 20px; text-decoration: none; } .submit input { background: #f78181; background-image: -webkit-linear-gradient(top, #f78181, #f78181); background-image: -moz-linear-gradient(top, #f78181, #f78181); background-image: -ms-linear-gradient(top, #f78181, #f78181); background-image: -o-linear-gradient(top, #f78181, #f78181); background-image: linear-gradient(to bottom, #f78181, #f78181); -webkit-border-radius: 8; -moz-border-radius: 8; border-radius: 8px; -webkit-box-shadow: 1px 1px 3px #666666; -moz-box-shadow: 1px 1px 3px #666666; box-shadow: 1px 1px 3px #666666; font-family: Courier New; color: #ffffff; font-size: 16px; padding: 10px 20px 10px 20px; text-decoration: none; } .submit input:hover { background: #f5c7c7; background-image: -webkit-linear-gradient(top, #f5c7c7, #f5c7c7); background-image: -moz-linear-gradient(top, #f5c7c7, #f5c7c7); background-image: -ms-linear-gradient(top, #f5c7c7, #f5c7c7); background-image: -o-linear-gradient(top, #f5c7c7, #f5c7c7); background-image: linear-gradient(to bottom, #f5c7c7, #f5c7c7); text-decoration: none; } #form { background: #053352; background-image: -webkit-linear-gradient(top, #053352, Courier New); background-image: -moz-linear-gradient(top, #053352, Courier New); background-image: -ms-linear-gradient(top, #053352, Courier New); background-image: -o-linear-gradient(top, #053352, Courier New); background-image: linear-gradient(to bottom, #053352, Courier New); -webkit-border-radius: 6; -moz-border-radius: 6; border-radius: 6px; font-family: Courier New; color: #ffffff; font-size: 20px; padding: 20px 20px 20px 20px; text-decoration: none; } </style> </head> <body> <p><a class="top-login" href={{ route('Login')}}>ログイン</a></p> <p><a class="top-signup" href={{ route('Signup')}}>新規登録</a></p> <br> <br> <br> <br> <br> <br> <div id="form"> <p class=form-title>@yield('title')</p> <form method="GET" action="/Home"> @yield('form') </form> </div> </body> </html>

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

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

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

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

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

m.ts10806

2019/12/05 22:40

Laravelのバージョンを記載してください。 今のコードにおける問題点を記載してください(でないと「あとはよろしく」という作業依頼です) あとできれば1質問1要件にしてください。3つの要件が必ず連動しているなら良いのですが、今回は単独でも実装可能なものです。 ひとつひとつ解決していきましょう。 それに学習したことの成果物ですよね?本当に全く検討がつかない内容を成果物として求められるとは思えません
guest

回答3

0

ざっとコードを見た限りで、「FormRequestの実装」という目線でおかしいなと思う点です。

■ CreateUserRequestrequiredにしている入力欄が、view側に存在しないこと。
viewの「名前」と「メールアドレス」のname属性が間違っているのか、CreateUserRequest側が間違っているのか・・・どちらかですね。

■ viewの「パスワード(確認用)」の入力欄のname属性が期待するものではないこと。
validationのconfirmedを使う場合、確認欄のname属性は命名規則を守る必要があります。

現状何が問題なのかが書かれていないので、他にも問題はあるのかもしれませんが、
とりあえずは、これらを解決しないとvalidationは通らないと思いますよ。

投稿2019/12/09 02:41

mix-peach

総合スコア1910

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

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

twinparadox

2019/12/09 08:40

ご返信ありがとうございます。 ■ CreateUserRequestでrequiredにしている入力欄が、view側に存在しないこと。 こちらはSignup.blade.phpに用意しております。 ■ viewの「パスワード(確認用)」の入力欄のname属性が期待するものではないこと。 こちらは自分も調べてみてname="password_confirmation"としなければならない事が分かったので修正しております。 現状の問題点としては「新規登録ページ」からバリデーションが通れば「Home」に遷移して、通らなければ遷移させない動きをさせたいです。
twinparadox

2019/12/09 08:42

他にも修正した箇所を変更してます。
mix-peach

2019/12/10 00:55

>■ CreateUserRequestでrequiredにしている入力欄が、view側に存在しないこと。 >こちらはSignup.blade.phpに用意しております。 【名前欄】 CreateUserRequest → username  に required signup.blade.php → name 【メールアドレス欄】 CreateUserRequest → email に required signup.blade.php → mailaddress と、なっていますよ? > 「新規登録ページ」からバリデーションが通れば「Home」に遷移して、通らなければ遷移させない動きをさせたい したいことは分かりましたが、したいことに対して「現状はどの様になっているのか」も追記してください。
twinparadox

2019/12/10 05:03

返信ありがとうございます。 Request側とview側のそちらの部分は整合性を持たないといけないのですね。 勉強になります。 現状はどのようになっているかについて追記致します。
guest

0

①親レイアウトで<form>タグを使用していた為Signup.blade.phpにおいては<form>タグを使用していませんでした。

②CreateUserRequest.phpにおいての名付けとview側での名付けが違った為修正しました。

親身になって回答して下さった方々ありがとうございました。

投稿2019/12/12 12:51

twinparadox

総合スコア42

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

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

0

自己解決

①親レイアウトにて<form>タグを使用していた為

Signup.blade.php

において<form>タグが存在しませんでした。

②バリデーションの名付けがview側と一致していませんでした。

投稿2019/12/12 12:46

twinparadox

総合スコア42

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問