Fippiyのプログラム学習内容アウトプットBlog

日々の学習内容をアウトプットして振り返りを実施する。

Laravel開発、ISBNレコードを複数登録する【3】処理コードを見直す

複数ISBN登録は作成できましたが、一部修正を行うことにしました。

ISBN未入力については結果を表示しないことと、処理状況が分かりやすいコードに修正を行っていきます。

最終目的

ISBNコードを10件まで1フォームから入力して登録できるようにする

今回の目的

  • ISBNが送信されなかった場合は対象外にする
  • ISBNコード処理状況が明確に分かるようにする

なぜやるか

  • 未入力データに対しての結果は不要と判断して表示させないようにするため
  • 三者がコードを確認しても、処理状況が分かるコードに修正するため

やりたいこと

  • ISBN未入力を対象外にする

  • 不要となった処理を削除する
  • 処理状況が分かりやすいようにする
  • バリデーションエラーを活用する

やったこと

  • ISBN未入力時は配列にデータをいれない
  • 処理ステータスを格納する変数を準備する
  • 処理ステータスが分かりやすい様に変数の値をセットする
  • 全件未入力時はバリデーションによって元のフォームにエラー表示する 

実施内容

ISBN未入力データは結果表示内容から対象外にする

登録されていません大量表示

複数登録を意識したページですが、必ずしも10件全部登録するとは限りません。

f:id:Fippiy:20190518092901p:plain

登録結果

しかしこのままでは、2・3件登録するだけなのに、大量に登録されていません表示がでてしまいます…。

 

入力なしの時は結果出力から除く

そこで、未入力時はフォームデータ受け取り後の処理で対象から外すことにしました。

// 処理用配列へ追加
for ($i = 0; $i < $count; $i++){
 if ($isbns['isbn'.$i] != null){
  $isbnrecords = array(
   'number' => $i+1,
   'isbn' => $isbns['isbn'.$i],
   'msg' => null,
  );
 }
}
$count = count($isbnrecords);

if文を追加しisbn!=null時に処理、つまり入力データがある場合は処理することにしました。一方で配列内に番号を記録する様にしているので、結果出力時に番号がずれることはなくなっています。

 

不要となった処理を削除する

ISBNコードなしは除外としたので、ISBNが登録されていないメッセージは必要なくなりました。処理対象から削除します。

変更前

