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

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

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

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

Laravel 5

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

Q&A

解決済

4回答

1375閲覧

プログラムにおける共通処理について

T.FUJII

総合スコア21

PHP

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

Laravel 5

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

0グッド

1クリップ

投稿2018/05/09 03:24

編集2018/05/09 04:19

it新人のエンジニアです。お手柔らかにお願いします。

###前提・実現したいこと

①共通処理を関数化したいです。
②上記にあたり神クラスを使っていいのかがわかりません。

全体の流れ

電話番号やメールアドレスやホームページアドレスに対し、下記のような正規表現をかけるプログラムを書きました。しかし、正規表現は随所で使われており、ライブラリに神クラスを作りそこにstaticメソッドとしてまとめたいなと考えました。その関数化の方法がいまいちわかりません。(そもそも神クラスはダメだなどという記事をよく見ますが・・・)

それぞれの正規表現で、マッチした場合はそのマッチした値を、マッチしなかった場合はエラー文を$err_data配列に格納しその後の処理は飛ばし、次のループに行くようにしています。

このような書き方を見て、こうするべきという書き方などあれば、ご教授いただければ幸いです。

###該当のソースコード

php

1 2 // csvファイル読み込み処理(略) 3 4 foreach ($file as $key => $row) { 5 list( 6 $company_id, 7 $employment_site_id, 8 $company_name, 9 $phone_number, 10 $mail_address, 11 $home_page_url, 12 ) = $row; 13 14 // 電話番号の存在確認 15 if ($phone_number) { 16 // 電話番号は正しい形式か? 17 if (preg_match('/([0-9]{2,4}-[0-9]{2,4}-[0-9]{3,4})/', $phone_number, $match)) { 18 $phone_number = $match[0]; 19 } else { 20 $err_data[] = "会社ID ${company_id} の電話番号 ${phone_number} の形式が違います。確認してください"; 21 continue; 22 } 23 } 24 25 // メールアドレスの存在確認 26 if ($mail_address) { 27 // メールアドレスは正しい形式か? 28 if (preg_match('/[\w.\-]+@[\w\-]+.[\w.\-]+/', $mail_address, $match)) { 29 $mail_address = $match[0]; 30 } else { 31 $err_data[] = "会社ID ${company_id} のメールアドレス ${mail_address} の形式が違います。確認してください"; 32 continue; 33 } 34 } 35 36 // ホームページアドレスの存在確認 37 if ($home_page_url) { 38 // ホームページアドレスが正しい形式か? 39 if (preg_match('/(http|https|ftp)://([A-Z0-9][A-Z0-9_-]*(?:.[A-Z0-9][A-Z0-9_-]*)+):?(\d+)?/?/i', $home_page_url, $match)) { 40 $home_page_url = $match[0]; 41 } else { 42 $err_data[] = "会社ID ${company_id} のホームページアドレス ${home_page_url} の形式が違います。確認してください"; 43 continue; 44 } 45 } 46 47 //DBインサート処理(略) 48

###補足情報(言語/FW/ツール等のバージョンなど)

開発環境:Vagrant + VirtualBox / Homestead
本番環境:CentOS7 nginx MySQL PHP7.2
言語:PHP 7.2.3 (cli)(NTS)
フレームワーク:Laravel5.5 (LTS)
サーバー:nginx
DB:MySQL

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

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

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

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

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

m.ts10806

2018/05/09 04:24 編集

Laravel 5の機能でできることが沢山あるように思うのですが、LaravelのValidationについては確認してみたのでしょうか(ドキュメントに結構ありますよ)
T.FUJII

2018/05/09 08:03

ご回答ありがとうございます。Validationについて使い方がわかっていなかったので確認しました。
guest

回答4

0

ベストアンサー

そもそも、Laravel5.5を使っているんですよね?
そうであれば、その様な神クラスはいらないと思います。
例えば、E-Mailのチェックであれば

php

1$this->validate($request, [ 2 'email' => 'required|email', 3 ]);

