laravel5.4

初めてのlaravel ~laravel5.4でのバリデーションチェックのみ~

概要

laravel(フレームワーク)を全くの未経験でlarave5.4を触った
入力フォームを作成しようとしたがあまり5.4の記事がなかったため
全然うまくいかず色々探してやっとできたので備忘として残しておく

以下参考したサイトと全く同じことを自分用にまとめただけ
Laravel5.3のValidationとFormRequest

⓪環境

お名前.comの vpsサーバ

cat /etc/redhat-release 
CentOS Linux release 7.3.1611 (Core)

php

php -v
PHP 7.0.20 (cli) (built: Jun  7 2017 07:50:14) ( NTS )
Copyright (c) 1997-2017 The PHP Group

mysql(使わないけど一応)

mysql -V
mysql  Ver 14.14 Distrib 5.7.18, for Linux (x86_64) using  EditLine wrapper

laravel

php artisan --version
Laravel Framework 5.4.30

①下準備

・プロジェクト作成(sampleというプロジェクト作成)

composer create-project --prefer-dist laravel/laravel sample

・プロジェクトフォルダへ移動

cd sample

・.envファイルの修正(今は使ってないからいらないが一応)
mysqlを使用するため以下修正(usenameを各自の環境に合わせる)

vi .env

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=<usename>
DB_USERNAME=<usename>
DB_PASSWORD=<usename>

.envなければコピーしてファイルを作成+アプリケーションkeyを作成する

cp -pi .env.example
php ./artisan key:generate

・フォルダ所有者変更(apache使用時はnginxをapacheに読み替え)

sudo chown -R nginx:nginx storage
sudo chown -R nginx:nginx bootstrap/cache

②リクエストクラスを作成

以下コマンドでリクエストクラスを作成する

php artisan make:request StoreBlogPost

クラスと作成すると
app/Http/Requests 配下にStoreBlogPost.phpが作成されるため編集

・バリデーションのルール定義
titleとbodyの要素にrequired(必須)というルールを設定

app/Http/Requests/StoreBlogPost.php

StoreBlogPost.php
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreBlogPost extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'title' => 'required', // nameがtitleの要素は必須という意味
            'body' => 'required', // nameがbodyの要素は必須という意味
        ];
    }
}

③コントローラ作成する

以下コマンドでコントローラ作成

php artisan make:controller PostController

コントローラもリクエストと同様にPostController.phpが作成されるため編集する
今回はデータの入力はしないためfunction storeは記載していない
ポイントは
use App\Http\Requests\StoreBlogPost;
を追加していること
useの意味がわからなかったので最初はうまくいかなかった。
詳しくはクラスの名前空間とuse宣言

app/Http/Controllers/PostController.php

PostController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests\StoreBlogPost;

class PostController extends Controller
{
    /**
     * フォーム画面を返すメソッド
     * @return View
     */
    public function create()
    {
        return view('validation');
    }
    /**
     * 記事投稿するメソッド
     * 投稿処理はなく、バリデーションに成功したらリクエストを表示する処理とする
     * @param  StoreBlogPost
     */
    public function store(StoreBlogPost $request)
    {
        dd($request);

        // 記事投稿の処理など...
    }
}

④画面作成

resources/views/validation.blade.php

validation.blade.php
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Validation Test</title>
  <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
  <div class="container">
    <h1>バリデーションのテスト</h1>

    <!-- エラーメッセージの表示 -->
    @if (count($errors) > 0)
      <div class="alert alert-danger">
        <ul>
          @foreach ($errors->all() as $error)
            <li>{{ $error }}</li>
          @endforeach
        </ul>
      </div>
    @endif

    <form action="{{ url('post') }}" method="post">
      <!-- csrf対策対策のトークンの -->
      {{ csrf_field() }}

      <div class="form-group @if (! empty($errors->first('title'))) has-error @endif">
        <label>タイトル</label>
        <span class="help-block">{{ $errors->first('title') }}</span>
        <input type="text" name="title" class="form-control" value="{{ old('title') }}">
      </div>

      <div class="form-group @if (! empty($errors->first('body'))) has-error @endif">
        <label>本文</label>
        <span class="help-block">{{ $errors->first('body') }}</span>
        <textarea name="body" class="form-control">{{ old('body') }}</textarea>
      </div>

      <input type="submit" value="投稿">
    </form>
  </div>

  <script src="https://code.jquery.com/jquery-2.2.4.min.js" integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44=" crossorigin="anonymous"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
</body>
</html>

⑤ルーティング設定

vi routes/web.php

//追記する
// フォーム画面を表示するルート
Route::get('post/create', 'PostController@create');
// バリデーションを行うルート
Route::post('post', 'PostController@store');    

ここまでできたら一旦画面表示させてみる

php artisan serve --host 0.0.0.0 --port 8000

で domain:8000/post/create
にアクセス

きちんとできていれば入力フォームが作成されているはず

permission deniedでうまくいかなかったらsudo で試す。

sudo php artisan serve --host 0.0.0.0 --port 8000

⑥エラー表示の日本語化

resources/lang/enをコピーしてjaフォルダを作成

cp -pr resources/lang/en resources/lang/ja

作成したjaフォルダのvalidation.phpを編集
requiredを以下のように修正

resources/lang/ja/validation.php
//    'required'             => 'The :attribute field is required.',
      'required'             => ':attribute は必須項目です。',

あとは使用言語を日本語にする
ついでにtimezoneも日本にしとく

config/app.php
//    'locale' => 'en',
      'locale' => 'ja',

//    'timezone' => 'UTC',
      'timezone' => 'Asia/Tokyo',

あとはStoreBlogPost.phpの最後に以下追加

app/Http/Requests/StoreBlogPost.php
   public function attributes()
    {
        return [
            'title' => 'タイトル',
            'body' => '本文',
        ];
    }

これでエラー表示も日本語化した

⑦まとめ

今後はデータベース入力して表示させるところまで作成していきたい

参考
Laravel5.3のValidationとFormRequest