Вы находитесь на странице: 1из 58

BAB 3

MARI BERMAIN DENGAN LARAVEL


Instalasi dan konfigurasi telah selesai Anda lakukan, mari bermain lebih jauh lagi dengan laravel,
mari mengenal fitur-fiturnya. Pada bab ini penulis akan membahas beberapa fitur utama dari
framework laravel seperti routing, MVC (Model View controller), Migration dan Seeder, Eleqouent,
Templating dengan Blade, Pembuatan Form sampai dengan operasi CRUD (Create, read, update,
dan delete). Mari kita bahas satu persatu :

3.1. Routing

Routing adalah proses dimana suatu item dapat sampai ke tujuan dari satu lokasi ke lokasi lain.
Dalam hal ini, item yang dimaksud adalah halaman aplikasi website. Para developer Laravel dapat
menentukan sendiri halaman yang akan muncul pada saat dikunjungi oleh User. Misalnya User
mengunjungi halaman dashboard, maka kita dapat menentukan tampilan apa yang akan muncul,
apakah itu hanya berupa tulisan, berupa halaman controller, berupa halaman view, maupun
halaman error. Route dapat menghandle semua perintah yang telah dideklarasikan oleh kita. Atau
mungkin route bisa kita analogikan sebagai peta petunjuk bagaimana alur navigasi aplikasi yang
sedang kita bangun.

Routing untuk Laravel dapat diatur pada file app/routes.php. Pada aplikasi yang lebih kompleks,
kita dapat meletakan routing pada file lain agar app/routes.php tidak terlihat berantakan. Berikut
isian dari app/routes.php:

....
Route::get('/', function()
{
return View::make('hello');
});

Misalnya, jika kita ingin membuat halaman statis yang bisa diakses di
http://latihan.site/halamanku, tambahkan isian seperti ini pada file routes.php pada folder app
didalam folder proyek nama-folder:

....
Route::get('/halamanku', function() {
return '<h1>Halo</h1>'
.'Selamat datang di Aplikasi Laravel Saya<br>'
.'baru belajar nih, semangat!!!.';
});

Maka kita bisa akses halaman tersebut di http://latihan.site/halamanku


Gambar 3.1. Tampilan halaman web setelah di Routing

Mari kita perhatikan syntax Route::get('/about', function() { ... }).

Parameter get menjelaskan jenis request yang diterima dalam contoh ini GET request. Kita dapat
merubah post untuk mengakses POST request.
/halamanku merupakan URL yang kita inginkan untuk diakses.
function() { ... } merupakan closure (anonymous function) yang akan memberikan jawaban atas
request. Selain menggunakan closure, kita juga dapat mengarahkan request ke fungsi pada sebuah
controller.

3.2. MVC

Seperti pada framework-framework lainnya, laravel juga menganut system MVC(Model View
Controller) dalam pembuatan aplikasinya. Secara sederhana konsep MVC terdiri dari tiga bagian
yaitu bagian Model, bagian View dan bagian Controller. Didalam website dinamis setidaknya terdiri
dari 3 hal yang paling pokok, yaitu basis data, logika aplikasi dan cara menampilkan halaman
wesite. 3 hal tersebut direpresentasikan dengan MVC yaitu model untuk basis data, view untuk cara
menampilkan halaman website dan controller untuk logika aplikasi.

3.2.1. Model
Model merepresentasi struktur data dari website yang bisa berupa basis data struktur data, dan
biasanya berhubungan langsung dengan database untuk memanipulasi data atau CRUD ( create,
read, update, delete ).

Model ini dibuat berdasarkan objek dalam aplikasi kita. Misalnya, jika kita membuat aplikasi
penjualan, maka barang dan transaksi dapat menjadi model. Selain sebagai struktur data, model
juga menyimpan business rules dari aplikasi. Sebagai bisnis rules misalnya, dalam sebuah objek
barang, kode barang minimal berisi 6 karakter, maka model barang memastikan bahwa data yang
isi sudah sesuai dengan aturan tersebut.

Berbicara model, pada laravel kita akan mengenal yang namanya Migration , Seeding dan
Eloquent.

3.2.2. Migration
Migration atau database migration, adalah salah satu fitur yang cukup memudahkan kita ketika ada
pembuatan atau perubahan pada tabel-tabel di database aplikasi kita. Entah itu penambahan
kolom, indexs dan lain sebagainya.

Dengan database migration, kita dapat membuat tabel-tabel tanpa harus membuka aplikasi
administrasi database, seperti phpmyadmin, navicat, sqlyog, dan lainnya. Menggunakan fitur
database migration pada laravel terbilang cukup mudah, lagi dan lagi kita akan dipermudah dengan
command line tool bawaan laravel, yaitu artisan.

Sebelum menggunakan migration, kita harus membuat dulu database mysql nya, silahkan gunakan
phpmyadmin, sqlyog atau yang lainnya untuk membuat database baru. Disini akan kita namakan
databasenya dengan latihan. Jika sudah terbuat, silahkan edit file database.php yang terletak di
nama-proyek/app/config/ lalu ganti baris database pada bagian mysql dengan nama yang
barusan kita buat, lihat gambar 3.2.

3.2. Tampilan Edit file database.php di folder app/config

Kalau sudah selanjutnya kita buatkan file migrationnya. Sebagai contoh mari kita buat migrations
untuk membuat table Anggota dengan struktur sebagai berikut:

Field Type Null Key Default Extra


Id int(10) unsigned No Primary Null auto_incre
ment
nama varchar(255) No Null
Alamat varchar(255) No Null
created_at timestamp 0000-00-00 00:00:00
update_at timestamp No 0000-00-00 00:00:00
Buka terminal, masuk ke folder nama-proyek , jalankan perintah berikut:

php artisan migrate : make buat_table_anggota

3.3. Berhasil membuat file migration buat_table_anggota

Perintah diatas akan menghasilkan sebuah file, misalnya dengan nama dan lokasi nama-
proyek/app/database/migrations/2014_-03_26_033903_ buat_table_anggota.php.