で十分でしょう。
CSVファイルのチェックとして使うのであれば、

php

1foreach ($fileContents as $fileContent){ 2 $validator = Validator::make($fileContent, $rules); 3 $validator->validate(); 4 }

としても良いです。
どの様なValidationが出来るかはこちらのサイトが参考になります。

標準にない場合も、カスタムバリデーションを作れるのでそれを使うようにするのがおススメです。

投稿2018/05/09 04:20

motuo

総合スコア3027

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

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

T.FUJII

2018/05/09 08:13

すみません読み足りませんでした。Validator::makeのやり方ご教授いただきありがとうございます。
guest

0

よほど例外的なものがないかぎりバリデートであれば標準関数で良いような気がします

PHP

1filter_var($mailaddress, FILTER_VALIDATE_EMAIL); 2filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED);

また電話番号のパターン「/([0-9]{2,4}-[0-9]{2,4}-[0-9]{3,4})/」は、
間違ってると思うので、きちんと調べられないならヤラないほうがマシだと思います
(もしくは数字と-だけチェックするとかそのレベルで)

投稿2018/05/09 03:46

yambejp

総合スコア114771

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

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

maisumakun

2018/05/09 03:51

たしかに、これでは市外局番が5桁の地域は通りませんね。
T.FUJII

2018/05/09 03:55

ご回答ありがとうございます。正規表現の知識があまりなく、どこかのサイトに転がっていたものを流用しました。5桁の地域があるのですね・・・ 参考にさせていただきます。
yambejp

2018/05/09 07:04

入力の制限については、現有の市外局番をチェックすべきですが 統合などで変更になった場合柔軟に対応できるか課題があります {2,4}{2,4}{3,4}だと最短で2+2+3、最長で4+4+4になるので これもバリデートとしては微妙 結局なにを弾きたいのかというのが目的になるので 数値とハイフン以外の文字はNG、最大でハイフン込みで13桁まで くらいが落とし所でしょう。 (最初は0から始まるとかくらいは気にしてもよい)
T.FUJII

2018/05/09 08:17

みなさま >> ご回答ありがとうございます。正規表現って奥が深くて難しいですね。転がっていた正規表現もいろいろな基準で書かれたものだと思うので、むやみにコピペして使うのはダメでした。
m.ts10806

2018/05/09 08:19

正規表現チェッカー というサイトがあるのでそちらをご活用されては? 今回はいずれにしてもLaravelの機能を使う方が賢明だと思います。
T.FUJII

2018/05/09 08:27

mts10806様 > 承知しました。ご教授ありがとうございます!
guest

0

質問の日本語がよく理解できません。コード見ての感想です

DB のデータを信用するのであれば、処理として必要を感じません。
DB のデータを信用出来ないのであれば、list での代入は乱暴すぎます。

投稿2018/05/09 03:34

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

T.FUJII

2018/05/09 03:58

ご回答ありがとうございます。だいぶ掲載個所を端折ってしまったのですが、 全体の流れとしてはインポートしたCSVを行展開し、そのCSVファイルに入力されているデータ(電話番号やメールなど)の形式が正しければ、DBにレコードを挿入するというプログラムになります。
退会済みユーザー

退会済みユーザー

2018/05/09 04:06 編集

であれば、list で一括代入は乱暴ですね。 validate メソッドを使用し、代入してあげるのがきれいかと。
T.FUJII

2018/05/09 08:10

validateメソッドというのは、csvを展開した配列に使えるのでしょうか?
guest

0

staticな関数を作るのはもちろん構わないのですが、それを1クラスに集めた「神クラス」を作ってしまうのは、デメリットしかないと考えます(1つのクラス内のコードが長くなれば、解読するための手間は長さ以上の速度で増加していきます)。

意味論ごとに1つのクラスとして切っておきましょう。

投稿2018/05/09 03:33

maisumakun

総合スコア145183

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

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

T.FUJII

2018/05/09 04:02

もうすでにそうなりつつあるので、その神クラスのリファクタと、今回の関数について考えてみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問