
前回、LaravelのインストールとAuth機能で管理画面を作成しました。
→ https://liberty-dock.com/business_post/53044/
Auth機能で作成した管理画面は初期状態だとhomeになっているので、adminに変更して、データベース保存の機能を追加して行きたいと思います。
データベースの保存処理まとめ
今回作成する内容はこれらす。
- ルーティングの設定
- フォームの作成
- バリデーションの作成
- リレーションの設定
- 保存処理の作成
ルーティングの設定
ブラウザでアクセスした時に何を表示させるの設定です。
Route::get('foo', function () {
return 'Hello World';
});
このようにルーティングを設定すると、http://example.com/fooにアクセスしたらHello Worldが表示されます。
ルーティングはcontrollerを指定することも可能です。
Route::get('/user', 'UserController@index');
http://example.com/userにアクセスするとUserControllerで作成したindexが表示されます。
毎回ページを指定するのはめんどくさいので、Route::resourceを使ってまとめて指定することも可能です。
Route::resourceを使ったときの対応表はこちら。
動詞 | URI | アクション |
GET | /admin/post | index |
GET | /admin/post/create | create |
POST | /admin/post | store |
GET | /admin/post/{id} | show |
GET | /admin/post/{id}/edit | edit |
PUT/PATCH | /admin/post/{id} | update |
DELET | /admin/post/{id} | destroy |
Auth機能で作ったのでadminの下層ページにpostを作成してRoute::resource設定します。
Route::resource('/admin/post', 'PostController');
ここで設定した、PostContorollerにデータベースへの保存処理を記述していきます。
フォームの作成
フォームはviewで作成します。
blog/resources/views/admin/post/create.blade.phpにフォームを作成します。
セキュリティ対策の@csrf以外は特に変わったところはありません。
actionはRoute::resourceで設定されたstoreにするので/admin/postとなります。
<form action="/admin/post" method="post">
@csrf
<div class="form-group">
<label for="title">タイトル</label>
<input class="form-control" type="text" name="title" value="">
</div>
<div class="form-group">
<label for="content">本文</label>
<textarea class="form-control" name="content"></textarea>
</div>
<div class="form-group">
<button class="btn btn-block btn-info">決定</button>
</div>
</form>
PostControllerのcreate部分に作成したcreate.blade.phpを設定すればフォームの作成は完了です。
コントローラーの作成
PostController.phpを作成します。
$ php artisan make:controller PostController --resource
ログインしないとアクセスできないように、コンストラクタに設定します。
public function __construct()
{
$this->middleware('auth');
}
createに先程作ったフォームを設定します。
public function create()
{
return view('admin.post.create');
}
バリデーションの作成
正しい値をデータベースに保存するために、値をチェックします。
laravelにはバリデーションが予め準備されているので、設定するだけでバリデーションを作成できます。
PostContorollerにuse Validatorを宣言し、storeに設定を記述していきます。
public function store(Request $request)
{
$rules = [
'title' => 'required',
'content' => 'required',
];
$messages = [
'required' => '必須項目です。',
];
Validator::make($request->all(), $rules, $messages)->validate();
}
$rulesにバリデーションの設定を記述し、今回はrequiredで必須好奥に設定します。
$messageはバリデーションに引っかかった場合に表示させるエラーベッセージです。
設定しないとデフォルトで準備されている英語のエラーメッセージが表示されます。
最後のvalidate()は、バリデーションにひっかかったらフォームのページに自動でリダイレクトされる設定です。
リダイレクトされたフォームでエラーメエセージが表示されるようにし、入力されている値はそのままなるように記述します。
<form action="/admin/post" method="post">
@csrf
<div class="form-group">
<label for="title">タイトル</label>
<input class="form-control" type="text" name="title" value="{{old('title')}}">
<p>{{$errors->first('title')}} </p>
</div>
<div class="form-group">
<label for="content">本文</label>
<textarea class="form-control" name="content">{{old('content')}}</textarea>
<p>{{$errors->first('content')}} </p>
</div>
<div class="form-group">
<button class="btn btn-block btn-info">決定</button>
</div>
</form>
保存処理の作成
バリデーションを通過したらデータベースへの保存処理を書きます。
まずpostsという名前でデータベースを作成するのでマイグレーションのコマンドを打ちます。
$ php artisan make:migration create_posts_table
作成されたマイフレーションに今回利用するtitleとcontentのカラム追加の記述を書きます。
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('title');
$table->longText('content');
$table->timestamps();
});
}
マイグレーションを実行すればデータベースが作成されます。
$ php artisan migrate
次にmodelを作成します。
$ php artisan make:model Post
modelに利用するカラムを設定します。
設定したカラムしか利用することはできません。
protected $fillable = ['title', 'content'];
保存する準備ができました。
まず、use App\Postで利用するテーブルの宣言をします。
そして、PostControllerのstoreで作ったバリデーションの下に保存処理を記述していきます。
public function store(Request $request)
{
$rules = [
'title' => 'required',
'content' => 'required',
];
$messages = [
'required' => '必須項目です。',
];
Validator::make($request->all(), $rules, $messages)->validate();
//保存処理
$data = $request->except('_token');
$p = new Post();
$p->fill($data)->save();
return redirect('/admin');
}
保存が完了したらリダイレクトさせて保存処理は完了です。
コメント