概要
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
<?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
<?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
<!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を以下のように修正
// 'required' => 'The :attribute field is required.',
'required' => ':attribute は必須項目です。',
あとは使用言語を日本語にする
ついでにtimezoneも日本にしとく
// 'locale' => 'en',
'locale' => 'ja',
// 'timezone' => 'UTC',
'timezone' => 'Asia/Tokyo',
あとはStoreBlogPost.phpの最後に以下追加
public function attributes()
{
return [
'title' => 'タイトル',
'body' => '本文',
];
}
これでエラー表示も日本語化した
⑦まとめ
今後はデータベース入力して表示させるところまで作成していきたい