Boilerplate Laravel 3 : Membuat CRUD Post

Boilerplate Laravel 3  Membuat CRUD Post


Pada tutorial  laravel sebelumnya kita sudah membuat CRUD Category , Kali ini kita akan membuat CRUD Post 


Tutorial Sebelumnya - Boilerplate Laravel 2 : Membuat CRUD Category


Yang pertama kita akan membuat database dengan cara membuat model post bersamaan dengan migrasi tabel post


Membuat model post


Buka cmd dan masuk ke folder project kalian, ketikan code di bawah


C:\xampp\htdocs\blog>php artisan make:model Post -m


Maka otomatis akan membuat file model dan migrasi, silahkan buka file migrasi yg tdi di buat di dalam folder database/migration dan edit seperti dibawah ini.


    public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->text('content');
$table->integer('id_category');
$table->string('featured');
$table->timestamps();
});
}


Setelah itu simpan dan jalan code dibawah ini 


C:\xampp\htdocs\blog> php artisan migrate


Maka akan ada tabel baru yg bernama posts


tutorial laravel crud post

Karena tabel post berelasi dengan tabel category maka kita akan membuat eloquent dengan cara edit file Post.php dan Category.php lihat script dibawah


Category.php


<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
public function posts(){
return $this->hasMany('App\Post');
}
}


Post.php


<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    protected $fillable = [
"title", "content", "featured", "id_category"
];
    public function category(){
return $this->belongsTo('App\Category');
}
}


Membuat Controller Post


Selanjutnya kita akan membuat controller post. silahkan buka cmd kalian dan ketikan code dibawah 


  C:\xampp\htdocs\blog>php artisan make:controller PostsController --resource


Maka otomatis PostsController.php terbuat beserta fungsinya di dalam folder app/Http/Controllers, silahkan edit seperti dibawah ini.


PostsController.php


<?php

namespace App\Http\Controllers;

use App\Post;
use App\Category;
use Illuminate\Http\Request;

class PostsController extends Controller
{

public function index()
{
return view('admin.posts.index')->with('posts', Post::all());
}

public function create()
{
$categories = Category::all();

if($categories->count() == 0){
return redirect()->back();
}

return view('admin.posts.create')->with('categories', $categories);
}

public function store(Request $request)
{
$this->validate($request, [
"title" => "required",
"featured" => "required|image",
"content" => "required",
"id_category" => "required"
]);

$featured = $request->featured;
$featured_new_name = time().str_replace(' ','-',$featured->getClientOriginalName());
$featured->move('uploads', $featured_new_name);

$post = Post::create([
"title" => $request->title,
"content" => $request->content,
"featured" => "uploads/" . $featured_new_name,
"id_category" => $request->id_category
]);

return redirect()->route('posts');
}

public function show($id)
{

}

public function edit($id)
{
$post = Post::find($id);

return view('admin.posts.edit')->with('post', $post)->with('categories', Category::all());
}

public function update(Request $request, $id)
{
$this->validate($request, [
"title" => "required",
"content" => "required",
"id_category" => "required"
]);

$post = Post::find($id);

if($request->hasFile('featured')){

File::delete($post->featured);

$featured = $request->featured;

$featured_new_name = time().str_replace(' ','-',$featured->getClientOriginalName());
$featured->move('uploads', $featured_new_name);

$post->featured = "uploads/".$featured_new_name ;


}

$post->title = $request->title;
$post->content = $request->content;
$post->id_category = $request->id_category;

$post->save();

return redirect()->route('posts');
}

public function destroy($id)
{
$post = Post::find($id);
File::delete($post->featured);
$post->delete();
return redirect()->route('posts');
}
}


Membuat View


Sebelumnya kita buat dlu menu post di file app.blade.php di dalam folder resources/views/layouts, silahkan edit seperti dibawah ini 


        <div class="container">
<div class="row">
@if(Auth::check())
<div class="col-lg-4">
<ul class="list-group">
<li class="list-group-item">
<a href="{{ route('categories') }}">Category</a>
</li>

<li class="list-group-item">
<a href="{{ route('posts') }}">Post</a>
</li>
</ul>
</div>
@endif
<div class="col-lg-8">

@yield('content')

</div>
</div>
</div>


Setelah itu buat folder uploads di dalam folder public untuk penyimpanan gambar. 


C:\xampp\htdocs\blog> mkdir uploads


Buat folder posts di dalam resources/views/admin 


C:\xampp\htdocs\blog\resources\views\admin> mkdir posts


Buat file index.blade.php di dalam resources/views/admin/posts


  C:\xampp\htdocs\blog\resources\views\admin\posts> mkdir index.blade.php


index.blade.php


@extends('layouts.app')


@section('content')

<div class="panel panel-default">
<div class="panel-heading">
Posts
</div>

<div class="panel-body">
<div class="text-left">
<a class="btn btn-success" href="{{ route('post.create') }}">Add</a>
</div>
<table class="table table-hover">
<thead>
<th>Image</th>
<th>Title</th>
<th class="text-center">Action</th>
</thead>
<tbody>
@if($posts->count() > 0)
@foreach($posts as $post)
<tr>
<td><img src="{{ url($post->featured) }}" alt="{{ $post->title }}" width="90px" height="50px"></td>
<td>{{ $post->title }}</td>
<td class="text-center">
<a href="{{ route('post.edit', [ 'id'=>$post->id ]) }}" class="btn btn-xs btn-info">
Edit
</a>
<a href="{{ route('post.delete', [ 'id'=>$post->id ]) }}" class="btn btn-xs btn-danger">
Delete
</a>
</td>
</tr>
@endforeach
@else
<tr>
<th colspan='3' class="text-center">Nothing Posts</th>
<tr>
@endif
    </tbody>
