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
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
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
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,