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

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

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

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

PHP

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

Q&A

解決済

1回答

980閲覧

【PHP】条件分岐のベストプラクティスを教えていただきたいです

saori777

総合スコア6

Laravel

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

PHP

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

0グッド

0クリップ

投稿2021/06/22 00:47

編集2021/06/22 00:55

エラーは発生しておりません。

ただ
「どっちの方がより最適なんだろう?」
というのが判断できず教えていただきたいです、、、

質問内容

1.Bladeファイルの条件分岐はURLによる分岐で良いか 2.Controllerの条件分岐はinputの有無による分岐で良いか

条件分岐のベストプラクティス(エラーが出ない)について知りたいです。

DBへの登録機能を実装しております。

<form>タグで<input>の値を渡してcontrollerでDB登録といった基本的な形です。 APIは使っておりません。

異なるURLに対して、同じbladeファイル及びcontrollerファイルを使い回して、URLやinputの有無によって条件分岐させて「表示」及び「登録」機能を実装しております。

その際、「条件分岐」の方法がいくつかあるため、「いずれの方法がエラーが起きない設計になるんだろう?」の解がわからず、質問させていただきたいです。

既に問題なく動作は確認済みです。

【条件分岐例】
例1.createのcontrollerでsessionを渡す
例2.URLによる条件分岐
例3.inputの有無による条件分岐
例4.その他

現状

同じbladeファイル、同じcontrollerを使い回して登録機能を実装しております。

// ルーティング設定 Route::get('/register-teacher', [RegisteredController::class, 'create']); Route::get('/register-student', [RegisteredController::class, 'create']); Route::post('/register-teacher', [RegisteredController::class, 'store'])->name('register.user'); Route::post('/register-student', [RegisteredController::class, 'store'])->name('register.user');

blade

1<form method="POST" action="{{ route('register.user') }}"> 2 <input name="name" type="text"> 3 <input name="password" type="password"> 4 @if(Request::is('register-user')) 5 <input name="student-name" type="text"> 6 @elseif(Request::is('register-user')) 7 <input name="teacher-name" type="text"> 8 @endif 9 <button type="submit">登録</button> 10</form>

RegisteredController.php

1// 関数のみ抜粋 2public function create(array $input) 3{ 4 // 先生の場合 5 if($input['teacher-name']) { 6 // バリデーションチェック 7 Validator::make($input, [ 8 'name' => ['required', 'string', 'max:255'], 9 'password' => ['required', 'string', 'max:255' ,new Password, 'confirmed'], 10 'teacher-name' => ['required', 'string', 'max:255'] 11 ])->validate(); 12 13 // DB登録フロー 14 $account = Account::create([ 15 'name' => $input['name'], 16 'password' => Hash::make($input['password']), 17 'teacher-name' => $input['teacher-name'], 18 ]); 19 // 生徒の場合 20 } elseif($input['student-name']) { 21 // バリデーションチェック 22 Validator::make($input, [ 23 'name' => ['required', 'string', 'max:255'], 24 'password' => ['required', 'string', 'max:255' ,new Password, 'confirmed'], 25 'student-name' => ['required', 'string', 'max:255'] 26 ])->validate(); 27 28 // DB登録フロー 29 $account = Account::create([ 30 'name' => $input['name'], 31 'password' => Hash::make($input['password']), 32 'student-name' => $input['student-name'], 33 ]); 34 } 35}

添付したコードに問題がある場合、またはより最適な方法がある等ありましたら、教えていただけると幸いです。

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

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

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

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

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

m.ts10806

2021/06/22 00:50

現状でなにか問題が起きているのでしょうか
saori777

2021/06/22 00:52

いえ、問題は起きておりません。 ただ、controllerの条件分岐について、URLやinputなど、条件分岐の方法がいくつかあるため、知見が深い皆様からどのように記述した方がより最適なのかを教えていただきたい次第です。
m.ts10806

2021/06/22 01:09

1つのゴールへの道は1つではないので「最適」というのはなくて結局好みや現場でのルールに依存します。 なので「ベストプラクティス」のように曖昧に求めるより、具体的な方向性を示したほうがアドバイス得られやすくなると思います。
hoshi-takanori

2021/06/22 03:03

ユーザーが 2 種類 (先生と生徒) あって、その処理をどう分けるべきかってことでしょうか。 分岐をどうするか以前に、登録に必要な情報や、ログイン後にアクセスできる範囲や権限が違ったりしますよね。 DB のユーザーテーブルを分けるか (分けた場合、同じ ID で先生と生徒の登録を許すか)、登録やログインのページを分けるか、似た内容のページだけど先生の方が情報量が多い場合、同じページでユーザーを見て出し分けるか、それとも別のページにするか、などなど、考えるべきことはいろいろありそう…。
saori777

2021/06/22 05:43

ご丁寧に有難うございます。 テーブルは以下のように分けております。 accounts teachers students accountsにログイン周り、teachersとstudentsにそれぞれ追加の情報を付与しております。 account_idをFKとして紐付けております。 登録情報などは基本的同じなので、同じcontrollerやbladeファイルを使用しており、bladeファイル及びcontrollerファイルはteacherかstudentによって表示などを切り分けております。 特に気になるのがcontrollerファイルの方で、現状は$input['teacher-name']の有無でteacherの処理かstudentの処理かを条件分岐しているのですが、 1.URLで分岐させる 2.sessionを持たせる などなど、分岐させる方法は色々あるなと感じており、何が良いか検討がつかずご相談させていただいた次第です。 いずれの方法でもエラーは出ないと思いますが、何がより良いのかを教えていただきたかった次第です。
退会済みユーザー

退会済みユーザー

2021/06/22 17:36

teratailでは「ベストプラクティス」とか「最適」とかいう単語を使ってしまうと、超絶面倒くさいヤツを召喚してしまいます。気を付けてください!!
hoshi-takanori

2021/06/22 17:51

「何がより良いのか」を判断するには、そもそも何のためにプログラムを作っていて、何を重視するかによります。 普通の学校のサイトなら、セキュリティが最重要かと思いますし、そもそも自分で登録する形にはならないような。 teratail のようなネット上でお互いに教え合うサイトなら、気軽に登録できるようにすることが重視されるでしょう。 また、実運用を考えないプログラミングの練習なら、お好きなように試行錯誤すれば良いのでは。
guest

回答1

0

自己解決

みなさま、ご丁寧に対応していただき有難うございました。
質問が抽象的すぎたので、みなさまの回答を持って終了とさせていただきます。

投稿2021/06/23 01:31

saori777

総合スコア6

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問