Membuat TaskApp Dengan Laravel 6

RahulSya
6 min readOct 2, 2019

Pada blog sebelumnya saya Membuat tutorial Auth terbaru pada Laravel6. Kali ini melanjutkan dengan membuat aplikasi task sederhana dengan laravel6. Untuk di Sarankan Pembaca mengikuti Tulisan sebelumnya di Sini

Jika belum membaca blog sebelumnya diharap mengikutinya karna untuk Auth dibahas disana :D ini lanjutan. linkya

Langsung saja kita ke permasahannya ya kawan-kawan : )

Membuat Migration

table yang akan kita gunakan

Pertama kita membuat migration untuk tasks php artisan make:migration create_tasks_table . buka filenya di folder database/migrations dan isikan fieldnya

public function up()
{
Schema::create('tasks', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('user_id');
$table->string('title');
$table->boolean('is_complete');
$table->timestamps();
$table->foreign('user_id')
->references('id')
->on('users');
});
}

Jalan kan php artian migrate Jika sudah berhasil kita lanjutt :D

Membuat Model Dan Relation

Membuat model untuk tasks php artisan make:model Task dan kita isikan model Task pada folder app/Task.php

<?phpnamespace App;
use Illuminate\Database\Eloquent\Model;
class Task extends Model
{
//
protected $casts=[
'is_complete'=>'boolean',];protected $fillable=[ 'title', 'is_complete'];}

pada atribut $casts array untuk merubah atribut is_complete ke tipe boolean jadi data yang distore kedatabase adalah 1 atau 0.

pada $fillable array untuk mendaftarkan atribut mana yang bisa kita isi ketika melakukan insert / update .

selanjutnya membuat relation antara Task dan User isikan model Task di app/Task.php

public function user(){return $this->belongsTo(User::class);}

Pada Model Task.php kita membuat metod user() meggunakan atribut belongsTo user jadi tiap user punya task

dan pada model User di app/User.php

public function tasks(){return $this->hasMany(Task::class);}

Pada model User.php kita membuat metod tasks() meggunakan hasMany . Penggunaan hasMany digunakan pada parent Table tersebut.

pada table

Membuat Seeding Dengan Fakker

buat seeding dengan php artisan make:seeder TaskTableSeeder dan buat factories dengan menuliskan php artisan make:factory TaskFactory.

pada TaskFactory.php di table database/factories/TaskFactory.php kita return data yang akan diisi yaitu.

<?php
/** @var \Illuminate\Database\Eloquent\Factory $factory */
use App\Task;
use Faker\Generator as Faker;
$factory->define(Task::class, function (Faker $faker) {
return [
'title'=>$faker->sentence,
'is_complete'=>$faker->boolean,
];
});

Jangan lupa tambah Use App\Task. pada title kita isi sentence yaitu berisi format tulisan Lorem . dan is_complete diisi dengan boolean

Setelah membuat factories kita buat seeding pada database/seeds/Tasktableseeder.php lalu kita isi

