Pada kesempatan kali ini kami membahas tentang Model, View dan Controller di laravel 5.7, yang biasanya disingkat MVC.

Sebelum kita menggunakan MVC di laravel, ada baiknya kami jelaskan terlebih apa yang dimaksud dari MVC.

Model

Model adalah suatu class yang digunakan untuk mendifinisikan tabel dan relasinya pada suatu database di laravel.

Letak model ini berada di folder app, coba perhatikan gambar berikut :

model di laravel

Gambar diatas terdapat file User.php, file tersebutlah yang dinamakan model di laravel. Kurang lebih scriptnya seperti dibawah ini :

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];
}

Jika kita membuat sebuah model cukup jalankan perintah "php artisan make:model NamaModel". Jika berhasil nanti akan ada file model yang berada sejajar dengan file User.php

View

View adalah sebuah tampilan HTML di laravel yang biasa disebut dengan Blade Template.

Untuk letak view sendiri berada di folder resources>views. Laravel menggunakan blade template, jadi kita harus menyimpannya dengan ekstensi .blade.php. Seperti gambar dibawah ini :

views list

Controller adalah sebuah pengendali dari route dan jembatan antara Model dan View di laravel.

letak controller barada di folder app>Http>controllers.

letak controller laravel

Berikut contoh script dari BelajarController.php yang sudah kita buat di tutorial sebelumnya.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class BelajarController extends Controller
{
    public function form(){
        return view('form');
    }
    public function getProfile(Request $request){
        $data = $request->kata;
        return view('profile',compact('data'));
    }
}

Lebih jelasnya kita praktekkan langsung, kita awali dengan membuat sebuah Model. Dalam tutorial sebelumnya kami sudah menjelaskan tentang Belajar Migration Dan Schema Di Laravel 5.7. Kami harap untuk membaca tutorial tersebut sebelum melanjutkan langkah selanjutnya.

Jika sudah membaca dan mengikuti tutorial kami sebelumnya, langsung saja kita buat model untuk tabel posts dan tabel category.

Caranya cukup mudah, jalankan perintah berikut :

php artisan make:model Post //membuat model Post
php artisan make:model Category //membuat model Category

Kemudian bisa kita perhatikan, akan ada dua file bernama Category.php dan Post.php sejajar dengan User.php.

list model

Buka file Category.php kemudian samakan dengan script berikut:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    protected $table= 'category'; //mendifinisikan bahwa model ini untuk tabel category
}

Kenapa kami tambahkan script protected $table = 'category' ? karena jika tidak didefinisikan bahwa model tersebut untuk tabel category laravel akan membaca di database dengan nama tabel categories di tutorial sebelumnya kita buat tabel dengan nama category, seharusnya categories.

Seperti error berikut :

jika tidak didefinisikan di model

Setelah Model sudah siap selanjutnya kita buat controller baru bernama PostController. Jalankan perintah berikut :

php artisan make:controller PostController

Buat fungsi baru di dalam PostController.php.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class PostController extends Controller
{
    public function index(){
        return view('posts.index');
    }
}

Buat folder posts di dalam folder resources>views, kemudian buat filde index.blade.php di dalam folder posts yang baru kita buat.

Sehingga didapati struktur seperti berikut :

struktur view

Kemudian kita daftarkan route baru, caranya buka file web.php di dalam folder routes.

<?php

/*
| Web Routes
*/

Auth::routes();

Route::get('/posts', '[email protected]')->name('indexPost');

Kemudian jalankan projectnya menggunakan perintah "php artisan serve" dan akses http://localhost:8000/posts

halaman index posts

Selanjutnya kita buat data dummy atau sample data menggunakan Seeder laravel.

Pertama kita buat seeder data untuk kategori

Caranya cukup jalankan perintah berikut :

php artisan make:seeder CategoryTableSeeder // membuat sample data category

Selanjutnya buat seeder data untuk posts

php artisan make:seeder PostTableSeeder // membuat sample data posts

Perhatikan gambar dibawah ini, terdapat dua file baru bernama CategoryTableSeeder.php dan PostTableSeeder.php.

list seeder laravel

Salin dan paste script dibawah ini ke file CategoryTableSeeder.php

<?php

use Illuminate\Database\Seeder;
use App\Category; // memanggil model category
class CategoryTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
//melakukan perulangan untuk menyimpan data ke tabel category
        for($i=0;$i<=5;$i++){
            $cat = new Category;
            $cat->name = 'kategori AB'.$i;
            $cat->save();
        }
    }
}

Kemudian jalankan perintah berikut :

php artisan db:seed --class=CategoryTableSeeder

Setelah selesai, coba cek isi dari tabel category melalui phpmyadmin http://localhost/phpmyadmin

tabel category

Taraa... tabel category sudah terisi, sekarang tinggal ganti ke tabel posts.

Salin dan paste script berikut ke dalam PostTableSeeder.php :

<?php

use Illuminate\Database\Seeder;
use App\Post;
class PostTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        for($i=1;$i<=6;$i++){
            $post = new Post;
            $post->judul = 'post ke-'.$i;
            $post->slug = str_slug($post->judul);
            $post->user_id = '1';
            $post->body = "lorem ipsum...";
            $post->category_id = $i;
            $post->save();
        }
    }
}

Kemudian jalankan perintah berikut :

php artisan db:seed --class=PostTableSeeder

Selanjutnya cek kembali di phpmyadmin, dan lihat isi pada tabel posts.

data posts

Kita coba tampilkan data yang ada di database ke tampilan html, menggunakan blade templatenya laravel.

Buka PostController.php, kemudian ganti seperti script berikut :

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Post; //memanggil model posts
class PostController extends Controller
{
    //menampilkan semua posts
    public function index(){
        $posts = Post::all(); // mengambil semua data di tabel posts
        return view('posts.index', compact('posts'));
    }

    //menampilkan post berdasarkan slug
    public function show($slug){
        $post = Post::where('slug',$slug)->first();
        return view('posts.show',compact('post'));
    }
}

Selanjutnya buka file index.blade.php pada folder posts.

Ubah menjadi seperti berikut:

<h3>Daftar Posts</h3>
<ul>
@foreach($posts as $post)
<li>Judul : {{$post->judul}} | <a href="detail/{{$post->slug}}">Lihat Detail</a></li>
@endforeach
</ul>

Buat file baru bernama show.blade.php sejajar index.blade.php di dalam folder posts.

Isikan script berikut :

<html>
Judulnya : {{$post->judul}}<br>
Deskripsinya : {{$post->body}}
</html>

Kemudian kita daftarkan route baru di web.php

<?php

/*
| Web Routes
*/

Auth::routes();

Route::get('/posts', '[email protected]')->name('indexPost');
Route::get('/detail/{slug}','[email protected]');

Setelah itu jalankan kembali projectnya, dengan perintah "php artisan serve" dan akses http://localhost:8000/posts

list posts

Silahkan coba klik Lihat Detail, untuk menampilkan berdasarkan slug.

detail post

Sampai disini kami harap kalian sudah mengerti apa yang dimaksud dengan Model, View dan Controller di laravel. Semoga tutorial ini bisa membantu kalian dalam belajar laravel 5.7.


Wahyu Prasetyo
Wahyu Prasetyo Hanya manusia biasa yang berilmu dan ingin bermanfaat untuk orang lain.