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

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

ただいまの
回答率

90.75%

  • PHP

    19178questions

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

  • Laravel 5

    1692questions

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

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

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 278

T.FUJII

score 15

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

前提・実現したいこと

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

全体の流れ

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

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

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

該当のソースコード

        // csvファイル読み込み処理(略)

        foreach ($file as $key => $row) {
            list(
                $company_id,
                $employment_site_id, 
                $company_name,
                $phone_number,
                $mail_address,
                $home_page_url,
            ) = $row;

            // 電話番号の存在確認
            if ($phone_number) {
                // 電話番号は正しい形式か?
                if (preg_match('/([0-9]{2,4}-[0-9]{2,4}-[0-9]{3,4})/', $phone_number, $match)) {
                    $phone_number = $match[0];
                } else {
                    $err_data[] = "会社ID ${company_id} の電話番号 ${phone_number} の形式が違います。確認してください";
                    continue;
                }
            }

            // メールアドレスの存在確認
            if ($mail_address) {
                // メールアドレスは正しい形式か?
                if (preg_match('/[\w.\-]+@[\w\-]+\.[\w.\-]+/', $mail_address, $match)) {
                    $mail_address = $match[0];
                } else {
                    $err_data[] = "会社ID ${company_id} のメールアドレス ${mail_address} の形式が違います。確認してください";
                    continue;
                }
            }

            // ホームページアドレスの存在確認
            if ($home_page_url) {
                // ホームページアドレスが正しい形式か?
                if (preg_match('/(http|https|ftp):\/\/([A-Z0-9][A-Z0-9_-]*(?:\.[A-Z0-9][A-Z0-9_-]*)+):?(\d+)?\/?/i', $home_page_url, $match)) {
                    $home_page_url = $match[0];
                } else {
                    $err_data[] = "会社ID ${company_id} のホームページアドレス ${home_page_url} の形式が違います。確認してください";
                    continue;
                }
             }

        //DBインサート処理(略)

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mts10806

    2018/05/09 13:17 編集

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

    キャンセル

  • T.FUJII

    2018/05/09 17:03

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

    キャンセル

回答 4

checkベストアンサー

+4

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

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


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

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


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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/09 17:13

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

    キャンセル

+2

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/09 13:02

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

    キャンセル

+2

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/09 12:58

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

    キャンセル

  • 2018/05/09 13:05 編集

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

    キャンセル

  • 2018/05/09 17:10

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

    キャンセル

+2

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/09 12:51

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

    キャンセル

  • 2018/05/09 12:55

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

    キャンセル

  • 2018/05/09 15:22

    5桁については昔は郡部などでよく使われていましたが、市町村合併諸々でほとんどなくなりましたね。

    参考:日本における市外局番の変更#現存する5桁市外局番
    https://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E5%B8%82%E5%A4%96%E5%B1%80%E7%95%AA%E3%81%AE%E5%A4%89%E6%9B%B4#%E7%8F%BE%E5%AD%98%E3%81%99%E3%82%8B5%E6%A1%81%E5%B8%82%E5%A4%96%E5%B1%80%E7%95%AA

    キャンセル

  • 2018/05/09 16:04

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

    キャンセル

  • 2018/05/09 17:02

    使ったことないですが、Laravelではお手軽電話番号チェックのパッケージもありますね。
    https://github.com/Propaganistas/Laravel-Phone

    キャンセル

  • 2018/05/09 17:17

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

    キャンセル

  • 2018/05/09 17:19

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

    キャンセル

  • 2018/05/09 17:27

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

    キャンセル

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

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    nginxをlinux入れたのですがphp-fpmのドキュメントルートを変更出来ない

    nginxのドキュメントルートを変更したいのですが、その方法が分かりません。 /etc/nginx/nginx.confに include conf.d/*.conf と書かれて

  • 解決済

    nginxの動作状況を確認したい

    nginxでwebサーバを構築したのですが、意図した動作を行わないため、設定を切り分けて行きたいと考えてます。 現在、try&errで進めているのですが、もっとわかりやすくす

  • 解決済

    nginxでPHPのGETパラメータ rewriteの方法

    server {     listen       80;     server_name sample.net;     root /var/www;     chars

  • 解決済

    URLを検知して配列に格納したい

    お世話になっております。 URLとタイトルがカンマ区切りで含まれている配列を読み込み、ドメインが格納されている配列を検知させたいのですが、 エラー文が表示されてしまいうまく

  • 解決済

    【PHP】ログイン機能の実装

    PHP初心者です。 PHPの勉強がてら、会員制のページを作成してます。 新規会員登録機能は実装できていますが、 ログイン機能の実装がうまくいきません。 やりたいことを実

  • 解決済

    nginx-websocketサーバーのSSL設定

    現在、websocketサーバーにnginxを導入してSSL化したいと考えています。 プロキシサーバーとしてSSL化のみをおこなう予定です。 初心者で、初めてnginxに触れるので

  • 解決済

    php7での仕様変更?

    先日このサイトでお聞きしたことの派生なのですが、メールをトリガーとしてphpを起動させるという方法についてお教えください。 メールをトリガーとしてphpを起動させる方法については当

  • 解決済

    Fatal error: Uncaught exception 'PDOException'

    Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity co

同じタグがついた質問を見る

  • PHP

    19178questions

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

  • Laravel 5

    1692questions

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