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

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

ただいまの
回答率

88.13%

laravelのバリデーションについて

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,621

score 21

前提・実現したいこと

フォームから送信されたCSVファイルをバリデーションしたいです。具体的にはcsvファイルかどうかを調べた後、SqlFileObjectを使い、CSVファイルを開いて行展開し、list関数を使い変数 $phone_number に格納して、その変数に対して、正規表現をかけてバリデーションしています。$request以外の変数などをvalidate()を使いバリデーションできますでしょうか?

※追記
CSVファイルのレコードを変数に展開して、
その変数の電話番号に対して正規表現をかけたいです。

該当のソースコード

    /**
     * CSVデータインポート処理
     *
     * @author Fujii Tatsuya
     * @since  2018-03-16
     * @param  Request $request CSVファイル
     */
    public function update(Request $request)
    {
        // ファイルアップロード判定
        if (!is_uploaded_file($_FILES["csvfile"]["tmp_name"])) {
            $err_msg = 'ファイルが選択されていません。';
            return redirect('/import')->with('err_msg', $err_msg);
        }

        // ファイルパス格納
        $file_path = $_FILES["csvfile"]["tmp_name"];
        // ファイルネーム格納
        $file_name = $_FILES["csvfile"]["name"];

        // 拡張子判定
        if (pathinfo($file_name, PATHINFO_EXTENSION) != 'csv') {   
            $err_msg = 'CSVファイルのみ対応しています。';
            return redirect()->route('import.edit')->with('err_msg',  $err_msg);
        }

        // エラーデータのメッセージの格納
        $err_datas = collect($this->uploadCsv($file_path));
        $msg = "ファイルアップロードが完了しました";
        return view('rikunavis.edit', compact('msg', 'err_datas'));
【uploadCsv】
    private function uploadCsv(string $file_path)
    {
        // csvファイル読み込み
        $file = new SplFileObject($file_path);
        $file->setFlags(SplFileObject::READ_CSV);

        // エラー行を格納する配列を定義
        $err_data = [];

        foreach ($file as $key => $row) {

            // ヘッダ無視
            if ($key === 0) continue;

            list(
                $company_id,
                $employment_site_id,
                $company_name,
                $phone_number,
                $created_at,
                $updated_at
            ) = $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;
                }

以下略

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

開発環境:Vagrant + VirtualBox / Homestead
言語:php-7.1.14 (NTS)
フレームワーク:Laravel5.5 (LTS)
サーバー:nginx
DB:MySQL

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • aro10

    2018/03/22 15:09

    validate()などを使い正規表現バリデーションはできますでしょうか? > どの範囲をどの条件でどのようにしたいかを明確にしないと、適切な回答は得にくいかと思います。

    キャンセル

回答 1

checkベストアンサー

0

$request以外の変数などをvalidate()を使いバリデーションできますでしょうか?

コントローラで、リクエストの変数以外をバリデーションにかけて、失敗時にValidationExceptionを発生させるのであれば以下です。
Laravel 5.5 バリデーション 自動リダイレクト

Validator::make(["title"=>"xxx","body"=>"xxx"], [
    'title' => 'required|unique:posts|max:255',
    'body' => 'required',
])->validate();

コントローラで、ValidationExceptionを発生させずにバリデーションの判定結果を得るのは以下です。
Laravel 5.5 バリデーション バリデータの生成

$validator = Validator::make(["title"=>"xxx","body"=>"xxx"], [
            'title' => 'required|unique:posts|max:255',
            'body' => 'required',
        ]);

        if ($validator->fails()) {
            //失敗時の処理
        }

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/03/23 17:45

    ありがとうございます。調べと記述が甘かったです。

    キャンセル

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

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

関連した質問

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