Written by Manabu Bannai

【Laravel】投稿機能を爆速でつくってみたよ【作り方】

Laravel PROGRAMMING

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便利です。

※P.S:無料メルマガで発信中:過去の僕は「ブログ発信で5億円」を稼ぎました。次は「30億円」を目指します。挑戦しつつ、裏側の思考を「メルマガ」から発信します。不満足なら1秒で解約できます。無料登録は「こちら」です。