【Laravel】投稿機能を爆速でつくってみたよ【作り方】
Laravelで投稿機能を作成しました。
備忘録的に開発手順を公開しておきます。
完成予想図は以下です。
それでは、さっそくまとめていきます。
ポストテーブルをつくる
$ php artisan migrate:make create_users_table
生成されたファイルに以下を記述する
<?php
use IlluminateDatabaseSchemaBlueprint;
use IlluminateDatabaseMigrationsMigration;
class CreatePostsTable extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('posts', function($table){
$table->increments('id');
$table->unsignedInteger('author_id');
$table->string('title');
$table->string('read_more');
$table->text('content');
$table->string('area');
$table->timestamps();
$table->engine = 'MyISAM';
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('posts');
}
}
マイグレートします
$ php artisan migrate
ここまででDBの設定が完了です。
ポストコントローラーを作成する
$ php artisan controller:make PostController
ルーティングの設定
Route::resource('posts', 'PostController');
ポストコントローラーで投稿機能に必要なメソッドをつくる
public function create()
{
return View::make('posts.create');
}
public function store()
{
$rules = [
'title' => 'required',
'content'=>'required',
'category' => 'required',
'area' => 'required',
];
$messages = array(
'title.required' => 'タイトルを正しく入力してください。',
'content.required' => '本文を正しく入力してください。',
'category.required' => 'カテゴリーを選択してください。',
'area.required' => '地域を選択してください。',
);
$validator = Validator::make(Input::all(), $rules, $messages);
if ($validator->passes()) {
$post = new Post;
$post->title = Input::get('title');
$post->content = Input::get('content');
$post->price = Input::get('price');
$post->category = Input::get('category');
$post->area = Input::get('area');
$post->read_more = (strlen($post->content) > 120) ? substr($post->content, 0, 120) : $post->content;
$post->save();
return Redirect::route('posts.create')
->with('success', '投稿が完了しました。');
}else{
return Redirect::route('posts.create')
->withErrors($validator)
->withInput();
}
}
ここまでで投稿機能のバックエンド処理は完成です。
投稿フォームをつくる
@extends('layouts.default')
@section('content')
<h1>投稿ページ</h1>
{{-- 投稿完了時にフラッシュメッセージを表示 --}}
@if(Session::has('success'))
<div class="bg-info">
<p>{{ Session::get('success') }}</p>
</div>
@endif
{{ Form::open(['route' => 'posts.store'], array('class' => 'form-horizontal')) }}
<div class="form-group">
{{-- バリデーションのエラー表示 --}}
@foreach($errors->get('title') as $message)
<span class="bg-danger">{{ $message }}</span>
@endforeach
<label for="title" class="col-sm-2 control-label">※タイトル</label>
<div class="col-sm-10">
<input name="title" type="text" class="form-control">
</div>
</div>
<div class="form-group">
{{-- バリデーションのエラー表示 --}}
@foreach($errors->get('category') as $message)
<span class="bg-danger">{{ $message }}</span>
@endforeach
<label for="category" class="col-sm-2 control-label">※カテゴリー</label>
<div class="col-sm-10">
<select name="category" type="text" class="form-control">
<option></option>
<option>1</option>
<option>2</option>
<option>3</option>
</select>
</div>
</div>
<div class="form-group">
{{-- バリデーションのエラー表示 --}}
@foreach($errors->get('area') as $message)
<span class="bg-danger">{{ $message }}</span>
@endforeach
<label for="area" class="col-sm-2 control-label">※地域</label>
<div class="col-sm-10">
<select name="area" type="text" class="form-control">
<option></option>
<option>1</option>
<option>2</option>
<option>3</option>
</select>
</div>
</div>
<div class="form-group">
{{-- バリデーションのエラー表示 --}}
@foreach($errors->get('content') as $message)
<span class="bg-danger">{{ $message }}</span>
@endforeach
<label for="content" class="col-sm-2 control-label">※本文</label>
<div class="col-sm-10">
<textarea name="content" type="text" rows="5" class="form-control"></textarea>
</div>
</div>
<div class="form-group">
<label for="price" class="col-sm-2 control-label">料金</label>
<div class="col-sm-10">
<input name="price" type="text" class="form-control">
</div>
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary">投稿する</button>
</div>
{{ Form::close() }}
@stop
フロントエンドも完成しました。
あとは、ポストモデルをつくっておわりです。
ポストモデルをつくる
<?php
class Post extends Eloquent{
protected $fillable = ['title', 'content', 'category', 'area'];
}
以上で完成です。Laravel便利です。