<?phpuse App\User;
use App\Task;
use Illuminate\Database\Seeder;
class TaskTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
//get all Users
$users=User::all();
foreach ($users as $user) {$limit=random_int(10,20);//buat taks sampe limitnyafor ($i=0; $i < $limit; $i++) { $taks=factory(Task::class)->make(); //mengaitkan taks ke user $taks->user()->associate($user); $taks->save(); } } }}

pada $users=User::all(); kita cek data user didatabase lalu di loop tiap user dan menentukan random number antara 10 dan 20 untuk seeding datanya.

lalu buat perulangan sampai data limitnya dan kita pakai factory yang sudah kita buat sebelumnya dan menjalankan metod make() dan gunakan associate($user) untuk mengaitkan task ke usernya dan metod save() untuk menyimpannya.Setelah selesai ,

Jalankan seednya dengan php artisan db:seed --class=TaskTableSeeder untuk — class= sesusai dengan nama di database/seed sebelum menjalan kan pastikan sudah ada data usernya jika tidak akan error :D atau bisa lakukan seeding juga untuk user .

Membuat Controller

buat controller untuk Task dengan cara php artisan make:controller TaskController --resource metod yang akan kita gunakan adalah Index(),store(),update buka controller pada app\Http\controller\TaskController.php

isikan metod Index()

public function index(){//menampilkan task dari urutan yang belum complete(is_complete=0) dan yang terbaru
$tasks=Auth::user()
->tasks() ->orderBy('is_complete') ->orderByDesc('created_at') ->paginate(5);return view('tasks',[ 'tasks' => $tasks]);
}

isi method Store()

public function store(Request $request){//validate yang akan digukan nanti untuk formnya $data=$this->validate($request,['title'=>'required|string|max:225']);Auth::user()->tasks()->create(['title'=>$data['title'],'is_complete'=>false]);session()->flash('status','Task created');return redirect('/tasks');}

pada method store() kita buatkan validator untuk title lalu buat task baru berdasarkan Auth::user() yang sedang kita gunakan (login) Jika berhasil akan kita buat notifikasi dengan flash message dan lalukan redirect ke /tasks yang nanti akan kita buat templateting bladenya :

Isi method Update()

public function update(Task $task){
//
$this->authorize('complete',$task);
$task->is_complete=true;
$task->save();
session()->flash('status','Task Completed');return redirect('/tasks');}

pada update() kita tambah parameter yaitu Task $task yang akan kita authorize nantinya . jadi kita perlu membuat Policy untuk authorization caranya php artisan make:policy TaskPolicy setelah itu bisa dibuka di folder App\policies\TaskPolicy.php lalu buat function complete yaitu seperti ini

public function complete(User $user,Task $task){return $user->id === $task->user_id;}

jangan lupakan panggil Model user dan Tasknya letakan dipaling atas use App\User dan use App\Task pada function complete kita cek jika id user yang sedang login sama dengan user_id yang berada di task maka akan di return True dan pada Taskcontroller kita panggil dengan cara

$this->authorize(‘complete,$task)

Jangan lupa daftarkan Policy yang telah kita buat di Folder app\Providers\authserviceProvider.php isikan pada array $policies

isikan seperti diatas

Mendaftarkan Controller Pada Routing

Buka folder Routes\web.php lalu isikan ini

Route::middleware(['auth'])->group(function(){Route::resource('tasks','TaskContoller',['only'=>[      'index','store','update'  ] ]);});

Membuat Template

kita bisa gunakan template blade yang sudah ada atau bisa buat sendiri saya disini mengubah home.blade menjadi task.blade pada fonder resources ya :

lalu saya buka folder app\http\controller\Auth\loginController.php saya ubah redirectTo=/tasks, dan pada Registercontroller juga saya ubah redirectTo=/tasks ,

lalu buka template.bladenya di resources\views\task.blade.php

@extends('layouts.app')@section('content')<div class="container"><div class="row justify-content-center"><div class="col-md-8">@if (session('status'))<div class="alert alert-success" role="alert">{{session('status')}}</div>@endif<div class="card"><div class="card-header">New Task</div><div class="card-body">
<form action="{{route('tasks.store')}}" method="POST">@csrf<div class="form-group"><label for="title">Title</label><input type="text" id="title" name="title" class="form-control {{$errors->has('title') ? "is-invalid" : ""}}" autocomplete="off">@if ($errors->has('title'))<span class="invalid-feedback" role="alert"><strong>{{$errors->first('title')}}</strong></span>@endif</div><button type="submit" class="btn btn-primary">Create</button></form></div></div><br><div class="card"><div class="card-header"> Tasks</div><div class="card-body"><table class="table table-striped">@foreach ($tasks as $task)<tr><td>@if ($task->is_complete)<s>{{$task->title}}</s>@else{{$task->title}}@endif</td><td class="text-right">@if (!$task->is_complete)<form action="{{route('tasks.update',$task->id)}}" method="POST">@csrf@method('PATCH')<button class="btn btn-primary" type="submit">Complete</button></form>@endif </td></tr>@endforeach</table>{{$tasks->links()}} </div> </div> </div> </div></div>@endsection

nah tadi sebelumnya kita menambah kan flash message pada controllerTask method store() dan update() lalu kita terapkan di task.blade yaitu ini

@if (session('status'))<div class="alert alert-success" role="alert">  {{session('status')}}</div>@endif

lalu pada method store() kita gunakan $this->validate($request) pada task.blade kita panggil dengan cara

<input type="text" id="title" name="title" class="form-control {{$errors->has('title') ? "is-invalid" : ""}}" autocomplete="off">@if ($errors->has('title'))<span class="invalid-feedback" role="alert">
<strong>{{$errors->first('title')}}</strong>
</span>
@endif

pada {{$errors->has(‘title’) ? “is-invalid” : “”}} itu adalah kondisi if statement ? jika title ada erorr maka akan panggil class is-invalid yang untuk menampilkan error pada form inputnya .elsenya tidak ada data error akan kosong.

@if (!$task->is_complete)<form action="{{route('tasks.update',$task->id)}}" method="POST">@csrf@method('PATCH')<button class="btn btn-primary" type="submit">Complete</button></form>@endif

pada code diatas jika is_complete tidak true / is_complete=0 maka akan tampikan button action dengan method post dan panggil route update pada taskController

hasilnya
jika title null / kosong

Disarankan Pembaca untuk mengikuti Tulisan sebelumnya karna di situ dibahas tentang cara membuatAuth /Loginya bisa Dicek RahulSya , pada saya mebuat project ini saya mencari dari beberapa sumber dan documentasinya :D

Terimakasih sudah membaca tulisan ini jangan lupa bagikan keteman teman hehe,

Bisa diDownloadProjectnya

https://github.com/rahulsya/blog-TaskProject

--

--

RahulSya

these blogs are my documentation and I hope it can be helpful