// フォームデータ評価
for ($i = 0; $i < $count; $i++){
 if ($isbnrecords[$i]['process'] == 'processing'){ // 処理変数が処理中の場合は処理を実施する
  if (mb_strlen($isbnrecords[$i]['isbn']) == null){
   data_set($isbnrecords[$i], 'msg', 'ISBNが登録されていません'); // 未登録時はメッセージ格納
  } elseif (mb_strlen($isbnrecords[$i]['isbn']) != 13){
   data_set($isbnrecords[$i], 'msg', '桁数が13桁ではありません。');
   // 13桁でない場合はメッセージ格納

 変更後

// フォームデータ評価
for ($i = 0; $i < $count; $i++){
 if ($isbnrecords[$i]['process'] == 'processing'){ // 処理変数が処理中の場合は処理を実施する
  if (mb_strlen($isbnrecords[$i]['isbn']) != 13){
   data_set($isbnrecords[$i], 'msg', '桁数が13桁ではありません。');
   // 13桁でない場合はメッセージ格納

  

ISBNコード処理状況を分かりやすくする 

処理ステータスの扱いを再検討する

入力されたISBNに対して処理結果メッセージをnullとしておき、処理が完了した段階でメッセージを記録して、以降の処理をスキップしていました。

メッセージなし=処理中、メッセージあり=処理完了

この処理ルールが分かっている本人は処理内容が分かります。

しかし、それをしらない他の方がこのif文による$msg=nullだけを見て、メッセージなしで処理を行うことに違和感を覚えるかもしれません。

そこで、処理ステータスが明確に分かるように変更することにしました。

 

処理状況変数を追加する 

配列作成時に処理状況変数を用意しました。

// 処理用配列へ追加
for ($i = 0; $i < $count; $i++){
 if ($isbns['isbn'.$i] != null){
  $isbnrecords = array(
   'process' => 'processing',
   'number' => $i+1,
   'isbn' => $isbns['isbn'.$i],
   'msg' => null,
  );
 }
}
$count = count($isbnrecords);

配列にデータを格納している箇所です、初めは全レコード処理中となるこで、processにprocessingステータスをいれることにしました。

処理状況=処理中となります。これで「ああ、処理というステータスがあって処理しているところなんだな」と明確にわかります。

「メッセージ=なしで処理中となんだな…」とは明らかにちがいますね…。

 

以降のコードについてメッセージなし=処理中として扱うをprocessが処理中の時処理を行うに再設定する。

 

処理方法変更によるコード修正を行う

処理方法が変更になったので、全体的にコードを修正します。

 

以下は、配列格納完了直後の内容です。

変更前

// フォームデータ評価
for ($i = 0; $i < $count; $i++){
 if ($isbnrecords[$i]['msg'] == null){ // メッセージ格納済みは対象外

変更後

// フォームデータ評価
for ($i = 0; $i < $count; $i++){
 if ($isbnrecords[$i]['process'] == 'processing'){ // 処理変数が処理中の場合は処理を実施する

処理ステータスが処理中であるなら処理をします…と変更しました。

文字通りの意味となり、これであれば機械的にも動作しますし、誰が見ても処理中なので処理をしていると分かります。

こちらについては、この後の処理でも同じ記述がありますので、同様に全て変更しました。

 

処理完了ステータス変更を追加する 

処理が完了したデータに対しての完了処理を追加します。

// フォームデータ評価
for ($i = 0; $i < $count; $i++){
 if ($isbnrecords[$i]['process'] == 'processing'){ // 処理変数が処理中の場合は処理を実施する
  if (mb_strlen($isbnrecords[$i]['isbn']) != 13){
   data_set($isbnrecords[$i], 'msg', '桁数が13桁ではありません。');
   // 13桁でない場合はメッセージ格納
   data_set($isbnrecords[$i], 'process', 'error'); // 処理ステータスエラー

ISBN処理の冒頭部分です、ISBNが13桁でない場合は$msgに結果を返していました。

この時にprocessとしては処理が終了となるので、processingから変更しておく必要があります。

今回の仕様ではprocessingからerrorとしました、processingかどうかの判定しかしていないので、completionとしてもよかったのですが、異常終了ということでerrorとしています。完了方法によっていずれ処理を追記する場合に変化させることが出来そうですが、今回は正常処理完了とそうでない場合で分けることとしました。

 

ISBN全件未入力時はバリデーションエラーとする

全件未入力時に結果表示画面を出す必要はない

複数ISBN登録ページの最終的に表示するイメージです。

f:id:Fippiy:20190517152743p:plain

入力フォーム

ここから入力したISBNコード毎に処理を実施しますが、1件も登録せずにボタンをおすと、そもそもデータがないため処理結果画面を表示する必要は有りません。

表示したところで、ISBN未入力時は結果を表示しない様に変更しましたので、何も表示されません。

全件未入力時はバリデーションによってエラーを返して、エラー表示することにしました。

f:id:Fippiy:20190517152931p:plain

バリデーションエラー

 

バリデーターを追加する

フォームデータ受け取り後の処理を追加しました。

public function postIsbnSome(Request $request){

 // フォームデータ取得
 unset($request['_token']); // トークン削除
 $isbns = $request->all(); // isbnコードをフォームから取得
 $count = count($isbns); // 取得件数
 $isbnrecords = ; // データ格納用配列

 // 処理用配列へ追加
 for ($i = 0; $i < $count; $i++){
  if ($isbns['isbn'.$i] != null){
   $isbnrecords = array(
    'process' => 'processing',
    'number' => $i+1,
    'isbn' => $isbns['isbn'.$i],
    'msg' => null,
   );
  }
 }

 // ISBN登録がない場合はバリデーションエラー
 if ($isbnrecords == null) {
  $isbnvalid = false;
 } else {
  $isbnvalid = true;
 }
 $validator = Validator::make(['isbnrecords' => $isbnvalid],
  ['isbnrecords' => 'accepted'], ['ISBNコードが入力されていません']);
 if ($validator->fails()) {
  return redirect('book/isbn_some')
  ->withErrors($validator)
  ->withInput();
 }
 $count = count($isbnrecords);

ISBNコードがない場合は配列登録を除外していました。

今回全て除外した場合、結果として配列にはなにも残らないので、なにもない状態=1件も登録していないという判断でバリデーションしてエラーを返すことにしました。

しかし、空の配列を変数にいれておかないと評価できないので、はじめに配列であることの宣言を追加しました。

$isbnrecordsに1件もデータがない…つまりnullのままである場合はバリデーションエラーとして処理して入力フォームにリダイレクトさせています。

 

以上で今回の複数ISBNコードによる一括登録処理に関しては完了です。

入力フォームの数を増やすという形で複数件対応させました。

データ入力方法は他にもあるので、より大量にデータを登録できる手段も作成をしてみたいと思っています。