</table>
</div>
</div>

@stop


Buat file create.blade.php di dalam resources/views/admin/posts


  C:\xampp\htdocs\blog\resources\views\admin\posts> mkdir create.blade.php


create.blade.php


@extends('layouts.app')

@section('content')

@include('admin.includes.errors ')

<div class="panel panel-default">
<div class="panel-heading">
Creat a new post
</div>
<div class="panel-body">
<form action="{{ route('post.store') }}" method="post" enctype="multipart/form-data">
{{ csrf_field() }}
<div class="form-group">
<label for="title">Title</label>
<input type="text" class="form-control" name="title">
</div>
<div class="form-group">
<label for="featured">Featured Image</label>
<input type="file" class="form-control" name="featured">
</div>
<div class="form-group">
<label for="category">Category</label>
<select name="id_category" id="" class="form-control">
@foreach($categories as $category)
<option value="{{ $category->id }}">{{ $category->name }}</option>
@endforeach
</select>
</div>
<div class="form-group">
<label for="content">Content</label>
<textarea class="form-control" name="content" id="" cols="5" rows="5"></textarea>
</div>
<div class="form-group">
<div class="text-center">
<button class="btn btn-success" type="submit">Save</button>
</div>
</div>
</form>
</div>
</div>

@stop


Buat file edit.blade.php di dalam resources/views/admin/posts


  C:\xampp\htdocs\blog\resources\views\admin\posts> mkdir edit.blade.php


edit.blade.php


  @extends('layouts.app')

@section('content')

@include('admin.includes.errors ')

<div class="panel panel-default">
<div class="panel-heading">
Edit post
</div>
<div class="panel-body">
<form action="{{ route('post.update', ['id' => $post->id]) }}" method="post" enctype="multipart/form-data">
{{ csrf_field() }}
<div class="form-group">
<label for="title">Title</label>
<input type="text" class="form-control" name="title" value="{{ $post->title }}">
</div>
<div class="form-group">
<label for="featured">Featured Image</label>
<input type="file" class="form-control" name="featured">
</div>
<div class="form-group">
<label for="category">Category</label>
<select name="id_category" id="" class="form-control">
@foreach($categories as $category)
<option value="{{ $category->id }}" @if($post->id_category == $category->id) selected @endif>{{ $category->name }}</option>
@endforeach
</select>
</div>
<div class="form-group">
<label for="content">Content</label>
<textarea class="form-control" name="content" id="" cols="5" rows="5">{{ $post->content }}</textarea>
</div>
<div class="form-group">
<div class="text-center">
<button class="btn btn-success" type="submit">Update</button>
</div>
</div>
</form>
</div>
</div>

@stop


Membuat Route


Selanjutnya kita akan membuat route untuk post, silahkan edit file web.php di dalam folder routes 


web.php


<?php

Route::get('/', function () {
return view('welcome');
});

Auth::routes();

Route::group(['prefix' => 'admin', 'middleware' => 'auth'],function(){

Route::get('/home', [
'uses' => 'HomeController@index',
'as' => 'home'
]);

Route::get('/categories', [
'uses' => 'CategoriesController@index',
'as' => 'categories'
]);

Route::get('/category/create', [
'uses' => 'CategoriesController@create',
'as' => 'category.create'
]);

Route::post('/category/store', [
'uses' => 'CategoriesController@store',
'as' => 'category.store'
]);

Route::get('/category/edit/{id}', [
'uses' => 'CategoriesController@edit',
'as' => 'category.edit'
]);

Route::get('/category/delete/{id}', [
'uses' => 'CategoriesController@destroy',
'as' => 'category.delete'
]);

Route::post('/category/update/{id}', [
'uses' => 'CategoriesController@update',
'as' => 'category.update'
]);


Route::get('/posts', [
'uses' => 'PostsController@index',
'as' => 'posts'
]);

Route::get('/post/create', [
'uses' => 'PostsController@create',
'as' => 'post.create'
]);

Route::post('/post/store', [
'uses' => 'PostsController@store',
'as' => 'post.store'
]);

Route::get('/post/edit/{id}', [
'uses' => 'PostsController@edit',
'as' => 'post.edit'
]);

Route::get('/post/delete/{id}', [
'uses' => 'PostsController@destroy',
'as' => 'post.delete'
]);

Route::post('/post/update/{id}', [
'uses' => 'PostsController@update',
'as' => 'post.update'
]);
});


Pada tahap ini kita sudah bisa membuat CRUD Post, Jika berhasil maka akan ada tampilan seperti berikut




Sekian untuk Tutorial Boilerplate Laravel 3 : Membuat CRUD Post Semoga bermanfaat



Tutorial Selanjutnya - Boilerplate Laravel 4 : Membuat Notifikasi Dengan Toastr

LihatTutupKomentar