Ubah isian file tersebut menjadi:

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class BuatTableAnggota extends Migration {

/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('anggota', function(Blueprint $table)
{
$table->increments('id');
$table->string('nama');
$table->string('alamat');
$table->timestamps();
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('anggota');
}

Pada fungsi up diatas laravel akan membuat tabel anggota. Sedangkan, pada fungsi down, laravel
akan menghapus tabel anggota.

Berikutnya silahkan jalankan perintah ini di terminal untuk melakukan migrasi :

php artisan migrate

3.4. File migration akan mengirim data ke database mysql

Cek pada database Anda, akan terdapat tabel migrations dan anggota. Tabel migrations berfungsi untuk
mencatat migrasi database yang telah kita lakukan. Tabel anggota adalah tabel yang didefinisikan di file
migrasi yang telah kita buat. Lihat Gambar 3.5.

3.5. Terbentuk dua tabel dari proses migrasi


3.2.3. Seeder

Biasanya ketika kita mengembangkan sebuah aplikasi, dibutuhkan contoh data. Bisa saja contoh
data tersebut kita inject langsung ke database, namun cukup merepotkan jika kita ingin menginject
banyak data. Terlebih jika kita ingin me-reset database ke kondisi sesuai sample data ini. Database
Seeder berfungsi untuk membuat memasukkan data bagi aplikasi.

Oke, tidak perlu berlama-lama, mari kita buat database seeder untuk tabel anggota.

Buatlah file bernama SeederTableAnggota.php, simpan di dalam folder nama-


proyek/app/database/seeds.

SeederTableAnggota.php

<?php

class SeederTableAnggota extends Seeder {

public function run()

// kosongkan table anggota

DB::table('anggota')->delete();

// buat data berupa array untuk diinput ke database

$anggota = array(

array('id'=>1, 'nama'=>'Akhmad Dharma kasman', 'alamat'=>'Jalan Kebahagiaan


No. 23'),

array('id'=>2, 'title'=>'Kresna Abimanyu', 'alamat'=>'jalan Kebagusan No.


28'),

array('id'=>3, 'title'=>'Dewi Retno Wulan', 'alamat'=>'Jalan Peninggilan No


45')

);

// masukkan data ke database

DB::table('anggota')->insert($anggota);

}
Lalu tambahkan atau panggil class SeederTableAnggota ke dalam file DatabaseSeeder.php di
dalam folder nama-proyek\app\database\seeds\ , file ini sudah otomatis ada dalam proyek
laravel , yang perlu Anda lakukan adalah mengeditnya saja:

DatabaseSeeder.php

class DatabaseSeeder extends Seeder {

/**

* Run the database seeds.

* @return void

*/

public function run()

Eloquent::unguard();

$this->call('SeederTableAnggota');

Berikutnya, untuk melakukan seeder , ketikan perintah sebagai berikut :

php artisan db:seed

3.6. Menjalankan perintah seeder untuk mengisi data pada tabel anggota
Sekarang coba cek lagi isi tabel anggota pada database latihan, jika proses seeder berhasil maka
tabel akan terisi 3 buah record sesuai yang kita buat di file SeederTableAnggota.php. Lihat gambar
3.7.

3.7. Proses Seeder berhasil menambah 3 record

3.2.4. Eloquent

Eloquent adalah sebuah ORM (Object Relational Mapping) yang sangat powerful dan expressive.
ORM sendiri adalah salah satu tehnik untuk memetakan basisdata relasional ke model objek atau
sebuah mekanisme yang memungkinkan mengatasi, mengakses dan memanipulasi objek tanpa
harus mempertimbangkan bagaimana objek berhubungan dengan sumber data yang lain.

Pada Laravel, setiap model (yang merupakan turunan dari Eloquent) mewakili sebuah tabel pada
database. Namun, perlu diingat meskipun sebuah model mewakili sebuah tabel, dalam prakteknya
kita seringkali menggunakan beberapa model untuk mengambil data. Dengan menggunakan
relationship kita bisa melakukan pengambilan data dari banyak tabel sekaligus.

Kadangkala, saat menggunakan Laravel kita tidak menggunakan eloquent, tetapi menggunakan
class bernama DB. Bahkan dengan cara demikian, kita tidak perlu membuat model. Hal ini sah-sah
saja, namun alangkah bijaknya jika menggunakan eloquent model. Dengan menggunakan eloquent
model, program yang kita buat bisa lebih rapi dan mudah dibaca dan juga tentu saja lebih cepat
serta mudah digunakan kembali.

A. Membuat Eloquent Model


Kali ini kita akan membuat satu buah Model untuk mengakses tabel anggota. Caranya adalah
dengan membuat file baru bernama Anggota.php lalu simpan di app/models/Anggota.php.
Dengan skrip model seperti ini :

Anggota.php

<?php

class Anggota extends Eloquent

{
protected $table = 'anggota';

protected $fillable = ['nama', 'alamat'];

?>

Model diatas secara otomatis dimapping kepada tabel bernama anggota yang telah kita buat
sebelumnya dengan menggunakan migrasi. Kata protected memiliki arti pada class Anggota
hanya mengenal/mengetahui variable $table dengan isi tabel anggota dan $fillable dengan isi field
nama dan alamat.

B. Mengakses Model

Berikutnya adalah kita akan mengakses model yang telah kita buat sebelumnya. Model dapat
diakses dengan langsung memanggil class model tersebut dimanapun kita butuhkan. Berikut ini
akan saya berikan beberapa contoh fitur Eloquent:

Menampilkan Record Pertama

Buat route cobamodel dengan meletakkan/menambahkannya pada file app/routes.php dengan


isi sebagai berikut:

Route::get('/cobamodel', function()

$anggota = Anggota::all()->first();

echo $anggota->nama;

echo $anggota->alamat;

});

Fungsi first digunakan untuk mengambil hanya record yang pertama dari data yang ada pada query
select.

Jika sudah jalankan browser dengan url http://latihan.site/cobamodel, maka di browser akan
menampilkan data anggota record pertama. Lihat gambar 3.8.
Gambar 3.8. Mengakses Model Record Pertama

Menampilkan record dengan keyword Where

Ubah route cobamodel , lalu ganti dengan skrip berikut ini :

Route::get('/cobamodel', function()

Route::get('/cobamodel', function()

$anggota = Anggota::where('nama', '=', 'Kresna Abimanyu')->first();

echo $anggota->id.' ';

echo $anggota->nama;

});

Gambar 3.9. Menampilkan record dengan Where


Menampilkan Semua Record

Untuk mengambil semua data, cukup hilangkan method first tersebut, setelah itu data bisa
ditampilkan dengan menggunakan foreach. Ganti routes cobamodel dengan skrip ini :

Route::get('/cobamodel', function()

$anggota = Anggota::all();

foreach($anggota as $list)

echo $list->nama;

echo $list->alamat;

});

Jalankan lagi url http://latihan.site/cobamodel, maka akan menampilkan keseluruhan data dari
tabel anggota. Lihat gambar 3.10.

Gambar 3.10. Mengakses Model keseluruhan data


Menambah Data

Dengan menggunakan eloquent, kita bisa memasukan data ke dalam database dengan berbagai
cara. Salah satunya adalah dengan cara yang berikut ini, silahkan hapus dang anti lagi routes
cobamodel.

Route::get('/cobamodel', function()

$anggota = new Anggota;

$anggota->nama = 'Taylor Otwell';

$anggota->alamat = 'Avenue park 12';

$anggota->save();

});

Untuk mengeceknya silahkan buka phpmyadmin dan pastikan routes model menghasilkan satu
buah data baru. Lihat gambar 3.11.

3.11. Berhasil menambah data baru dari model

Mengupdate Data
Mari kita lanjutkan ke fungsi selanjutnya, yaitu update. Anda akan merubah nama anggota yang
tadinya taylor Otwell menjadi Jhon Doe. Seperti kita ketahui, setiap record pada tabel anggota
memiliki id yang di-generate secara otomatis menggunakan auto-increment. Kali ini anggap saja
record yang akan kita ubah memiliki id = 4, maka kode untuk melakukan update menjadi sebagai
berikut:

Route::get('/cobamodel', function()

$anggota = Anggota::find(4); //Temukan anggota dengan id = 4

$anggota->nama = 'John Doe';

$anggota->alamat = 'Silicon Valey';


$anggota->save();

});

Jalankan lagi url latihan.site/cobamodel. Untuk mengeceknya silahkan buka lagi phpmyadmin,
apakah record ke empat sudah berhasil dirubah.

Menghapus Data

Delete adalah yang paling mudah. Masih menggunakan fungsi find() , tinggal menambahkan fungsi
delete() pada model. Berikut contoh penggunaan delete pada eloquent:

Route::get('/cobamodel', function()

$anggota = Anggota::find(4); //Temukan anggota dengan id = 4

$anggota->delete();

});

Jalankan lagi url latihan.site/cobamodel. Silahkan apakah data id ke empat sudah terhapus.

C. Menggunakan Eloquent untuk Relationship


Relationship adalah komponen utama pada eloquent. Sebelumnya kita sudah memiliki 1 buah tabel
yang telah kita buatkan migratenya yaitu tabel anggota, mari buatkan lagi 1 tabel tambahan
bernama hobi , struktur tabelnya sebagai berikut :

Tabel hobi

Field Type Null Key Default Extra


Id int(10) unsigned No Primary Null auto_incre
ment
Hobi varchar(255) No Null
anggota_id int(11) No Null
created_at timestamp 0000-00-00 00:00:00
update_at timestamp No 0000-00-00 00:00:00

Buka terminal, masuk ke folder nama-proyek , jalankan perintah berikut:

php artisan migrate : make buat_table_hobi


Kemudian cek lagi file yang berada pada app/database/migrations. Akan terbentuk satu buah file
bernama xxxx_xx_xx_xxxxxx_buat_table_hobi, lalu editlah file tersebut menjadi seperti dibawah ini :

<?php

use Illuminate\Database\Schema\Blueprint;

use Illuminate\Database\Migrations\Migration;

class BuatTableHobi extends Migration {

/**

* Run the migrations.

* @return void

*/

public function up()

Schema::create('hobi', function(Blueprint $table)

$table->increments('id');

$table->string('hobi');

$table->integer('anggota_id');

$table->timestamps();

});

/**

* Reverse the migrations.

* @return void

*/
public function down()

Schema::drop('hobi');

Jika sudah kita akan seed data tabel hobi tersebut. Buatlah file bernama SeederTableHobi.php
letakkan di dalam app/database/seeds. Isi skripnya sebagai berikut :

<?php

class SeederTableHobi extends Seeder {

public function run()

// kosongkan table hobi

DB::table('hobi')->delete();

// buat data berupa array untuk diinput ke database

$hobi = array(

array('hobi'=>'Traveling', 'anggota_id'=>'1'),

array('hobi'=>'Nonton Film', 'anggota_id'=>'2'),

array('hobi'=>'Kuliner', 'anggota_id'=>'1'),

array('hobi'=>'Membaca Buku', 'anggota_id'=>'2')

);

// masukkan data ke database

DB::table('hobi')->insert($hobi);

Berikutnya, untuk melakukan seeder , ketikan perintah seeder :

php artisan db:seed


Cek database Anda, jika proses seeder berhasil maka akan menambah 4 data di tabel hobi. Lihat
gambar 3.12.

Gambar 3.12. Seeder berhasil menambah data ke tabel hobi

Sebelum membuat model relasi terhadap 2 buah tabel yang kita miliki, mari lihat gambar 3.13.
Gambar tersebut menunjukkan hubungan antara tabel anggota dengan tabel tabel hobi, dimana
hubungan tabel tersebut adalah One to many. Dimana setiap anggota memiliki banyak hobi.

Gambar 3.13. Hubungan One to many tabel anggota dan hobi

Berikutnya jika berhasil, buka kembali model Anggota yang terletak di app/models/Anggota.php.
app/models
silahkan ubah menjadi seperti dibawah ini :

app/models/Anggota.php

<?php class Anggota extends Eloquent


{

protected $table = 'anggota';

protected $fillable = ['nama', 'alamat'];

/* Relasi One-to-Many

* ==================

* Buat function bernama hobi(), dimana model 'Anggota' akan memiliki

* relasi One-to-Many terhadap model 'Hobi' sebagai 'anggota_id'

*/

public function hobi() {

return $this->hasMany('Hobi', 'anggota_id');

?>

Pada skrip model diatas, kita menambahkan fungsi hobi() dengan hubungan hasMany() terhadap
model hobi dengan acuan field anggota_id.

Catatan : Jika hubungan relasinya adalah One To One maka kita bisa menggunakan fungsi
hasOne.

Berikutnya adalah membuat model kedua yaitu model Hobi. Letakkan pada
app/models/Hobi.php.

app/models/Hobi.php

<?php

class Hobi extends Eloquent

protected $table = 'hobi';

protected $fillable = ['hobi', 'anggota_id'];


/* Relasi One-to-Many

* =================

* Buat function bernama anggota(), dimana model 'hobi' memiliki

* relasi One-to-Many (belongsTo) sebagai penerima 'anggota_id'

*/

public function anggota() {

return $this->belongsTo('Anggota', 'anggota_id');

?>

Model Hobi memiliki fungsi anggota(), dimana Model anggota sebagai penerima (belongsto) field
anggota_id.

Yang terakhir, untuk membuktikan relasi One To Many kedua tabel tersebut, kita akan membuat
routesnya, silahkan buka app/routes.php dan tambahkan baris ini.

app/routes.php

Route::get('relasi', function() {

# Temukan anggota yang bernama akhmad Dharma Kasman

$anggota = Anggota::where('nama', '=', 'Akhmad Dharma Kasman')->first();

echo $anggota->nama .' '.'hobinya :';

# Tampilkan seluruh data hobinya

foreach ($anggota->hobi as $list)

echo '<li> ' . $list->hobi ;

});

Disini kita mennggunakan foreach untuk menampilkan data hobi yang berupa array(). $anggota-
>hobi maksudnya mengambil semua data hobi yang dimiliki oleh anggota terkait terkait. Dengan
cara ini, kita bisa menampilkan hobi(meski berbeda tabel) dengan hanya memanfaatkan anggota_id
yang dihubungkan melalui relasi.
Lalu buka browser dan ketikkan alamat url http://latihan.site/relasi. Lihat hasilnya di gambar 3.14.
Akan menampilkan hobi-hobi yang dimiliki oleh anggota Akhmad Dharma Kasman.

Gambar 3.14. Hubungan One to many dengan eloquent

3.2.5. View

View bisa dibilang merupakan informasi yang ditampilkan kepada pengunjung aplikasi. Dan sesusai
dengan konsep MVC, sebisa mungkin didalam View tidak berisi logika-logika kode tetapi hanya
berisi variabel-variabel yang berisi data yang siap ditampilkan. View bisa dibilang adalah halaman
aplikasi yang dibuat menggunakan HTML dengan bantuan CSS atau JavaScript. Didalam view
sebaiknya jangan ada kode untuk melakukan koneksi ke basis data. View hanya dikhususkan untuk
menampilkan data-data hasil dari model dan controller.

Untuk mencoba membuat view, silahkan buka kembali file routes anda, rubahlah menjadi seperti
ini :

Route::get('/halamanku', function()

return View::make('halamanku');

});

Lalu buatlah file halamanku.php dan simpan di app/views/halamanku.php dengan isi:

app/views/halamanku.php

<html>

<body>

<h1>Halo</h1>
Selamat datang di Aplikasi Laravel Saya<br>

baru belajar nih, semangat!!

</body>

</html>

Cek kembali route http://latihan.site/halamanku dan hasilnya, tetap sama. Yang berubah adalah
logicnya, sekarang kita memindahkan logic untuk menampilkan html ke file view terpisah.
View::make pada routes akan mengarahkan ke halaman/view halamanku.php

A. Templating Dengan Blade


Selain dengan memisahkan peletakan view pada file berbeda (sesuai konsep MVC), Laravel juga
lebih menekankan penggunaan view dengan templating. Templating dalam laravel disebut dengan
Blade. Blade sendiri adalah template engine bawaan Laravel. Blade menawarkan syntax yang lebih
mudah dan singkat untuk dipakai dalam menghasilkan dokumen HTML.

Untuk menggunakan view dengan blade template, kita cukup merubah ektensi file view menjadi
.blade.php. Pada contoh file about.php, maka kita ubah menjadi about.blade.php untuk
menggunakan blade template.

B. Blade Syntax

Syntax yang paling sederhana dalam blade adalah {{ }} (double curly braces). Syntax ini dapat
menggantikan fungsi <?php echo ;?> pada file view. Jadi, syntax {{ $variabel }} akan berubah
menjadi syntax <?php echo $variable; ?>. Jika akan menampilkan variable hasil input user,
gunakan {{{ }}} (triple curly braces) agar variabel yang ditampilkan di escape (dibersihkan dari
script) terlebih dahulu. Selain mendukung control structures semisal @if, @for, @foreach,
@while, @unless, dll untuk templating.

Untuk lebih jelasnya, mari kita praktekkan saja. Tambahkan router baru seperti berikut:

Route::get('/blade-sample', function(){

return View::make('blade-sample');

});

Lalu buat file app/views/blade-sample.blade.php:

@foreach(array(1,2,3) as $a)
{{ $a }}
@endforeach

Lihat hasilnya di browser. Hasilnya adalah tulisan '123'. Selanjutnya buka folder
app/storage/views, dan Anda akan menemukan file dengan nama yang aneh semisal
d9c6e88599f63fd69746818d3514ff5d. Jika Anda buka, isinya adalah seperti ini:
<?php foreach(array(1,2,3) as $a): ?>
<?php echo $a; ?>
<?php endforeach; ?>

Ini adalah file PHP hasil terjemahan dari file blade. File PHP inilah yang pada akhirnya akan
digunakan untuk merender view.

C. Membuat Template dengan Blade dengan Foundation CSS Framework

Pada bagian ini kita akan mencoba membuat template sederhana dengan blade menggunakan
Framework Foundation CSS. Pada buku ini penulis tidak membahas tentang Framework
foundation, silahkan Anda cari referensi tentang framework css ini. Disini kita hanya butuh
mendownload framework css foundation di http://foundation.zurb.com/develop/download.html.
Jika sudah didownload, ekstraklah framework foundation tersebut, terdapat 3 buah folder bernama
css, img dan js, lalu copy-lah ke tiga folder tersebut ke folder public/assets pada proyek
Anda (nama-proyek). Letakkan ketiga folder tersebut dengan membuat terlebih dahulu folder
assets, letakkan ketiga folder tadi kedalam folder assets.

Disini kita akan membuat 3 buah halaman(pages) yaitu home, about, contact. Sebelumnya kita akan
buatkan routesnya untuk menampilkan ke 3 halaman tersebut. Silahkan ubah file app/routes.php.

Gambar 3.15. Website Foundation Framework CSS


app/routes.php

Route::get('/', function()
{
return View::make('pages.home');
});
Route::get('about', function()
{
return View::make('pages.about');
});
Route::get('contact', function()
{
return View::make('pages.contact');
});

Coba perhatikan route tersebut, halaman awal/depan (/) akan diarahkan ke halaman view
bernama home, halaman about diarahkan ke halaman view about dan halaman contact diarahkan
ke halaman view contact.

Halaman view home, about dan contact diletakkan pada folder pages pada folder view, maka dari
itu penulisannya adalah (pages.home), dimana pages adalah nama folder dimana view home
diletakkan.

Berikut adalah struktur file view yang akan kita buat :

- app
-- views
--- layouts
------- default.blade.php
--- pages
------- home.blade.php
------- about.blade.php
------- contact.blade.php
--- includes
------- head.blade.php
------- header.blade.php
------- footer.blade.php

Silahkan 3 buah folder bernama layouts, pages, includes dalam folder view. Dalam folder
layouts kita akan membuat 1 buah file bernama default.blade.php, dimana file ini akan
menampilkan layout utama dari template yang akan dibuat. Berikutnya, pada folder pages kita
akan membuat 3 buah file bernama home.blade.php yang berfungsi menampilkan halaman
home, about.blade.php yang akan menampilkan halaman about dan contact.blade.php yang
akan menampilkan halaman contact. Sedangkan pada folder includes kita akan membuat 3 buah
file, yaitu head.blade.php berisi file header yang menyertakan title dan link css foundation ,
header.blade.php yang akan menampilkan menu dari template, dan footer.blade.php yang
berfungsi untuk menampilkan footer dari template.
Berikut adalah skrip dari file-file tersebut.

app/view/includes/head.blade.php

<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>Layout dengan Blade Dan Foundation</title>
{{ HTML::style('assets/css/foundation.css') }}
{{ HTML::style('assets/css/custom.css') }}
{{ HTML::script('./assets/js/vendor/custom.modernizr.js') }}

app/view/includes/header.blade.php

<nav class="top-bar" data-topbar>


<ul class="title-area">
<!-- Title Area -->
<li class="name"></li>
<!-- Remove the class "menu-icon" to get rid of menu icon. Take out
"Menu" to just have icon alone -->
<li class="toggle-topbar menu-icon"><a
href="#"><span>Menu</span></a></li>
</ul>
<section class="top-bar-section">
<ul class="left">
<li><a href="/">Home</a></li>
<li><a href="/about">About</a></li>
<li><a href="/contact">Contact</a></li>
</ul>
</section>
</nav>

app/view/includes/footer.blade.php

<footer class="site-footer"> Copyright 2014 Akhmad Dharma Kasman</footer>

app/view/layouts/default.blade.php

<!DOCTYPE html>
<html class="no-js" lang="en">
<head>
@include('includes.head')
</head>
<body>
<div class="row main">
<div class="small-12 large-12 column" id="masthead">
<header>
@include('includes.header')
<div class="sub-header">
<h1>{{HTML::link('/','Template dengan Blade dan Foundation')}}</h1>
</div>
</header>
</div>
<div class="row">
@yield('content')
</div>
<div class="row">
<div class="small-12 large-12 column">
@include('includes.footer')
</div>
</div>
</div>
</body>
</html>

Perhatikan pada baris yang menyebutkan keyword include , ini artinya file default ini
menyertakan juga file view lain, yaitu head.blade.php, header.blade.php dan
footer.blade.php yang berada pada folder includes.

Perhatikan pada baris @yield(content), @yield mengindikasikan bahwa isi konten tersebut ada
pada variable konten yang akan kita buat nanti pada file-file yang ada pada folder pages.

app/view/pages/home.blade.php

@extends('layouts.default')
@section('content')
<div class="small-12 large-12 column">
<div class="content">
<h1>Ini adalah Halaman Home</h1>
Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam
nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
</div>
</div>
@stop

Perhatikan lagi pada file view yang akan menampilkan halaman home, terlihat file ini menggunakan
keyword @extends yang menunjukkan bahwa @section(content) sampai dengan @stop pada
file ini akan digunakan pada file view default.blade.php pada saat pemanggilan dengan
@yield(content).

app/view/pages/about.blade.php

@extends('layouts.default')
@section('content')
<div class="small-12 large-12 column">
<div class="content">
<h1>Ini adalah Halaman About</h1>
Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam
nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
</div>
</div>
@stop

app/view/pages/contact.blade.php

@extends('layouts.default')
@section('content')
<div class="small-12 large-12 column">
<div class="content">
<h1>Ini adalah Halaman Contact</h1>
Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam
nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
</div>
</div>
@stop

Dan terakhir, tambahkan satu file css di /public/css/custom.css. Untuk sedikit mengkustom
framework css foundationnya.

/public/css/custom.css

body {
background-color: #a1a59e;
color: #777;
padding: 5px;
}

.main {
background-color: #fff;
border: 1px solid #eee;
border-radius: 3px;
}

#masthead {
background-color: #fff;
padding: 0;
}

.sub-header {
height: 120px;
background: #91f150;
padding: 15px;
border-bottom: 1px solid #ddd;
}

.site-footer {
height: 50px;
background: #91f150;
padding: 15px;
border-top: 1px solid #ddd;
}

.sub-header a {
color: #fff;
margin: 0;
text-shadow: 2px 0 1px #555;
}

.sub-header h2 {
font-size: 18px;
color: #fff;
margin: 0;
}
.content, .sidebar {
padding: 10px 10px;
}

.pager, .pagination ul {
text-align: center;
list-style: none;
}

.pager li, .pagination ul li {


display: inline;
padding: 10px;
}

.post-title {
background-color: #EDF0F1;
color: #F47063;
font-size: 30px;
font-weight: normal;
}
.new-post,.edit-post,.post-listings,.comment-listings {
color: #F47063;
font-size: 30px;
font-weight: normal;
}

.date:before {
color: #F47063;
content: 'Written on ';
font-size: 12px;
font-style: italic;
}

.date {
font-size: 14px;
}

.post-content {
margin-top: 15px;
}

.comments {
margin: 10px 0;
}

.comments ul {
list-style: none;
}

.comments h2 {
color: #F47063;
font-weight: normal;
font-size: 20px;
}
.comments .date:before {
color: #F47063;
content: 'Replied on ';
font-size: 12px;
font-style: italic;
}

.commenter {
font-weight: bold;
}

.comments .commenter:after {
content: ' says:';
font-style: italic;
}

.comments hr {
width: 80%;
margin: 10px auto;
}

.sidebar h3 {
color: #F47063;
font-size: 20px;
font-weight: normal;
}
.login-form {
margin:20px 0 20px 10px;
}
/* foundation text area fix */
#reply form {
margin-left: 20px;
}
textarea {
height: auto;
}

@media only screen and (min-width: 640px) {

.top-bar {
border-top-left-radius: 3px;
box-shadow: -3px 0 3px -3px #000 inset;
}

.top-bar-section ul {
background: none;
}

.top-bar-section > ul.left > li:first-child > a {


border-top-left-radius: 3px;
}

.top-bar-section .has-dropdown > a:after {


border-color: #555 transparent transparent;
}

.top-bar-section .has-dropdown:hover > a:after {


border-color: #eee transparent transparent;
}

.top-bar-section ul li.active > a {


background: #008CBA;
}

.top-bar-section li a:hover:not(.button) {
background: #008CBA;
}

.top-bar-section .has-dropdown:hover > a {


background: #008CBA;
}

.top-bar-section .divider, .top-bar-section > ul > .divider {


border: 1px solid #ccc;
}
}

Oke, sekarang waktunya untuk melihat tampilan template yang telah kita buatkan file-file viewnya.
Buka kembali url http://latihan.site. Lihat gambar 3.16.

Gambar 3.16. Tampilan Template dengan Blade dan Framework CSS Foundation

3.2.6. Form
Membuat form di Laravel sangat mudah, berikut ini syntax dasar untuk membuat form:

{{ Form::open(array('url' => 'post/save')) }}


//
{{ Form::close() }}

Berikut contoh dalam pembuatan form, dengan menggunakan elemen form seperti label, input
text, form dan button. Buatlah file di app/view/form.php.

app/view/form.php

<head>
@include('includes.head')
</head>
<div class="small-12 large-12 column login-form">
{{ Form::open() }}
<fieldset>
<legend>Form Pada laravel</legend>
{{ Form::label('nama','Nama') }}
{{ Form::text('nama',Input::old('nama'),['placeholder'=>'isi nama
anda disini']) }}
{{ Form::label('alamat','Alamat') }}
{{ Form::text('alamat',Input::old('alamat'),['placeholder'=>'Isi
alamat disini']) }}
{{ Form::submit('Simpan',['class'=>'button tiny radius']) }}
</fieldset>
{{ Form::close() }}
</div>

Lalu jangan lupa untuk menambahkan routenya, di app/routes.php, seperti ini :

Route::get('form', function()
{
return View::make('form');
});

Sekarang, buka alamat http://latihan.site/form. Maka akan menampilkan halaman seperti di


gambar 3.17.
Gambar 3.17. Form pada laravel

3.2.7. Controller

Controller merupakan penghubung antara Model dan View. Didalam Controller inilah terdapat class
dan fungsi-fungsi yang memproses permintaan dari View kedalam struktur data didalam Model.
Controller juga tidak boleh berisi kode untuk mengakses basis data. Tugas controller adalah
menyediakan berbagai variabel yang akan ditampilkan di view, memanggil model untuk melakukan
akses ke basis data, menyediakan penanganan error, mengerjakan proses logika dari aplikasi serta
melakukan validasi atau cek terhadap input.

Pada contoh-contoh sebelumnya, saya selalu meletakan logic di app/routes.php. Hal ini bisa saja
dilakukan, tapi tidak efektif jika aplikasinya sudah besar. Cara yang sering digunakan adalah routes
mengarahkan request ke fungsi di controller. Nah, fungsi itulah yang akan melakukan logic untuk
request tersebut dan memberikan response.

Mari kita praktekan, dengan mengubah route halamanku ke fungsi showHalaman di


HomeController.php :

Ubah route /halamanku menjadi :

app/routes.php

Route::get('/about', 'HomeController@showHalaman');

Lalu tambah fungsi file HomeController.php yang terletak di folder app/controllers.

app/contollers/HomeController.php

public function showHalaman()


{
return View::make('halamanku');
}

Akses kembali http://latihan.site/halamanku maka hasilnya akan tetap sama. Yang berubah adalah
logic untuk memberikan response, sekarang berada pada controller, router hanya mengarahkan
request saja. Hasilnya adalah seperti pada gambar 3.1.

3.3. Operasi CRUD

Belajar pemrograman tidaklah lengkap jika belum membuat program yang sifatnya CRUD. CRUD
sendiri merupakan singkatan dari Create, Read, Update dan Delete. Bila diartikan berarti
menciptakan, membaca, memperbarui dan menghapus. Sebenarnya pada laravel ada berbagai cara,
salah satunya yang bersifat otomatis dengan memanfaatkan laravel generator milik Jeffrey Way.
Disini sengaja dibuat sedikit lebih ribet agar supaya pembaca yang mengikuti tulisan ini mengerti
dan paham, khususnya mengenai fungsi-fungsi dasar yang sering ditemui dan digunakan dalam
membangun sebuah proyek menggunakan Laravel.

Kita akan membuat sebuah aplikasi CRUD sederhana dengan memanfaatkan tabel anggota yang
telah kita buat di sub bab sebelumnya. Baiklah, tidak perlu berlama-lama, mari kita mulai
pembuatan aplikasi CRUD data Anggota.

Supaya proyek tidak tumpang tindih, kita manfaatkan copy-an dari proyek mentah nama-proyek
yang belum dimodifikasi di awal, bisa kita namakan proyeknya adalah crud. Atau bisa juga Anda
create project dan mengunduh dependencynya seperti yang dilakukan di sub bab 2.1.3.

Untuk styling CSS-nya kita menggunakan css foundation seperti pada pembahasan sebelumnya.
Silahkan copy folder assets di dalam folder public pada project nama-proyek yang
sebelumnya telah kita buat ke project crud/ public/assets.

Pada project crud ini, penulis juga membuat satu lagi virtual host bernama http://latihan.crud.
Silahkan buat dengan cara yang telah dijelaskan pada bab 2.

Model

Yang pertama mari kita buatkan model-nya terlebih dahulu. Karena tabel telah kita buatkan pada
sub bab sebelumnya maka proses migrate dan seeder tidak perlu kita lakukan lagi. Namakan
modelnya dengan Anggota.php. Berikut isinya :

app/model/Anggota.php
<?php
class Anggota extends Eloquent {
# Penamaan tabel yang digunakan
protected $table = 'anggota';
# MASS ASSIGNMENT (buatkan field-field yang diperbolehkan menerima
inputan)
protected $fillable = array('nama', 'alamat');
}

Karena hanya satu tabel yang digunakan kita tidak menggunakan Eloquent untuk relasi tabel.
Penggunaan Eloquent relasi akan dibahas pada proyek utama di bab berikutnya.

Route

Berikutnya adalah membuat routenya. Berapa jumlah route yang kira-kira dibutuhkan? Untuk
mengetahuinya Anda bisa membayangkan alur programnya. Mulai dari tampilan awal, hingga
proses delete.

Untuk mempersingkat waktu, kita akan buatkan 6 buah route yang dibutuhkan untuk pembuatan
aplikasi crud ini :

Menampilkan semua data anggota


Menampilkan form tambah data anggota baru
Mengedit data anggota
Menghapus data anggota
Menyimpan data anggota
Mengupdate data anggota

Sekarang coba buka app/routes.php, dan buat ke-6-nya jadi seperti berikut :

<?php

/* Model Bindings */
Route::model('anggota','Anggota');
/* Route Get */
#Untuk menampilkan daftar/list anggota
Route::get('/',['as' => 'anggota.list','uses' =>
'AnggotaController@listAnggota']);
#Untuk menampilkan tambah data anggota baru
Route::get('/new',['as' => 'anggota.new','uses' =>
'AnggotaController@newAnggota']);
#Untuk menampilkan edit data anggota
Route::get('/{anggota}',['as' => 'anggota.edit','uses' =>
'AnggotaController@editAnggota']);
#Untuk menghapus anggota
Route::get('/{anggota}/delete',['as' => 'anggota.delete','uses' =>
'AnggotaController@deleteAnggota']);
/* Route Post */
#Untuk mengupdate data anggota
Route::post('/{anggota}/update',['as' => 'anggota.update','uses' =>
'AnggotaController@updateanggota']);
#Untuk menyimpan data anggota
Route::post('/save',['as' => 'anggota.save','uses' =>
'AnggotaController@saveAnggota']);.save','uses' =>
'AnggotaController@saveAnggota']);

Route ini terbagi menjadi dua, yaitu yang sifatnya Get dan Post. Yang sifatnya mengambil data (get)
adalah menampilkan, menambah, mengedit dan menghapus data anggota. Sedangkan yang sifatnya
pengiriman data (post) adalah menyimpan dan mengupdate data anggota. Selain itu baris pertama
adalah route sebagai model. Model dalam route berarti kita bisa menginject model tanpa
menggunakan id pada sebuah route. Contohnya bisa seperti ini :

Jika kita menuliskan route seperti ini :

Route::get('profile/{user}', 'UserController@showProfile');

Maka penggunaan pada Controllernya adalah seperti ini :

public function showProfile($id)


{
$user = User::find($id);

return View::make('profile', ['user' => $user]);


}

Bandingkan jika kita menggunakan model pada routes seperti ini :

Route::model('user', 'User');

Maka penggunaan pada Controllernya adalah seperti ini :

public function showProfile(User $user)


{
return View::make('profile', ['user' => $user]);
}

Controller

Berikutnya, kita akan membuatkan 6 buah fungsi pada controller untuk menangani masing-masing
route tadi. Buatlah controller bernama AnggotaController.php. Letakkan dalam folder
app/controllers.

app/controllers/AnggotaController.php

<?php

class AnggotaController extends BaseController {

/* fungsi untuk menampilkan seluruh anggota */


public function listAnggota()
{
$anggota = Anggota::orderBy('id','desc')->paginate(5);
$this->layout->title = 'Daftar Anggota';
$this->layout->main = View::make('pages.list',compact('anggota'))-
>with('title',$this->layout->title);
}
/* fungsi untuk menambah */
public function newAnggota()
{
$this->layout->title = 'Tambah Data Anggota';
$this->layout->main = View::make('pages.new')->with('title',$this-
>layout->title);
}

/* fungsi untuk mengedit */


public function editAnggota(Anggota $anggota)
{
$this->layout->title = 'Edit Anggota';
$this->layout->main = View::make('pages.edit',compact('anggota'))-
>with('title',$this->layout->title);
}

/* fungsi untuk mengupdate */


public function updateAnggota(Anggota $anggota)
{
$data = [
'nama' => Input::get('nama'),
'alamat' => Input::get('alamat'),
];
$rules = [
'nama' => 'required',
'alamat' => 'required',
];
$valid = Validator::make($data, $rules);
if ($valid->passes())
{
$anggota->nama = $data['nama'];
$anggota->alamat = $data['alamat'];
if(count($anggota->getDirty()) > 0) /* untuk mencegah data yang sama */
{
$anggota->save();
return Redirect::to('/')->with('success', 'Anggota berhasil diupdate!');
}
else
return Redirect::back()->with('success','tidak ada yang update!');
}
else
return Redirect::back()->withErrors($valid)->withInput();
}

/* fungsi untuk menyimpan */


public function saveAnggota()
{
$anggota = [
'nama' => Input::get('nama'),
'alamat' => Input::get('alamat'),
];
$rules = [
'nama' => 'required',
'alamat' => 'required',
];
$valid = Validator::make($anggota, $rules);
if ($valid->passes())
{
$anggota = new Anggota($anggota);
$anggota->save();
return Redirect::to('/')->with('success', 'Data Anggota Tersimpan!');
}
else
return Redirect::back()->withErrors($valid)->withInput();
}
/* fungsi untuk menghapus */
public function deleteAnggota(Anggota $anggota)
{
$anggota->delete();
return Redirect::to('/')->with('success', 'Data Anggota Tehapus!');
}
}

Pada fungsi untuk menampilkan seluruh data anggota bernama listAnggota(), lihat potongan skrip
berikut ini :

/* fungsi untuk menampilkan seluruh anggota */


public function listAnggota()
{
$anggota = Anggota::orderBy('id','desc')->paginate(5);
$this->layout->title = 'Daftar Anggota';
$this->layout->main = View::make('pages.list',compact('anggota'))-
>with('title',$this->layout->title);
}

Kita membuat variable $anggota sebagai model Anggota untuk menarik keseluruhan data anggota,
disini sekaligus kita akan membuat fungsi paginasi halaman yang nantinya akan dibagi menjadi 5
halaman pada file viewnya. Penggunaan fungsi $this->layout->title memiliki arti kita akan
mengoverride variable title dan main dari controller ke file view yang nanti kita buat, yaitu file list
yang diletakkan di folder pages.

Pada fungsi untuk menambah data anggota bernama newAnggota(), lihat potongan skrip berikut
ini :

/* fungsi untuk menambah */


public function newAnggota()
{
$this->layout->title = 'Tambah Data Anggota';
$this->layout->main = View::make('pages.new')->with('title',$this-
>layout->title);
}
Pada fungsi ini kita hanya akan mengoverride variable title dan main, yang akan digunakan nanti di
file view new yang diletakkan nanti pada folder pages.

Pada fungsi untuk mengedit data anggota bernama editAnggota(), lihat potongan skrip berikut ini :

/* fungsi untuk mengedit */


public function editAnggota(Anggota $anggota)
{
$this->layout->title = 'Edit Anggota';
$this->layout->main = View::make('pages.edit',compact('anggota'))-
>with('title',$this->layout->title);
}

Pada fungsi ini kita hanya akan mengoverride variable title dan main, yang akan digunakan nanti di
file view edit yang diletakkan nanti pada folder pages. Dan perhatikan pada isi parameter dari
fungsi editAnggota(Anggota $anggota), penulisan parameter ini akan berpengaruh pada
routesnya, yaitu penggunaan model untuk menggantikan penggunaan parameter $id yang merujuk
pada record yang akan diedit (lihat contohnya saat pembuatan routes sebelumnya).

Pada fungsi untuk mengupdate data anggota bernama updateAnggota(), lihat potongan skrip
berikut ini :

/* fungsi untuk mengupdate */


public function updateAnggota(Anggota $anggota)
{
$data = [
'nama' => Input::get('nama'),
'alamat' => Input::get('alamat'),
];
$rules = [
'nama' => 'required',
'alamat' => 'required',
];
$valid = Validator::make($data, $rules);
if ($valid->passes())
{
$anggota->nama = $data['nama'];
$anggota->alamat = $data['alamat'];
if(count($anggota->getDirty()) > 0) /* untuk mencegah data yang sama */
{
$anggota->save();
return Redirect::to('/')->with('success', 'Anggota berhasil diupdate!');
}
else
return Redirect::back()->with('success','tidak ada yang update!');
}
else
return Redirect::back()->withErrors($valid)->withInput();
}

Parameter fungsi sama seperti fungsi editAnggota(Anggota $anggota) sebagai pengganti $id yang
merujuk pada record yang akan diupdate. Lalu variable nama dan alamat yang akan divalidasi
terlebih dahulu sebelum penyimpanan/pengupdatean. Juga menggunakan fungsi getDirty untuk
mengecek jika tidak ada perubahan data maka pengupdatean tidak dilakukan. Jika berhasil
diupdate maka akan diarahkan ke halaman utama (/).

Pada fungsi untuk menyimpan data anggota bernama saveAnggota(), lihat potongan skrip berikut
ini :

/* fungsi untuk menyimpan */


public function saveAnggota()
{
$anggota = [
'nama' => Input::get('nama'),
'alamat' => Input::get('alamat'),
];
$rules = [
'nama' => 'required',
'alamat' => 'required',
];
$valid = Validator::make($anggota, $rules);
if ($valid->passes())
{
$anggota = new Anggota($anggota);
$anggota->save();
return Redirect::to('/')->with('success', 'Data Anggota Tersimpan!');
}
else
return Redirect::back()->withErrors($valid)->withInput();
}

Penjelasan fungsi ini hamper sama dengan fungsi updateAnggota().

Yang terakhir adalah fungsi untuk menghapus data anggota, lihat potongan sripnya :

/* fungsi untuk menghapus */


public function deleteAnggota(Anggota $anggota)
{
$anggota->delete();
return Redirect::to('/')->with('success', 'Data Anggota Tehapus!');
}

Parameter fungsi sama seperti fungsi sebelumnya deleteAnggota(Anggota $anggota) sebagai


pengganti $id yang merujuk pada record yang akan dihapus. Setelah terhapus akan dialihkan ke
halaman utama (/).

Berikutnya, karena kita akan mengoverride variabel title dan main dari controller ke view, atau
dalam hal ini penggunaan $this->layout->title dan $this->layout->main. Maka kita harus
mendefinisikan layout master/utama dengan menambahkan baris protected $layout =
'layouts.default'; untuk file view yang dijadikan file view utama pada file
app/controllers/BaseController.php.

app/controllers/BaseController.php

<?php

class BaseController extends Controller {

/**
* Setup the layout used by the controller.
*
* @return void
*/
protected $layout = 'layouts.default';

protected function setupLayout()


{
if ( ! is_null($this->layout))
{
$this->layout = View::make($this->layout);
}
}

Artinya yang menjadi file view/layout utama adalah file default.blade.php pada folder layouts yang
akan kita buat pada pembahasan pembuatan view berikutnya.

View

Mari kita buatkan halaman-halaman tampilan untuk aplikasi crud yang telah kita buatkan model,
routes dan controllernya. Berikut ini adalah view yang akan kita buat :

Layout master/utama.
Layout untuk menampilkan semua data anggota -> Membutuhkan View -> list.blade.php
Layout untuk menampilkan form menambah anggota -> membutuhkan View ->new.blade.php
Layout untuk menampilkan form perubahan/edit data anggota -> Butuh View -> edit.blade.php

Masuk ke folder views, buatlah 2 buah folder bernama layouts dan pages. Strukturnya folder
dan file viewnya kurang lebih seperti berikut :

- app
-- views
--- layouts
------- default.blade.php
--- pages
------- list.blade.php
------- new.blade.php
------- edit.blade.php

Pertama kita akan buatkan file-file view untuk layout yang sifatnya master/utama. Yaitu file yang
akan kita letakkan pada folder layouts dan includes.

app/views/layouts/default.blade.php

<!DOCTYPE html>
<html class="no-js" lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>{{$title}}</title>
{{ HTML::style('assets/css/foundation.css') }}
{{ HTML::style('assets/css/custom.css') }}
{{ HTML::script('./assets/js/vendor/custom.modernizr.js') }}
</head>
<body>
<div class="row main">
<div class="small-12 large-12 column" id="masthead">
<header>
<div class="sub-header">
<h1>{{HTML::link('/','CRUD Dengan Laravel')}}</h1>
</div>
</header>
</div>
<div class="row">
{{$main}}
</div>
<div class="row">
<div class="small-12 large-12 column">
<footer class="site-footer"> Copyright 2014 Akhmad Dharma
Kasman</footer> </div>
</div> </div>
</div>
</body>
</html>

File default.blade.php adalah file view/layout utama. Perhatikan variabel {{$title}} dan
{{$main}}, kedua variabel tersebut adalah hasil dari override dari controller
AnggotaController.php ketika menggunakan fungsi $this->layout->title dan $this->layout->main.

app/views/pages/list.php

<div class="small-12 large-12 column">


<div class="content">
<span class="right">{{ HTML::linkRoute('anggota.new','Tambah
Anggota',null,['class' => 'button tiny radius']) }}</span>
<h2 class="post-listings">Data Anggota</h2><hr>
<table>
<thead>
<tr>
<th width="350">Nama Anggota</th>
<th width="400">Alamat</th>
<th width="120">Edit</th>
<th width="120">Delete</th>
</tr>
</thead>
<tbody>
@foreach($anggota as $data)
<tr>
<td>{{$data->nama}}</td>
<td>{{$data->alamat}}</td>
<td>{{HTML::linkRoute('anggota.edit','Edit',$data->id)}}</td>
<td>{{HTML::linkRoute('anggota.delete','Delete',$data->id)}}</td>
</tr>
@endforeach
</tbody>
</table>
{{$anggota->links()}}
</div>
</div>
Pada view ini akan menampilkan keseluruhan data anggota, dengan menggunakan perulangan
@foreach($anggota as $data) dan menampilkan datanya dengan {{$data->nama}} dan {{$data-
>alamat}}. Lalu juga membuat Link untuk mengedit dan menghapus berdasarkan $data->id dengan
link routenya adalah anggota.edit dan anggota.delete. Coba cek kembali file route untuk
menghandle kedua aksi tersebut :

Route::get('/{anggota}',['as' => 'anggota.edit','uses' =>


'AnggotaController@editAnggota']);
anggota.edit akan mengarah ke url /{anggota} dan menggunakan fungsi editAnggota pada
controller. dimana {anggota} adalah model binding pengganti $id.

Route::get('/{anggota}/delete',['as' => 'anggota.delete','uses' =>


'AnggotaController@deleteAnggota']);

sedangkan anggota.delete akan mengarah ke url /{anggota}/delete, dimana {anggota} adalah


model binding pengganti $id. Juga menggunakan fungsi deleteAnggota pada controller.

Juga terdapat link Tambah Anggota yang mengarah ke route anggota.new atau url /new. Dan
menggunakan fungsi newAnggota pada controller.

Route::get('/new',['as' => 'anggota.new','uses' =>


'AnggotaController@newAnggota']);

app/views/pages/new.php

<div class="small-12 large-12 column">


<div class="content">
<h2 class="new-post">
Tambah Data Anggota
<span class="right">{{
HTML::linkRoute('anggota.list','Cancel',null,['class' => 'button tiny
radius']) }}</span>
</h2>
<hr>
{{ Form::open(['route'=>['anggota.save']]) }}
<div class="row">
<div class="small-5 large-5 column">
{{ Form::label('nama','Nama:') }}
{{ Form::text('nama',Input::old('nama')) }}
</div>
</div>
<div class="row">
<div class="small-7 large-7 column">
{{ Form::label('alamat','Alamat:') }}
{{ Form::textarea('alamat',Input::old('alamat'),['rows'=>5]) }}
</div>
</div>
@if($errors->has())
@foreach($errors->all() as $error)
<div data-alert class="alert-box warning round">
{{$error}}
<a href="#" class="close">&times;</a>
</div>
@endforeach
@endif
{{ Form::submit('Save',['class'=>'button tiny radius']) }}
{{ Form::close() }}
</div>
</div>

Pada view ini kita membuat sebuah form dengan dua buah label, satu buah text(input) untuk
menginput nama dan 1 buah text area untuk menampung alamat. Form ini akan dikirimkan(post)
ke route anggota.save yang akan memanggil fungsi saveAnggota pada controller . Cek kembali route
yang menangani penyimpanan :

Route::post('/save',['as' => 'anggota.save','uses' =>


'AnggotaController@saveAnggota']);

Selain itu juga terdapat tombol cancel untuk membatalkan penambahan data, dimana linkroutenya
mengarah pada anggota.list (route yang menampilkan semua data anggota).

app/views/pages/edit.php

<div class="small-12 large-12 column">


<div class="content">
<h2 class="edit-post">
Edit anggota
<span class="right">{{
HTML::linkRoute('anggota.list','Cancel',null,['class' => 'button tiny
radius']) }}</span>
</h2>
<hr>
{{ Form::open(['route'=>['anggota.update',$anggota->id]]) }}
<div class="row">
<div class="small-5 large-5 column">
{{ Form::label('nama','Nama Anggota:') }}
{{ Form::text('nama',Input::old('nama',$anggota->nama)) }}
</div>
</div>
<div class="row">
<div class="small-7 large-7 column">
{{ Form::label('alamat','Alamat:') }}
{{ Form::text('alamat',Input::old('alamat',$anggota->alamat)) }}
</div>
</div>
@if($errors->has())
@foreach($errors->all() as $error)
<div data-alert class="alert-box warning round">
{{$error}}
<a href="#" class="close">&times;</a>
</div>
@endforeach
@endif
{{ Form::submit('Update',['class'=>'button tiny radius']) }}
{{ Form::close() }}
</div>
</div>
Hampir sama dengan form penambahan data anggota, pengeditan data anggota juga menggunakan
form yang informasinya dikirim(post) ke route anggota.update berdasarkan id anggota. Properti
text menampilkan data dari $anggota->nama dan text area mengambil data dari ,$anggota->alamat.

Selain itu juga terdapat tombol cancel untuk membatalkan pengeditan data, dimana linkroutenya
mengarah pada anggota.list (route yang menampilkan semua data anggota).

Gambar 3.17. Tampilan Semua Data Anggota pada aplikasi crud


Gambar 3.18. Tampilan Tambah Data Anggota pada aplikasi crud

Gambar 3.19. Tampilan Edit Data Anggota pada aplikasi crud


Gambar 3.20. Tampilan validasi ketika data masih kosong pada aplikasi crud

3.4. Autentikasi Login

Pada sub bab ini kita akan membuat sebuah aplikasi login sederhana. Untuk membuat sebuah
autentikasi, laravel telah meyediakan fungsi yang siap digunakan yaitu fungsi Auth::. Fungsi ini
digunakan untuk menyimpan sesi dan menghancurkan sesi untuk keperluan autentikasi.

Oke, tidak berlama-lama mari kita mulai pembuatan projectnya. Supaya project tidak tumpang
tindih, kita manfaatkan copy-an dari proyek mentah nama-proyek yang belum dimodifikasi di
awal, bisa kita namakan proyeknya adalah login. Atau bisa juga Anda create project dan
mengunduh dependencynya seperti yang dilakukan di sub bab 2.1.3.

Untuk styling CSS-nya kita menggunakan css foundation seperti pada pembahasan sebelumnya.
Silahkan copy folder assets di dalam folder public pada project nama-proyek yang
sebelumnya telah kita buat ke project login/ public/assets.

Pada project crud ini, penulis juga membuat satu lagi virtual host bernama http://login.site.
Silahkan buat dengan cara yang telah dijelaskan pada bab 2. Tampilan aplikasinya bias Anda lihat
pada gambar 3.27-3.29.
Migration

Yang pertama tentu kita akan buatkan dulu tabel untuk menampung data administrator, disini kita
masih menggunakan database latihan yang telah dibuat sebelumnya. Kita akan namakan tabel
yang akan kita buat dengan nama admin. Struktur tabel admin adalah sebagai berikut :

Struktur Tabel admin

Nama Field Tipe Data Size Extra Primary

id int 10 Auto increment Yes

username varchar 255

password varchar 255

email varchar 255

remember_token varchar 100

created_at timestamp 100

update_at timestamp

Mari kita buat file migrationnya, Buka terminal, masuk ke folder login , jalankan perintah berikut:

php artisan migrate : make buat_table_admin


3.21. Perintah untuk pembuatan file migration admin

Perintah diatas akan menghasilkan sebuah file, misalnya dengan nama dan lokasi
login/app/database/migrations/ xxxx_xx_xx_xxxxxx_ buat_table_admin.php.

Ubah isian file tersebut menjadi:

login/app/database/migrations/ xxxx_xx_xx_xxxxxx_ buat_table_admin.php

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class BuatTableAdmin extends Migration


{

/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('admin', function (Blueprint $table) {
$table->create();
$table->increments('id');
$table->string('username');
$table->string('password');
$table->string('email');
$table->string('remember_token', 100)->nullable();
$table->timestamps();
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('admin', function (Blueprint $table) {
$table->drop();
});
}

Jika sudah, ketikkan perintah

php artisan migrate

3.22. Perintah migration tabel admin

Berikutnya, silahkan cek database latihan, apakah tabel admin telah terbentuk. Lihat gambar 3.23.

3.23. Tabel admin hasil proses migration

Seeder

Berikutnya kita akan mengisi data tabel admin dengan perintah seeder. Disini kita hanya akan
mengisi satu buah record saja, yaitu username dan password : admin.

app/database/seeds/AdminTableSeeder.php
<?php
class AdminTableSeeder extends Seeder

public function run()

// Uncomment the below to wipe the table clean before populating

// DB::table('admin')->truncate();

$user = array(

'username' => 'admin',

'password' => Hash::make('admin'),

'created_at' => DB::raw('NOW()'),

'updated_at' => DB::raw('NOW()'),

);

// Comment the below to stop the seeder

DB::table('admin')->insert($user);

Jika sudah, daftarkan seeder tersebut ke file app/database/seeds/DatabaseSeeder.php.

app/database/seeds/DatabaseSeeder.php.
<?php

class DatabaseSeeder extends Seeder {

/**

* Run the database seeds.

* @return void

*/

public function run()

Eloquent::unguard();
$this->call('AdminTableSeeder');

Terakhir tentu kita akan menjalankan perintah seeder itu sendiri, kembali ke terminal dan folder
proyek lalu ketikkan :

php artisan db:seed

3.24. Perintah seeder ke tabel admin

Cek kembali database Anda, apakah tabel admin sudah terisi data dummy yang telah kita buatkan
tadi. Lihat gambar 3.25.

3.25. Data seeder berhasil masuk ke tabel admin

Model

Untuk model autentikasi kita tidak perlu membuat file baru dikarenakan laravel telah membuatkan
file model bernama User.php yang terletak di folder app/models. Disini kita hanya perlu
mengganti nama tabel kita pada baris protected $table. Defaultnya nama tabel yang digunakan
pada laravel adalah users. Karena kita membuat dengan nama admin, maka kita harus
merubah baris tersebut. Berikut skrip lengkap model User.php.
app/models/user.php
<?php

use Illuminate\Auth\UserTrait;
use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableTrait;
use Illuminate\Auth\Reminders\RemindableInterface;

class User extends Eloquent implements UserInterface, RemindableInterface {

use UserTrait, RemindableTrait;

/**
* The database table used by the model.
*
* @var string
*/
protected $table = 'admin';

/**
* The attributes excluded from the model's JSON form.
*
* @var array
*/
protected $hidden = array('password', 'remember_token');

Lalu berikutnya kita harus ubah juga setingan tabel admin pada file auth.php yang berada pada
folder app/config/. Kita hanya akan merubah baris 'table' => 'users', menjadi 'table' => 'admin',.
Berikut skrip lengkap model auth.php.

<?php

return array(

/*
|-------------------------------------------------------------------
| Default Authentication Driver
|-------------------------------------------------------------------
|
| This option controls the authentication driver that will be utilized.
| This driver manages the retrieval and authentication of the users
| attempting to get access to protected areas of your application.
|
| Supported: "database", "eloquent"
|
*/

'driver' => 'eloquent',

/*
|--------------------------------------------------------------------
| Authentication Model
|--------------------------------------------------------------------
|
| When using the "Eloquent" authentication driver, we need to know
which
| Eloquent model should be used to retrieve your users. Of course, it
| is often just the "User" model but you may use whatever you like.
|
*/

'model' => 'User',

/*
|---------------------------------------------------------------------
| Authentication Table
|---------------------------------------------------------------------
|
| When using the "Database" authentication driver, we need to know
which
| table should be used to retrieve your users. We have chosen a basic
| default value but you may easily change it to any table you like.
|
*/

'table' => 'admin',

/*
|--------------------------------------------------------------------
| Password Reminder Settings
|--------------------------------------------------------------------
|
| Here you may set the settings for password reminders, including a
view
| that should be used as your password reminder e-mail. You will also
| be able to set the name of the table that holds the reset tokens.
|
| The "expire" time is the number of minutes that the reminder should
be
| considered valid. This security feature keeps tokens short-lived so
| they have less time to be guessed. You may change this as needed.
|
*/

'reminder' => array(

'email' => 'emails.auth.reminder',

'table' => 'password_reminders',

'expire' => 60,

),

);

Route
Pada pembuatan routes pada aplikasi login ini kita akan membuat 4 buah route sebagai berikut :

Menampilkan halaman login untuk pengisian username dan password.


Menampilkan halaman dashboard setelah user berhasil login.
Mengirim informasi login berupa variabel username dan password.
Menghancurkan sesi dengan logout.

Berikut adalah file route yang kita buat :

app/routes.php

<?php

/*
|--------------------------------------------------------------------------
| Application Routes
|--------------------------------------------------------------------------
|
| Here is where you can register all of the routes for an application.
| It's a breeze. Simply tell Laravel the URIs it should respond to
| and give it the Closure to execute when that URI is requested.
|
*/

#route get
Route::get('/', 'LoginController@getLogin');
Route::get('logout', 'LoginController@getLogout');
#route get
Route::post('login', 'LoginController@postLogin');

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


{
/*routes get*/
Route::get('dash-board', 'LoginController@getDashboard');

});

Pada route yang terakhir, yaitu baris :

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

Adalah route yang akan memfilter halaman yang boleh diakses oleh user yang telah melakukan
proses autentikasi. Hal tersebut ditangani oleh fungsi 'before'=>'auth'],function(). Sedangkan
group berfungsi untuk mengelompokkan halaman-halaman mana saja yang dicek proses
autentikasinya, dalam aplikasi ini kebetulan hanya satu halaman saja yang akan ditampilkan lewat
proses autentikasi yaitu pada route Route::get('dash-board',
'LoginController@getDashboard');. Lalu prefix=>admin adalah alamat url /admin yang akan
dihasilkan oleh route pada halaman autentikasi.

Controller
Coba perhatikan file route yang kita buat, dilihat dari routenya tentu kita akan membuatkan juga 1
buah controller beserta 4 buah fungsinya, yaitu controller bernama LoginController dengan 4
fungsi getLogin, getLogout, postlogin dan getDashboard.

function getLogin() -> Fungsi yang menampilkan halaman login .

function getLogout() -> Fungsi yang berfungsi menghancurkan sesi.

function postLogin() -> Fungsi yang megirimkan informasi username dan password ke tabel.

function getDashboard() -> Fungsi yang menampilkan halaman dashboard hasil dari autentikasi .
Oke, buatlah file controller bernama LoginController.php pada folder app/controllers.

app/controllers/LoginController.php

<?php

class LoginController extends BaseController {

/* fungsi untuk menampilkan form login */


public function getLogin()
{
$this->layout->title = 'Aplikasi Login laravel';
$this->layout->main = View::make('login')->with('title',$this->layout-
>title);
}
/* fungsi untuk menampilkan halaman dashboard */
public function getDashboard()
{
$this->layout->title = 'Halaman Dashboard';
$this->layout->main = View::make('dashboard')->with('title',$this-
>layout->title);
}
/* fungsi untuk memproses form login */
public function postLogin()
{
$credentials = [
'username'=>Input::get('username'),
'password'=>Input::get('password')
];
$rules = [
'username' => 'required',
'password'=>'required'
];
$validator = Validator::make($credentials,$rules);
if($validator->passes())
{
if(Auth::attempt($credentials))
return Redirect::to('admin/dash-board');
return Redirect::back()->withInput()->with('failure','username or
password is invalid!');
}
else
{
return Redirect::back()->withErrors($validator)->withInput();
}
}
/* fungsi untuk memproses logout */
public function getLogout()
{
Auth::logout();
return Redirect::to('/');
}
}

View

Mari kita buatkan halaman-halaman tampilan untuk aplikasi login yang telah kita buatkan routes
dan controllernya. Kita akan membuatkan 3 buah view, yaitu master.blade.php sebagai layout
utama, login.blade.php yang menampilkan form login berisi username dan password, dan
dashboard.blade.php yang akan menampilkan halaman dashboard setalah admin berhasil
melakukan proses login/autentikasi. Oke, mari buat ke 3 file tersebut didalam folder app/views:
app/views/master.blade.php

<!DOCTYPE html>
<html class="no-js" lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title> {{$title}}</title>
{{ HTML::style('assets/css/foundation.css') }}
{{ HTML::style('assets/css/custom.css') }}
</head>
<div class="row main">
<div class="small-12 large-12 column" id="masthead">
<header>
<nav class="top-bar" data-topbar>
<section class="top-bar-section">
<ul class="right">
@if(Auth::check())
<li class="{{ (strpos(URL::current(), URL::to('logout'))!== false) ?
'active' : '' }}" >
{{HTML::link('logout','Logout')}}
</li>
@else
<li class="{{ (strpos(URL::current(), URL::to('/'))!== false) ? 'active'
: '' }}">
{{HTML::link('/','Login')}}
</li>
@endif
</ul>
</section>
</nav>
<div class="sub-header">
<h1>{{HTML::link('/','Aplikasi Login Dengan Laravel')}}</h1>
</div>
</header>
</div>
<div class="row">
{{$main}}
</div>
<div class="row">
<div class="small-12 large-12 column">
<footer class="site-footer"> Copyright 2014 Akhmad Dharma Kasman</footer>
</div>
</div>
</div>
</body>
</html>

Fungsi @if(Auth::check()) akan mengecek apakah halaman sudah dalam terautentikasi atau belum,
jika sudah maka akan menampilkan link logout, sebaliknya jika belum maka halaman akan
menampilkan link login.

Lalu ada pemanggilan variabel {{$title}} dan {{$main}} ini artinya kita mengoverride atau
memparsing variabel title dan main dari controller ke view master.blade ini. Coba buka kembali file
LoginController.php, disana kita akan menemukan penggunaan $this->layout->title dan $this-
>layout->main. Maka kita harus mendefinisikan layout master/utama dengan menambahkan baris
protected $layout = 'master'; untuk file view yang dijadikan file view utama pada file
app/controllers/BaseController.php.

app/controllers/BaseController.php
<?php

class BaseController extends Controller {

/**
* Setup the layout used by the controller.
*
* @return void
*/

protected $layout = 'master';

protected function setupLayout()


{
if ( ! is_null($this->layout))
{
$this->layout = View::make($this->layout);
}
}

Berikutnya kita akan buat file view kedua bernama login.blade.php, view ini berguna untuk
menampilkan form login berupa isian username dan password.

app/views/login.blade.php
<div class="small-6 large-6 column login-form">
{{ Form::open(['action' => 'LoginController@postLogin']) }}
<fieldset>
<legend>Login</legend>
{{ Form::label('username','Username') }}
{{
Form::text('username',Input::old('username'),['placeholder'=>'Your nice
name']) }}
{{ Form::label('password','Password') }}
{{ Form::password('password',['placeholder'=>'Password here']) }}
{{ Form::submit('Login',['class'=>'button tiny radius']) }}
</fieldset>
{{ Form::close() }}
@if($errors->has())
@foreach ($errors->all() as $message)
<span class="label alert round">{{$message}}</span><br><br>
@endforeach
@endif
@if(Session::has('failure'))
<span class="label alert
round">{{Session::get('failure')}}</span>
@endif
</div>

Perhatikan baris {{ Form::open(['action' => 'LoginController@postLogin']) }}, ini mengartika bahwa


form login ini akan mengirimkan/post informasi ke fungsi postLogin pada LoginController.php.

Berikutnya kita akan buat file view ketiga bernama dashboard.blade.php, view ini berguna hanya
untuk menampilkan halaman berisi Hai admin, Welcome to Dashboard!.

app/views/dashboard.blade.php

<div class="small-12 large-12 column login-form">


<fieldset>
<div>Hai admin, Welcome to Dashboard!</div>
</fieldset>
</div>

Yang terakhir adalah megedit file app/filters.php. Kenapa harus mengedit file ini?. Ini dikarenakan
secara default ketika sebuah halaman yang ingin diakses/dibuka tanpa autentikasi, maka laravel
akan mengarahkan ke url login . sedangkan url aplikasi login buatan kita halaman depan
mengarah pada url (/) bukan (login). Silahkan cek file routes kembali , perhatikan routes pertama :
Route::get('/', 'LoginController@getLogin');

Pada routes tersebut artinya ketika orang ingin mengakses halaman dashboard tanpa login
harusnya redirect ke url (/). Untuk itulah kita harus sedikit mengubah arah redirect tersebut di file
app/filters.php.

Berikut adalah potongan file app/filters.php

Route::filter('auth', function()
{
if (Auth::guest())
{
if (Request::ajax())
{
return Response::make('Unauthorized', 401);
}
else
{
return Redirect::guest('/');
}
}
});

Yang perlu kita lakukan adalah mengubah baris

return Redirect::guest('login');

menjadi

return Redirect::guest('/');

Untuk mengetesnya silahkan buka secara langsung halaman dashboard tanpa login
http://login.site/admin/dash-board. Maka routes akan mengarahkan kembali ke halaman login.

3.26. Halaman Aplikasi Login Laravel


3.27. Halaman Aplikasi Login Laravel dengan validasi

3.27. Halaman Dashboard Aplikasi Login Laravel

Вам также может понравиться

  • Presentasi
    Presentasi
    Документ2 страницы
    Presentasi
    Khoirul Umam
    Оценок пока нет
  • E-Book Android Fast Track CRUD Android PHP MySQL PDF
    E-Book Android Fast Track CRUD Android PHP MySQL PDF
    Документ18 страниц
    E-Book Android Fast Track CRUD Android PHP MySQL PDF
    Khoirul Umam
    Оценок пока нет
  • MENULIS UNTUK BELAJAR
    MENULIS UNTUK BELAJAR
    Документ3 страницы
    MENULIS UNTUK BELAJAR
    Khoirul Umam
    Оценок пока нет
  • OPTIMASI DIALOG DAN MUSIK
    OPTIMASI DIALOG DAN MUSIK
    Документ11 страниц
    OPTIMASI DIALOG DAN MUSIK
    teguhpribadi86_32617
    Оценок пока нет
  • Database Perusahaan Digitama Group
    Database Perusahaan Digitama Group
    Документ6 страниц
    Database Perusahaan Digitama Group
    Khoirul Umam
    Оценок пока нет
  • Hari 2
    Hari 2
    Документ18 страниц
    Hari 2
    Khoirul Umam
    Оценок пока нет
  • 9 17 1 SM PDF
    9 17 1 SM PDF
    Документ16 страниц
    9 17 1 SM PDF
    Khoirul Umam
    Оценок пока нет
  • Pesantren Dan Pengembangannya
    Pesantren Dan Pengembangannya
    Документ2 страницы
    Pesantren Dan Pengembangannya
    Khoirul Umam
    Оценок пока нет
  • Frs Gunadarma
    Frs Gunadarma
    Документ1 страница
    Frs Gunadarma
    Rivky Putra
    Оценок пока нет
  • Daftar Isi
    Daftar Isi
    Документ1 страница
    Daftar Isi
    Khoirul Umam
    Оценок пока нет
  • PERANCANGAN BASIS DATA SEKARA LOGIKA
    PERANCANGAN BASIS DATA SEKARA LOGIKA
    Документ8 страниц
    PERANCANGAN BASIS DATA SEKARA LOGIKA
    Khoirul Umam
    Оценок пока нет
  • m4 Pdffdaf
    m4 Pdffdaf
    Документ12 страниц
    m4 Pdffdaf
    Khoirul Umam
    Оценок пока нет
  • Paper SP
    Paper SP
    Документ11 страниц
    Paper SP
    Khoirul Umam
    Оценок пока нет
  • Belajar Tajwid
    Belajar Tajwid
    Документ48 страниц
    Belajar Tajwid
    Ferdian Zaman
    98% (82)
  • 10package PDF
    10package PDF
    Документ20 страниц
    10package PDF
    Khoirul Umam
    Оценок пока нет
  • Blalabla
    Blalabla
    Документ3 страницы
    Blalabla
    Khoirul Umam
    Оценок пока нет
  • Modul
    Modul
    Документ3 страницы
    Modul
    Khoirul Umam
    Оценок пока нет
  • Soal Fiskim
    Soal Fiskim
    Документ2 страницы
    Soal Fiskim
    Khoirul Umam
    Оценок пока нет
  • Modul
    Modul
    Документ3 страницы
    Modul
    Khoirul Umam
    Оценок пока нет