Anda di halaman 1dari 118

DAFTAR ISI

BAB 1. Mengenal Framework Laravel .2


BAB 2. Instalasi Dan Konfigurasi Laravel 6
2.1. Software Pendukung Dan Instalasi ...6
2.2. Membuat Virtual Host ..14
BAB 3. Mari Bermain Dengan Laravel ...20
3.1. Routing 20
3.2. MVC 21
3.2.1. Model 21
3.2.2. Migration 22
3.2.3. Seeder 25
3.2.4. Eloquent ..26
3.2.5. View 35
3.2.6. Form ..45
3.2.7. Controller 46
3.3. Operasi CRUD 48
3.4. Authentikasi Login..62
BAB 4. Project Aplikasi Pembuatan Blog ..78
4.1. Pembuatan Project ..78
4.1.1. Migration 78
4.1.2. Seeder 84
4.1.3. Membuat Model ..86
4.1.4. Routes 88
4.1.5. Membuat Controller .90
4.1.6. Membuat View .97
4.2. Membuat Fitur Export Data 111
4.2.1. Export Data Ke Format Excel ..111
4.2.2. Export Data Ke Format PDF .115
BAB 5. Menjalankan Project Aplikasi 120
5.1. Download Project Aplikasi 120
5.2. Install Dependency Aplikasi 120

BAB 1

MENGENAL FRAMEWORK LARAVEL


Framework menjadi sebuah tren untuk para programmer saat ini, dalam hal ini khususnya adalah
programmer web, tentu sebuah framework tidak menjadi asing di telinga karena saking banyaknya
framework yang bertebaran di internet. Sebut saja
aja Codeigniter, Yii, Zend, symfony
symf
sampai dengan
Laravel yang akan dibahas di buku ini.
Buat yang masih asing dengan framework, sebenarnya framework adalah komponen pemrogaman
pemro
yang siap re-use (bisa digunakan ulang) kapan saja, sehingga programmer tidak harus membuat
skrip yang sama untuk tugas yang sama. Misalkan kita ingin membuat halaman
halaman-halaman web yang
menampilkan data dengan paginasi (paging)
(
) halaman, framework telah menyediakan fungsi paging
tersebut sedangkan programmer cukup menggunakan fungsi tersebut pada saat coding, tetapi
tentu dengan kaidah-kaidah
kaidah yang ditetapkan oleh masing
masing-masing
masing framework.
Penggunaan paging tadi adalah sebagian kecil dari contoh library yang disediakan oleh sebuah
framework, namun framework sendiri kelebihan utamanya bukan dari seberapa banyak library
yang di sediakan, meski hal itu tentunya akan sangat membantu proses development. Kelebihan
yang bisa kita ambil dari framework adalah kerangka kerja dari framework tersebut dalam
menyelesaikan modul-modul
modul yang dikembangkan sehinga mengeluarkan sebuah metode pekerjaan
yang lebih effisien, lebih rapi, lebih bersifat general, dan lebih homogen.
Bicara tentang Framework Laravel, bagi
agi pengembang website nama Laravel mungkin tidak asing
lagi. Karena Laravel merupakan framework PHP yang sedang naik daun saat ini. Ini dikarenakan
para pengembang framework ternyata masih belum puas dengan hadirnya framework - framework
yang telah ada, sehingga muncul
muncullah framework baru yang diberii nama Laravel. Menurut website
Sitepoint.com, laravel bahkan didapuk menjadi framework paling populer belakangan ini.

Gambar 1.1. Popularitas Laravel versi sitepoint.com.

Meski tergolong baru, namun Laravel telah mencuri perhatian banyak web programmer di dunia.
Banyak dokumentasi dokumentasi yang sudah disebarluaskan oleh para pengembang website.
Sebenarnya proyek Laravel sudah lama diadakan, sekitar bulan April tahun 2011, dan sekarang
telah menjelma menjadi framework yang banyak digunakan oleh programmer di dunia termasuk
Indonesia.
Pembuat Laravel adalah Taylor Otwell. Alasan pembuatan framework ini menurut sebuah artikel
adalah karena Taylor tidak puas dengan CodeIgniter, karena ada beberapa fitur fungsional menurut
Taylor penting yang tidak support, seperti kotak autentikasi dan routing. Taylor sendiri, ternyata
memiliki latar belakang .Net. Seperti yang sudah umum diketahui bahwa teknologi .Net biasa
digunakan untuk membuat aplikasi enterprise. Dan Taylor Oatwell mencoba mengaplikasikan
pengalamannya tersebut ke dalam Laravel. Dia baru mulai belajar PHP setelah versi 5.3 dirilis dan
Laravel sangat beruntung karena keterlambatan mengenal PHP tersebut membuat Laravel tidak
terkontaminasi dengan backward compatibility PHP dan bisa fokus memanfaatkan fitur-fitur
barunya.
Berikut ini adalah beberapa kelebihan Laravel :
1. Expressif.
Laravel adalah sebuah framework PHP yang expressif, artinya ketika melihat suatu syntax
Laravel, seorang programmer diharapkan akan langsung tahu kegunaan dari syntax tersebut
meskipun belum pernah mempelajarinya apalagi menggunakannya.
2. Simple.
Salah satu yang membuat Laravel begitu simple adalah adanya Eloquent ORM. Misalkan, kita
ingin mengambil semua data yang ada pada tabel users. Maka yang kita perlukan, hanya
membuat sebuah class model bernama User :
Kemudian kita tinggal memasukan semua data dari tabel users tersebut dengan cara sebagai
berikut :
$all_user = User::all();
Dengan begitu, semua data dari tabel users, akan dengan mudah diakses dengan melakukan
looping terhadap variabel $all_user. Eloquent akan dibahas pada bab selanjutnya.
3. Dikembangkan secara khusus untuk PHP 5.3.
Mungkin banyak yang sudah tahu bahwa PHP 5.3 memiki cukup banyak fitur baru dalam segi
bahasa, yang membuat PHP terasa lebih modern dan powerfull. Laravel dikembangkan secara
khusus untuk PHP 5.3, jadi framework ini bisa memanfaatkan berbagai macam kelebihan yang
dimiliki PHP versi baru tersebut. Tidak ada backward compatibility dengan PHP versi
sebelumnya.

4. Dokumentasi yang baik


Laravel dibuat dengan dokumentasi yang sangat lengkap. Core Developer dari laravel sendiri
ber-komitmen, untuk selalu menyertakan dokumentasi yang lengkap setiap kali melakukan rilis
versi terbaru-nya.

Gambar 1.2. Website resmi laravel (www.laravel.com)

BAB 2

INSTALASI DAN KONFIGURASI LARAVEL


2.1. Software Pendukung
Dalam buku ini penulis hanya menjelaskan instalasi dan konfigurasi Laravel pada sistem operasi
Windows. Selain itu dibutuhkan koneksi internet untuk instalasi dan konfigurasi laravel, dan ini
memang yang sedikit membedakan laravel dengan framework lain.

2.1.1. XAMPP Web Server


Karena Laravel adalah framework yang berbasis PHP tentu kita membutuhkan sebuah web Server
untuk menjalankan aplikasi berbasis laravel nantinya. Sebenarnya laravel mendukung penggunaan
web server apache dan ngix. Pada buku ini, saya menggunakan web server Apache. Dan dalam buku
ini saya menggunakan XAMPP web server versi 1.8.2 yang telah mendukung versi PHP 5.3. Jika
menggunakan Jenis web server PHP lain, pastikan yang sudah support PHP 5.3 ya, karena seperti
yang sudah dibahas pada bab sebelumnya , laravel hanya dapat berjalan pada versi 5.3 keatas.
Untuk mendapatkan file instalasi XAMPP versi 1.8.2 silahkan Anda unduh sendiri di link berikut ini
: https://www.apachefriends.org/download.html.

2.1.2. Install Composer


Apa itu Composer ? Ini utility yang dipakai untuk dependency management. Composer
mempermudah kita mendownload dan mengimport library PHP. Misalnya, kita ingin menggunakan
library A yang butuh library B. Library B sendiri butuh library C. Dulu sebelum ada Composer, kita
harus instal sendiri masing-masing library, ribet dan bikin pusing pastinya. Belum lagi kalo library
A hanya kompatibel dengan library B versi tertentu. Pake Composer, kita tinggal bilang kalau kita
ingin pake library A versi x, nantinya Composer akan mendownload library B dan C yang versinya
sesuai.
Untuk mendownloadnya silahkan buka www.composer.org, pilih windows installer, setelah
didownload selanjutnya adalah menginstalnya, berikut adalah stepnya :

Gambar 2.1. Website getcomposer.org

Gambar 2.2. Tampilan Awal Instalasi Composer

Gambar 2.3. Pilih Install Shell Menu

Gambar 2.4. Pastikan composer bisa deteksi php di system-path.

Pada bagian ini masukkan/browse path dari php.exe,jika menggunakan XAMPP biasanya letaknya
ada di dalam folder xampp/php. Lihat Gambar 2.5.

2.5. Letak file php.exe

Proses selanjutnya composer akan memulai proses instalasinya. Yang perlu diperhatikan disini
composer akan membutuhkan koneksi internet. Jika proses instalasi berhasil, bukalah jendela
prompt, lalu ketikan perintah : composer , maka akan menghasilkan tampilan seperti pada gambar
2.6.

2.6. Tampilan jendela prompt jika telah menginstal composer

2.1.3. Membuat Project Laravel


Secara umum pembuatan project dengan laravel bisa kita lakukan dengan 3 cara, antara lain
sebagai berikut :
A.

Lewat perintah Composer create project

Setelah composer berhasil diinstal, mari membuat project dengan laravel dengan cara yang
pertama, caranya buka command prompt, kemudian pindah ke direktori htdocs/webroot di
d:\xampp\htdocs (silahkan sesuaikan dengan lokasi htdocs Anda). Ketikan perintah di command
prompt sebagai berikut untuk instalasi Laravel versi terbaru:
composer create-project laravel/laravel nama-proyek --prefer-dist
Silahkan ganti nama-proyek sesuai dengan keinginan Anda, Sekali lagi perlu diingat bahwa Anda
perlu terkoneksi ke internet untuk melakukan instalasi. Setelah instalasi selesai silahkan buka
Laravel di lokasi d:\xampp\htdocs\nama-proyek (sesuaikan dengan folder htdocs Anda).

2.7. membuat project laravel dengan perintah composer create project


Jika berhasil , maka laravel akan mengunduh segala dependency yang dibutuhkan sehingga project
nama-proyek akan terbuat. Struktur file yang terbentuk bisa dilihat digambar 2.8.

2.8. Struktur file folder project yang terbentuk


B. Mendownload Laravel dan menginstal dependensi via command prompt
Untuk pembuatan project dengan cara kedua, caranya adalah sebagai berikut :

Buka situs laravel di alamat http://laravel.com

Klik pada menu Github

Anda akan diarahkan ke halaman github laravel

Klik tombol Download ZIP disamping kanan

Extract file laravel-master.zip yang tadi anda unduh

Rename folder laravel-master menjadi nama-proyek Anda , atau sesuaikan dengan nama
proyek yang akan Anda buat.

Pindahkan ke direktori htdocs anda (misal d:\xampp\htdocs), sesuaikan dengan direktori


Anda.

Buka command prompt windows

Arahkan ke direktori nama-proyek dengan perintah cd c:\xampp\htdocs\nama-proyek

Ketikkan perintah berikut pada command prompt composer install

Tunggu hingga proses instalasi selesai.

Dan Jika berhasil , maka laravel akan mengunduh segala dependency yang dibutuhkan sehingga
project nama-proyek akan terbuat. Struktur file yang terbentuk bisa dilihat digambar 2.8.

2.9. Tampilan command prompt saat menginstal dependency


C. Mendownload Laravel dan menginstal dependensi via command prompt
Jika Anda menginginkan pembuatan project tanpa koneksi internet mungkin cara ini bisa menjadi
solusinya, Anda cukup mendownload lalu mengekstrak, dan jalankan aplikasinya.
aplikasi
Kebetulan ada
orang baik diluar sana yang sudah melakukan setup laravel dan mendownload semua dependensi
yang diperlukan (artinya orang tersebu
tersebutt sudah melakukan entah metode pertama atau metode
kedua).
).
Anda
bisa
mendownload
file
yang
sudah
lengkap
len
tersebut
https://github.com/mandado/laravel
https://github.com/mandado/laravel-preloaded/archive/master.zip.
Selanjutnya ekstrak file
tersebut dan pindahkan isinya ke folder nama-proyek di webroot Anda.
Catatan :

Cara ketiga ini tidak dianjurkan karena file tersebut tidak dijamin up to date. Artinya bisa jadi
file yang Anda download bisa jadi bukan merupakan Laravel versi terbaru. Pun demikian
dengan library lainnya.

Silahkan copy folder project nama-proyek dan rename-lah folder


lder tersebut untuk keperluan
pembuatan latihan lain dalam buku ini.

Untuk menjalankan project pada metode pertama, kedua dan ketiga silahkan buka browser dan
ketikkan http://localhost/nama-proyek/public, maka halaman web berlogo laravel akan tampil
di browser, artinya project berjalan dengan baik. Lihat gambar 2.10.

2.10. Halaman Project laravel di browser

2.2. Membuat Virtual Host


Setelah mengetahui cara instalasi Laravel dan pembuatan project, pengaturan selanjutnya adalah
konfigurasi virtual host. Kenapa konfigurasi ini diperlukan? sebenarnya ini tidak wajib karena
didokumentasi resmi Laravel pun tidak menyebutkan harus menggunakan virtual host, salah satu
alasan yang baik menurut penulis adalah supaya dalam pembangunan sebuah proyek dengan
Laravel tampak seperti menggunakan domain sungguhan, dan membuat aplikasi-aplikasi kita
terlihat rapi. Oke supaya tidak berlama-lama mari kita mulai.
Langkah 1
Buka file C:\windows\system32\drivers\etc\hosts dengan teks editor Anda atau bisa dengan
Notepad dan tambahkan 127.0.0.1 latihan.site kebagian paling bawah, untuk jelasnya silahkan

lihat gambar 2.11. Jika anda menggunakan Windows 7/ 8, Anda perlu menggunakan level
administrator untuk mengubah file tersebut.

2.11. menambahkan alamat latihan.site pada file host


Penamaan latihan.site disini sebenarnya terserah Anda , ini artinya project yang kita buat akan
dibuka lewat url local latihan.site.
Langkah 2
Sekarang lakukan konfigurasi VirtualHost pada Apache web server, caranya pastikan virtual host di
include dalam setingan httpd.conf, biasanya XAMPP versi terbaru di Windows sudah di include.
Dalam tutorial ini maupun tutorial cara instalasi Laravel, saya menggunakan XAMPP yang diinstal
di D:\xampp. Oke, untuk memastikan apakah virtual host sudah di include atau belum silahkan
buka file D:\xampp\apache\conf\httpd.conf, kira-kira baris ke 473 ada tulisan #Include
"conf/extra/httpd-vhosts.conf", nah kalau ada tanda pagar (#) didepannya silahkan dihapus tanda
tersebut kemudian simpan perubahan (save), jika tidak ada berarti virtual host sudah include
dalam setingan httpd.conf.
Lalu tambahkan baris-baris ini pada file
<directory></directory> Lihat gambar 2.11:

httpd.conf,

biasanya

letaknya

pada

baris

<Directory "D:/Xampp/htdocs/nama-proyek/public">
Options Indexes FollowSymLinks Includes ExecCGI
AllowOverride All
Order allow,deny
Allow from all
Require all granted
</Directory>

Keterangan : pada path directory adalah letak folder project pada web server, karena penulis
menginstal xampp pada directory D, maka letaknya di D:/Xampp/htdocs/nama-proyek/public
(sesuaikan dengan letak proyek Anda).

2.12. Konfigurasi file httpd.conf

Selanjutnya silahkan buka file virtual host di D:\xampp\apache\conf\extra\httpd-vhosts.conf dan


tambahkan kode berikut pada bagian bawah script, lihat gambar 2.13:
<VirtualHost *:80>
DocumentRoot D:/Xampp/htdocs/nama-proyek/public
ServerName latihan.site
</VirtualHost>

Keterangan : document root mengartikan bahwa letak folder proyek, sedangkan alias adalah nama
alias latihan.site yang sebelumnya sudah kita pointing di file host windows. Setelah selesai
merubah file httpd.conf dan httpd-vhosts.conf maka Anda harus merestart service apache pada
web server Anda (xampp). Jika sudah direstart baru nama alias dari url server latihan.site akan
mengarahkan ke folder proyek nama-proyek. Dan silahkan coba buka di browser dengan alamat
latihan.site jika mengarah pada logo laravel (gambar 2.14) , itu artinya pembuatan virtual host
Anda berhasil.

2.13. Konfigurasi file httpd-vhost.conf

2.14. Aplikasi dibuka dengan virtual host

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

Seeding dan

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
Id

Type
int(10) unsigned

Null
No

Key
Primary

Default
Null

nama

varchar(255)

No

Null

Alamat

varchar(255)

No

Null

created_at

timestamp

update_at

timestamp

0000-00-00 00:00:00
No

0000-00-00 00:00:00

Extra
auto_incre
ment

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 namaproyek/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,
proyek/app/database/seeds.

simpan

di

dalam

folder

nama-

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,
28'),

'title'=>'Kresna

Abimanyu',

'alamat'=>'jalan

Kebagusan

No.

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
Id

Type
int(10) unsigned

Null
No

Key
Primary

Default
Null

Hobi

varchar(255)

No

Null

anggota_id

int(11)

No

Null

created_at

timestamp

update_at

timestamp

0000-00-00 00:00:00
No

0000-00-00 00:00:00

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


php artisan migrate : make buat_table_hobi

Extra
auto_incre
ment

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
inputan)
protected $fillable = array('nama', 'alamat');
}

diperbolehkan

menerima

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
Kasman</footer>
</div>
</div>
</div>
</div>
</body>
</html>

Akhmad

Dharma

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

dan

lokasi

*/
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
use
use
use

Illuminate\Auth\UserTrait;
Illuminate\Auth\UserInterface;
Illuminate\Auth\Reminders\RemindableTrait;
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

BAB 4

PROJECT APLIKASI PEMBUATAN BLOG


Oke, setelah Anda paham akan dasar-dasar framework laravel, lalu kini saatnya Anda mampu
membuat sebuah aplikasi secara utuh dengan laravel. Dalam bab ini kita akan membangun aplikasi
blog sederhana, yang memuat dan mengelola postingan dan komentar. Pada bab ini kita akan
membahas mulai dari migration dan seeding, pembuatan model, controller dan tentu saja viewnya.
Secara tampilan kita akan membuat tampilan dari dua sisi yaitu tampilan blog yang dilihat dari sisi
publik dan tampilan dari sisi administrator yang mengelola konten blog (postingan dan komentar).
Supaya proyek tidak tumpang tindih, kita manfaatkan copy-an dari proyek mentah nama-proyek
yang belum dimodifikasi di awal, bisa kita namakan/rename proyeknya menjadi blog. 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 lagi seperti pada pembahasan sebelumnya.
Silahkan copy folder assets di dalam folder public pada project blog yang sebelumnya telah
kita buat ke project blog/ public/assets.
Pada project blog ini, penulis menambahkan satu lagi virtual host bernama http://blog.site.
Silahkan buat dengan cara yang telah dijelaskan pada bab 2. Tampilan aplikasinya bisa dilihat pada
gambar 4.3-4.10.

4.1.

Perancangan Database

Seperti pada bab sebelumnya ,tentu kita akan membuat lagi satu database yang akan menjadi
tempat penyimpanan data aplikasi blog kita. Databasenya akan kita namakan blog, lihat gambar
4.1, dengan jumlah tabelnya adalah 4 (empat), yaitu tabel users, posts, comments dan
migrations (tabel ini tidak perlu dibuat karena otomatis saat kita membuat sebuah migration.
Sebelum membuat migration jangan lupa untuk mensetting databasenya pada file database.php
yang terletak di blog/app/config/. Lalu ganti baris database pada bagian mysql dengan nama
blog.

4.1. Pembuatan database blog

4.1.1 Migration
1. Tabel users
Tabel users berfungsi untuk menyimpan data Administrator / Orang yang menjalankan dan
mengelola aplikasi blog. Adapun struktur tabelnya adalah sebagai berikut :
StrukturTabel users

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 blog , jalankan perintah berikut:
php artisan migrate : make buat_table_users
Perintah diatas akan menghasilkan sebuah file, misalnya dengan nama
blog/app/database/migrations/ xxxx_xx_xx_xxxxxx_ buat_tabel_users.php.
Ubah isian file tersebut menjadi:
blog/app/database/migrations/ xxxx_xx_xx_xxxxxx_ buat_tabel_users.php
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class BuatTabelUsers extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('users', 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('users', function (Blueprint $table) {
$table->drop();
});
}
}

dan

lokasi

2. Tabel posts
Tabel posts berfungsi untuk menyimpan data postingan/artikel. Adapun struktur tabelnya
adalah sebagai berikut :
StrukturTabel posts

Nama Field

Tipe Data

Size

Extra

Primary

Id

int

10

Auto increment

Yes

title

varchar

255

read_more

varchar

255

content

text

comment_count int

10

created_at

timestamp

100

update_at

timestamp

Lalu jalankan perintah migrationnya:


php artisan migrate : make buat_table_posts
Perintah diatas akan menghasilkan sebuah file, misalnya dengan nama
blog/app/database/migrations/ xxxx_xx_xx_xxxxxx_ buat_tabel_posts.php.
Ubah isian file tersebut menjadi:
blog/app/database/migrations/ xxxx_xx_xx_xxxxxx_ buat_tabel_posts.php

<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

dan

lokasi

class BuatTabelPosts extends Migration


{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('posts', function(Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->string('read_more');
$table->text('content');
$table->unsignedInteger('comment_count');
$table->timestamps();
$table->engine = 'MyISAM';
});
DB::statement('ALTER TABLE posts ADD FULLTEXT search(title,
content)');
}

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

$table->drop();
});
}
}

3. Tabel comments
Tabel comments berfungsi untuk menyimpan data komentar dari postingan/artikel. Adapun
struktur tabelnya adalah sebagai berikut :
StrukturTabel commets

Nama Field

Tipe Data

Size

Extra

Primary

id

int

10

Auto increment

Yes

post_id

int

10

commenter

varchar

255

email

varchar

255

comment

text

approve

tinyint

created_at

timestamp

100

update_at

timestamp

Lalu jalankan perintah migrationnya:


php artisan migrate : make buat_table_comments
Perintah diatas akan menghasilkan sebuah file, misalnya dengan nama
blog/app/database/migrations/ xxxx_xx_xx_xxxxxx_ buat_tabel_comments.php.
Ubah isian file tersebut menjadi:

dan

lokasi

app/database/migrations/ xxxx_xx_xx_xxxxxx_ buat_tabel_comments.php


<?php

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

class BuatTabelComments extends Migration {


/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('comments', function(Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('post_id');
$table->string('commenter');
$table->string('email');
$table->text('comment');
$table->boolean('approved');
$table->timestamps();
});
}

/**
* Reverse the migrations.
*
* @return void
*/

public function down()


{
Schema::drop('comments');
}
}

Selanjutnya ketikkan perintah migration pada terminal kembali:


php artisan migrate

Gambar 4.2. Empat tabel hasil proses migration

4.1.2 Seeder
Mari kita membuat seeder/contoh data untuk tabel posts dan tabel comments. Agar tidak capek
untuk mengetik data contoh/dummy, kita akan melakukan looping untuk kedua tabel tersebut.
Buatlah
file
bernama
PostCommentSeeder.php,
simpan
di
dalam
folder
blog/app/database/seeds.
app/database/seeds/PostCommentSeeder.php
<?php
class PostCommentSeeder extends Seeder {
public function run()
{
$content = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Praesent vel ligula scelerisque, vehicula dui eu, fermentum velit.
Phasellus ac ornare eros, quis malesuada augue. Nunc ac nibh at mauris
dapibus fermentum.

In in aliquet nisi, ut scelerisque arcu. Integer tempor, nunc ac lacinia


cursus.
for( $i = 1 ; $i <= 20 ; $i++ )
{
$post = new Post;
$post->title = "Post no $i";
$post->read_more = substr($content, 0, 120);
$post->content = $content;
$post->save();

$maxComments = mt_rand(3,15);
for( $j = 1 ; $j <= $maxComments; $j++)
{
$comment = new Comment;
$comment->commenter = 'xyz';
$comment->comment = substr($content, 0, 120);
$comment->email = 'xyz@xmail.com';
$comment->approved = 1;
$post->comments()->save($comment);
$post->increment('comment_count');
}
}
}
}

Berikutnya, kita juga harus membuat seeder untuk administrator. Isi datanya cukup satu saja dulu,
yaitu username dan password : admin.

app/database/seeds/UserTableSeeder.php
<?php
class UserTableSeeder extends Seeder
{
public function run()
{
// Uncomment the below to wipe the table clean before populating
// DB::table('users')->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('users')->insert($user);
}

}
Jika sudah, daftarkan kedua 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('PostCommentSeeder');
$this->call('UserTableSeeder');
}
}

Terakhir tentu kita akan menjalankan perintah seeder itu sendiri, kembali ke terminal dan folder
proyek lalu ketikkan :
php artisan db:seed
Cek kembali database Anda, apakah tabel users, posts dan comments sudah terisi data dummy yang
telah kita buatkan tadi?.

4.1.3 Membuat Model


Berikutnya kita akan membuat 3 buah model untuk mengakses database lewat Eloquent. Model
yang akan kita buat adalah User, Post dan Comment. Model User akan berfungsi untuk mengakses
data admin pada tabel users, model Post akan berfungsi untuk mengakses data dari tabel posts dan
comments, karena di model ini kita akan menggunakan relasi One To Many, dimana berarti satu
data postingan akan mempunyai banyak komentar(comment). Sedangkan model yang ketiga, yaitu
comment akan berfungsi untuk mengakses dan mengelola data komentar pada tabel comments.
Silahkan buat ke 3 model berikut :
app/database/models/User.php
<?php
use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableInterface;
class User extends Eloquent implements UserInterface, RemindableInterface {
/**
* The database table used by the model.
*
* @var string
*/
protected $table = 'users';
/**
* The attributes excluded from the model's JSON form.
*
* @var array
*/
protected $hidden = array('password');
/**
* Get the unique identifier for the user.

*
* @return mixed
*/
public function getAuthIdentifier()
{
return $this->getKey();
}
/**
* Get the password for the user.
*
* @return string
*/
public function getAuthPassword()
{
return $this->password;
}
/**
* Get the e-mail address where password reminders are sent.
*
* @return string
*/
public function getReminderEmail()
{
return $this->email;
}
/**
* Required for laravel 4.1.26+
*
*/
public function getRememberToken()
{
return $this->remember_token;
}
public function setRememberToken($value)
{
$this->remember_token = $value;
}
public function getRememberTokenName()
{
return 'remember_token';
}
}

app/database/models/Post.php
<?php
class Post extends Eloquent
{
protected $fillable = ['title', 'content'];
public function comments()
{
return $this->hasMany('Comment');

}
public function delete()
{
foreach ($this->comments as $comment) {
$comment->delete();
}
return parent::delete();
}
}

app/database/models/Comment.php
<?php
class Comment extends Eloquent
{
protected $fillable = ['commenter', 'email', 'comment'];
public function post()
{
return $this->belongsTo('Post');
}
public function getApprovedAttribute($approved)
{
return (intval($approved) == 1) ? 'yes' : 'no';
}
public function setApprovedAttribute($approved)
{
$this->attributes['approved'] = ($approved === 'yes') ? 1 : 0;
}
}

4.1.4 Routes
Pada pembuatan routes pada aplikasi ini kita akan membuat routes menjadi beberapa bagian,
seperti :

Bagian user yang bisa melihat postingan dan mengisi komentar dari postingan.
Bagian admin yang mengatur tentang view-view/tampilan-tampilan yang diautentikasi, seperti
daftar , tambah, edit, update, penyimpanan postingan, menampilkan komentar dan
menggapprove atau tidak komentar untuk ditampilkan di halaman user.
Bagian sidebar yang menampilkan daftar postingan terakhir.

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.
|
//file: app/routes.php
/* Model Bindings */
Route::model('post','Post');
Route::model('comment','Comment');
/* User routes */
Route::get('/post/{post}/show',['as' => 'post.show','uses' =>
'PostController@showPost']);
Route::post('/post/{post}/comment',['as' => 'comment.new','uses'
=>'CommentController@newComment']);
/* Admin routes */
Route::group(['prefix' => 'admin','before'=>'auth'],function()
{
/*get routes*/
Route::get('dash-board',function()
{
$layout = View::make('master');
$layout->title = 'DashBoard';
$layout->main = View::make('dash')->with('content','Hi admin, Welcome
to Dashboard!');
return $layout;
});
Route::get('/post/list',['as' => 'post.list','uses' =>
'PostController@listPost']);
Route::get('/post/new',['as' => 'post.new','uses' =>
'PostController@newPost']);
Route::get('/post/{post}/edit',['as' => 'post.edit','uses' =>
'PostController@editPost']);
Route::get('/post/{post}/delete',['as' => 'post.delete','uses' =>
'PostController@deletePost']);
Route::get('/comment/list',['as' => 'comment.list','uses' =>
'CommentController@listComment']);
Route::get('/comment/{comment}/show',['as' => 'comment.show','uses' =>
'CommentController@showComment']);
Route::get('/comment/{comment}/delete',['as' => 'comment.delete','uses'
=> 'CommentController@deleteComment']);
/*post routes*/
Route::post('/post/save',['as' => 'post.save','uses' =>
'PostController@savePost']);
Route::post('/post/{post}/update',['as' => 'post.update','uses' =>
'PostController@updatePost']);

Route::post('/comment/{comment}/update',['as' => 'comment.update','uses'


=> 'CommentController@updateComment']);
});
/* Home routes */
Route::controller('/','BlogController');
/* View Composer */
View::composer('sidebar', function ($view) {
$view->recentPosts = Post::orderBy('id', 'desc')->take(5)->get();
});

Kita buatkan Route::group(['prefix' )dimana route-route yang ada didalam route group tersebut
harus melalui sebuah autentikasi terlebih dahulu. Selain itu route ada yang sifatnya Get dan Post.
Yang sifatnya mengambil data (get) adalah menampilkan, menambah, mengedit dan menghapus.
Sedangkan yang sifatnya pengiriman data (post) adalah menyimpan dan mengupdate. Selain itu
baris pertama adalah route sebagai model. Model dalam route berarti kita bisa menginject model
tanpa menggunakan id pada sebuah route, seperti sudah dijelaskan di bab sebelumnya.
Home routes mengarahkan pada halaman depan aplikasi blog yang diatur oleh controller bernama
BlogController yang nanti akan kita buat. Sedangkan View Composer akan menampilkan 5
postingan terakhir yang diletakkan pada sidebar halaman, penggunaan view composer berguna jika
kita ingin memberikan callback pada saat view dibuat, dalam kasus ini adalah file view sidebar.

4.1.5 Membuat Controller


Mari kita membuat controller sebagai media penghubung antara Model dan View yang nanti akan
kita buat. Disini kita akan membuat 3 buah controller yaitu BlogController, Postcontroller dan
CommentController.
A. BlogController akan berisi fungsi-fungsi yang menangani hal-hal berikut ini :
function _construct() -> Fungsi konstruktor untuk mencegah login ulang ketika administrator
sudah login.
function getIndex() -> Fungsi yang menampilkan halaman depan dari blog.
function getSearch() -> Fungsi pencarian yang ada di dalaman depan blog.
function getLogin() -> Fungsi yang menangani tampilan halaman login administrator.
function postLogin() -> Fungsi yang menangani pengiriman data login dari administrator.
function getLogout() -> Fungsi yang menangani logout/penghancuran sesi administrator.
Berikutnya mari kita buatkan file BlogController.php tersebut.

app/controllers/BlogController.php
<?php
class BlogController extends BaseController {
public function __construct()
{
//untuk mencegah login ulang.
$this->beforeFilter('guest',['only' => ['getLogin']]);
$this->beforeFilter('auth',['only' => ['getLogout']]);
}
public function getIndex()
{
$posts = Post::orderBy('id','desc')->paginate(10);
// For Laravel 4.2 use getFactory() instead of getEnvironment() method.
$posts->getFactory()->setViewName('pagination::simple');
$this->layout->title = 'Home Page | Blog Dengan Laravel';
$this->layout->main
=
View::make('home')>nest('content','index',compact('posts'));
}
public function getSearch()
{
$searchTerm = Input::get('s');
$posts
=
Post::whereRaw('match(title,content)
against(?
in
boolean
mode)',[$searchTerm])
->paginate(10);
// For Laravel 4.2 use getFactory() instead of getEnvironment() method.
$posts->getFactory()->setViewName('pagination::slider');
$posts->appends(['s'=>$searchTerm]);
$this->layout->with('title','Search: '.$searchTerm);
$this->layout->main = View::make('home')
->nest('content','index',($posts->isEmpty()) ? ['notFound' => true ] :
compact('posts'));
}
public function getLogin()
{
$this->layout->title='login';
$this->layout->main = View::make('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
password is invalid!');
}
else
{
return Redirect::back()->withErrors($validator)->withInput();
}
}

or

public function getLogout()


{
Auth::logout();
return Redirect::to('/');
}
}

B. PostController akan berisi fungsi-fungsi yang menangani hal-hal berikut ini :


function listPost() - > Fungsi untuk menampilkan datar postingan.
function showPost(Post $post) -> Fungsi Untuk menampilkan single/detail postingan.
function newPost() -> Fungsi untuk menampilkan tampilan tambah postingan.
function editPost(Post $post) -> Fungsi untuk menampilkan tampilan edit postingan.
function deletePost(Post $post) -> Fungsi untuk menghapus postingan.
function savePost() - > Fungsi untuk menyimpan postingan.
function updatePost(Post $post) -> Fungsi untuk mengupdate postingan.
Kesemua fungsi yang dibuat pada PostController ditujukan untuk pengolahan data postingan yang
dilakukan oleh administrator. Silahkan cek file routes, penggunaan kesemua fungsi tersebut berada
pada group prefix admin, dimana administrator harus melakukan autentikasi terlebih dahulu
sebelum menggunakan fungsi-fungsi tersebut.
Berikut adalah skrip lengkap PostController.php tersebut. Dan buatlah file ini.
app/controllers/PostController.php
<?php
class PostController extends BaseController
{
/* get functions */
public function listPost()
{

$posts = Post::orderBy('id','desc')->paginate(10);
$this->layout->title = 'Post listings';
$this->layout->main = View::make('dash')>nest('content','posts.list',compact('posts'))->with('title',$this>layout->title);
}
public function showPost(Post $post)
{
$comments = $post->comments()->where('approved', '=', 1)->get();
$this->layout->title = $post->title;
$this->layout->main = View::make('home')->nest('content', 'posts.single',
compact('post', 'comments'))->with('title',$this->layout->title);
}
public function newPost()
{
$this->layout->title = 'New Post';
$this->layout->main = View::make('dash')->nest('content', 'posts.new')>with('title',$this->layout->title);
}
public function editPost(Post $post)
{
$this->layout->title = 'Edit Post';
$this->layout->main = View::make('dash')->nest('content', 'posts.edit',
compact('post'))->with('title',$this->layout->title);
}
public function deletePost(Post $post)
{
$post->delete();
return Redirect::route('post.list')->with('success', 'Post is deleted!');
}
/* post functions */
public function savePost()
{
$post = [
'title' => Input::get('title'),
'content' => Input::get('content'),
];
$rules = [
'title' => 'required',
'content' => 'required',
];
$valid = Validator::make($post, $rules);
if ($valid->passes())
{
$post = new Post($post);
$post->comment_count = 0;
$post->read_more = (strlen($post->content) > 120) ? substr($post>content, 0, 120) : $post->content;
$post->save();
return Redirect::to('admin/dash-board')->with('success', 'Post is
saved!');
}

else
return Redirect::back()->withErrors($valid)->withInput();
}
public function updatePost(Post $post)
{
$data = [
'title' => Input::get('title'),
'content' => Input::get('content'),
];
$rules = [
'title' => 'required',
'content' => 'required',
];
$valid = Validator::make($data, $rules);
if ($valid->passes())
{
$post->title = $data['title'];
$post->content = $data['content'];
$post->read_more = (strlen($post->content) > 120) ? substr($post>content, 0, 120) : $post->content;
if(count($post->getDirty()) > 0) /* avoiding resubmission of same content
*/
{
$post->save();
return Redirect::back()->with('success', 'Post is updated!');
}
else
return Redirect::back()->with('success','Nothing to update!');
}
else
return Redirect::back()->withErrors($valid)->withInput();
}
}

C. CommentController akan berisi fungsi-fungsi yang menangani hal-hal berikut ini :


function listComment() - > Fungsi untuk menampilkan daftar komentar yang telah dikirimkan
pengunjung.
function newComment(Post $post) - > Fungsi untuk mengirimkan informasi komentar ke tabel.
function showComment(Comment $comment) - > Fungsi untuk menampilkan single/detail
komentar.
function deleteComment(Comment $comment) -> Fungsi untuk menghapus komentar.
function updateComment(Comment $comment) -> Fungsi untuk mengupdate komentar, dimana
administrator akan menyetujui/mengapprove atau tidak komentar untuk ditampilkan di sisi
pengunjung.

Berikut adalah skrip lengkap CommentController.php tersebut. Dan buatlah file ini.
<?php
class CommentController extends BaseController
{
/* get functions */
public function listComment()
{
$comments = Comment::orderBy('id', 'desc')->paginate(20);
$this->layout->title = 'Comment Listings';
$this->layout->main
=
View::make('dash')->nest('content',
'comments.list', compact('comments'));
}
public function newComment(Post $post)
{
$comment = [
'commenter' => Input::get('commenter'),
'email' => Input::get('email'),
'comment' => Input::get('comment'),
];
$rules = [
'commenter' => 'required',
'email' => 'required | email',
'comment' => 'required',
];
$valid = Validator::make($comment, $rules);
if ($valid->passes()) {
$comment = new Comment($comment);
$comment->approved = 'no';
$post->comments()->save($comment);
/* redirect back to the form portion of the page */
return Redirect::to(URL::previous() . '#reply')
->with('success', 'Comment has been submitted and waiting for
approval!');
} else {
return
Redirect::to(URL::previous()
.
'#reply')>withErrors($valid)->withInput();
}
}
public function showComment(Comment $comment)
{
if (Request::ajax())
return View::make('comments.show', compact('comment'));
// handle non-ajax calls here
//else{}
}
public function deleteComment(Comment $comment)
{
$post = $comment->post;
$status = $comment->approved;
$comment->delete();
($status === 'yes') ? $post->decrement('comment_count') : '';

return Redirect::back()->with('success', 'Comment deleted!');


}
/* post functions */
public function updateComment(Comment $comment)
{
$comment->approved = Input::get('status');
$comment->save();
$comment->post->comment_count
=
Comment::where('post_id',
'=',
$comment->post->id)
->where('approved', '=', 1)->count();
$comment->post->save();
return Redirect::back()->with('success', 'Comment ' . (($comment>approved === 'yes') ? 'Approved' : 'Disapproved'));
}
}

4.1.6 Membuat View


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

Layout master/utama -> master.blade.php


Tampilan Sidebar -> sidebar.blade.php
Tampilan postingan di halaman depan pengunjung -> index.blade.php
Tampilan muka/depan pengunjung beserta sidebarnya -> home.blade.php
Tampilan halaman login administrator -> login.blade.php
Tampilan depan/dashboard administrator -> dash.blade.php
Tampilan daftar postingan dari sisi administrator -> list.blade.php
Tampilan single/detail postingan dari sisi administrator -> single.blade.php
Tampilan untuk menambah postingan -> new.blade.php
Tampilan untuk edit data postingan -> edit.blade.php
Tampilan komentar untuk diisi pengunjung -> commentform.blade.php
Tampilan daftar seluruh komentar dari sisi administrator -> list.blade.php
Tampilan single/detail komentar -> show.blade.php

Masuk ke folder views, buatlah 2 buah folder bernama posts dan comments. Strukturnya
folder dan file viewnya kurang lebih seperti berikut :
- app
-- views
--- master.blade.php
--- sidebar.blade.php
--- index.blade.php
--- home.blade.php
--- login.blade.php
--- dash.blade.php

--- posts
------- list.blade.php
------- single.blade.php
------- new.blade.php
------- edit.blade.php
--- comment
------- commentform.blade.php
------- list.blade.php
------- show.blade.php
Pertama kita akan buatkan file-file view untuk layout yang sifatnya master/utama. Yaitu file yang
akan kita letakkan pada folder utama(dalam folder 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') }}
{{ HTML::script('./assets/js/vendor/custom.modernizr.js') }}
</head>
<body>
<div class="row main">
<div class="small-12 large-12 column" id="masthead">
<header>
<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 class="{{(strcmp(URL::full(), URL::to('/')) == 0) ? 'active' :
''}}"><a href="{{URL::to('/')}}">Home</a></li>
</ul>
<ul class="right">
@if(Auth::check())
<li class="{{ (strpos(URL::current(), URL::to('admin/dash-board'))!==
false) ? 'active' : '' }}">
{{HTML::link('admin/dash-board','Dashboard')}}
</li>
<li class="{{ (strpos(URL::current(), URL::to('logout'))!== false) ?
'active' : '' }}" >
{{HTML::link('logout','Logout')}}
</li>
@else

<li class="{{ (strpos(URL::current(), URL::to('login'))!== false) ?


'active' : '' }}">
{{HTML::link('login','Login')}}
</li>
@endif
</ul>
</section>
</nav>
<div class="sub-header">
<hgroup>
<h1>{{HTML::link('/','Blog dengan Laravel 4')}}</h1>
<h2>Aplikasi Blog Dengan laravel</h2>
</hgroup>
</div>
</header>
</div>
<div class="row">
{{$main}}
</div>
<div class="row">
<div class="small-12 large-12 column">
<footer class="site-footer"></footer>
</div>
</div>
</div>
{{ HTML::script('./assets/js/vendor/jquery.js') }}
{{ HTML::script('./assets/js/foundation.min.js') }}
<script>
$(document).foundation();
</script>
</body>
</html>

app/views/sidebar.blade.php
{{ Form::open(['url' => 'search','method'=>'get']) }}
<div class="row">
<div class="small-8 large-8 column">
{{ Form::text('s',Input::old('username'),['placeholder'=>'Search
blog...']) }}
</div>
{{ Form::submit('Search',['class'=>'button tiny radius']) }}
</div>
{{ Form::close() }}
<div>
<h3>Recent Posts</h3>
<ul>
@foreach($recentPosts as $post)
<li>{{link_to_route('post.show',$post->title,$post->id)}}</li>
@endforeach
</ul>
</div>

app/views/index.blade.php
@if(!empty($notFound))

<p>Sorry nothing found for your query!</p>


@else
@foreach($posts as $post)
<article class="post">
<header class="post-header">
<h1 class="post-title">
{{link_to_route('post.show',$post->title,$post->id)}}
</h1>
<div class="clearfix">
<span class="left date">{{explode(' ',$post->created_at)[0]}}</span>
<span class="right label">{{$post->comment_count}} comments </span>
</div>
</header>
<div class="post-content">
<p>{{$post->read_more.' ...'}}</p>
<span>{{link_to_route('post.show','Read full article',$post->id)}}
</div>
<footer class="post-footer">
<hr>
</footer>
</article>
@endforeach
{{$posts->links()}}
@endif

app/views/home.blade.php
{{-- home page --}}
<div class="small-8 large-8 column">
<div class="content">
{{$content}}
</div>
</div>
<div class="small-4 large-4 column">
<aside class="sidebar">
@include('sidebar')
</aside>
</div>

app/views/login.blade.php
<div class="small-6 large-6 column login-form">
{{ Form::open(['action' => 'BlogController@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>

app/views/dash.blade.php
<div class="small-3 large-3 column">
<aside class="sidebar">
<h3>Menu</h3>
<ul class="side-nav">
<li>{{HTML::link('/','Home')}}</li>
<li class="divider"></li>
<li class="{{ (strpos(URL::current(),route('post.new'))!== false) ?
'active' : '' }}">
{{HTML::linkRoute('post.new','New Post')}}
</li >
<li class="{{ (strpos(URL::current(),route('post.list'))!== false) ?
'active' : '' }}">
{{HTML::linkRoute('post.list','List Posts')}}
</li>
<li class="divider"></li>
<li class="{{ (strpos(URL::current(),route('comment.list'))!== false) ?
'active' : '' }}">
{{HTML::linkRoute('comment.list','List Comments')}}
</li>
</ul>
</aside>
</div>
<div class="small-9 large-9 column">
<div class="content">
@if(Session::has('success'))
<div data-alert class="alert-box round">
{{Session::get('success')}}
<a href="#" class="close">&times;</a>
</div>
@endif
{{$content}}
</div>
<div id="comment-show" class="reveal-modal small" data-reveal>
{{-- quick comment using ajax --}}
</div>
</div>

Berikutnya kita akan membuat 4 buah view yang akan kita letakkan pada folder posts, dimana filefile ini yang akan memberikan tampilan dalam pengelolaan data postingan dari sisi administrator.
app/views/posts/list.blade.php
<h2 class="post-listings">Post listings</h2><hr>
<table>

<thead>
<tr>
<th width="300">Post Title</th>
<th width="120">Post Edit</th>
<th width="120">Post Delete</th>
<th width="120">Post View</th>
</tr>
</thead>
<tbody>
@foreach($posts as $post)
<tr>
<td>{{$post->title}}</td>
<td>{{HTML::linkRoute('post.edit','Edit',$post->id)}}</td>
<td>{{HTML::linkRoute('post.delete','Delete',$post->id)}}</td>
<td>{{HTML::linkRoute('post.show','View',$post>id,['target'=>'_blank'])}}</td>
</tr>
@endforeach
</tbody>
</table>
{{$posts->links()}}

app/views/posts/single.blade.php
<article class="post">
<header class="post-header">
<h1 class="post-title">
{{$post->title}}
</h1>
<div class="clearfix">
<span class="left date">{{explode(' ',$post>created_at)[0]}}</span>
<span class="right
label">{{HTML::link('#reply','Reply',['style'=>'color:inherit'])}} </span>
</div>
</header>
<div class="post-content">
<p>{{ $post->content }}</p>
</div>
<footer class="post-footer">
<hr>
</footer>
</article>
<section class="comments">
@if(!$comments->isEmpty())
<h2>Comments on {{$post->title}}</h2>
<ul>
@foreach($comments as $comment)
<li>
<article>
<header>
<div class="clearfix">
<span class="right date">{{explode('
',$comment->created_at)[0]}}</span>
<span class="left
commenter">{{link_to_route('post.show',$comment->commenter,$post>id)}}</span>

</div>
</header>
<div class="comment-content">
<p>{{{$comment->comment}}}</p>
</div>
<footer>
<hr>
</footer>
</article>
</li>
@endforeach
</ul>
@else
<h2>No Comments on {{$post->title}}</h2>
@endif
<!--comment form -->
@include('comments.commentform')
</section>

app/views/posts/new.blade.php
<h2 class="new-post">
Add New Post
<span class="right">{{ HTML::link('admin/dash-board','Cancel',['class' =>
'button tiny radius']) }}</span>
</h2>
<hr>
{{ Form::open(['route'=>['post.save']]) }}
<div class="row">
<div class="small-5 large-5 column">
{{ Form::label('title','Post Title:') }}
{{ Form::text('title',Input::old('title')) }}
</div>
</div>
<div class="row">
<div class="small-7 large-7 column">
{{ Form::label('content','Content:') }}
{{ Form::textarea('content',Input::old('content'),['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() }}

app/views/posts/edit.blade.php
<h2 class="edit-post">
Edit Post

<span class="right">{{ HTML::linkRoute('post.list','Cancel',null,['class'


=> 'button tiny radius']) }}</span>
</h2>
<hr>
{{ Form::open(['route'=>['post.update',$post->id]]) }}
<div class="row">
<div class="small-5 large-5 column">
{{ Form::label('title','Post Title:') }}
{{ Form::text('title',Input::old('title',$post->title)) }}
</div>
</div>
<div class="row">
<div class="small-7 large-7 column">
{{ Form::label('content','Content:') }}
{{ Form::textarea('content',Input::old('content',$post>content),['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('Update',['class'=>'button tiny radius']) }}
{{ Form::close() }}

Dan terakhir, kita akan membuat 3 buah view yang akan kita letakkan pada folder comments,
dimana file-file ini yang akan memberikan tampilan dalam pengelolaan data komentar dari sisi
administrator maupun pengunjung.
app/views/comments/commentform.blade.php
<div id="reply">
<h2>Leave a Reply</h2>
@if(Session::has('success'))
<div data-alert class="alert-box round">
{{Session::get('success')}}
<a href="#" class="close">&times;</a>
</div>
@endif
{{ Form::open(['route'=>['comment.new',$post->id]]) }}
<div class="row">
<div class="small-5 large-5 column">
{{ Form::label('commenter','Name:') }}
{{ Form::text('commenter',Input::old('commenter')) }}
</div>
</div>
<div class="row">
<div class="small-5 large-5 column">
{{ Form::label('email','Email:') }}
{{ Form::text('email',Input::old('email')) }}
</div>
</div>

<div class="row">
<div class="small-7 large-7 column">
{{ Form::label('comment','Comment:') }}
{{
Form::textarea('comment',Input::old('comment'),['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('Submit',['class'=>'button tiny radius']) }}
{{ Form::close() }}
</div>

app/views/comments/list.blade.php
<h2 class="comment-listings">Comment listings</h2><hr>
<table>
<thead>
<tr>
<th>Commenter</th>
<th>Email</th>
<th>At Post</th>
<th>Approved</th>
<th>Comment Delete</th>
<th>Comment View</th>
</tr>
</thead>
<tbody>
@foreach($comments as $comment)
<tr>
<td>{{{$comment->commenter}}}</td>
<td>{{{$comment->email}}}</td>
<td>{{$comment->post->title}}</td>
<td>
{{Form::open(['route'=>['comment.update',$comment->id]])}}
{{Form::select('status',['yes'=>'Yes','no'=>'No'],$comment>approved,['style'=>'margin-bottom:0','onchange'=>'submit()'])}}
{{Form::close()}}
</td>
<td>{{HTML::linkRoute('comment.delete','Delete',$comment->id)}}</td>
<td>{{HTML::linkRoute('comment.show','Quick View',$comment->id,['datareveal-id'=>'comment-show','data-reveal-ajax'=>'true'])}}</td>
</tr>
@endforeach
</tbody>
</table>
{{$comments->links()}}

app/views/comments/show.blade.php
<p><b>Commenter:</b> {{{$comment->commenter}}}</p>
<p><b>Email:</b> {{{$comment->email}}}</p>
<p><b>Comment:</b></p>
<p>{{{$comment->comment}}}</p>
<a class="close-reveal-modal">&#215;</a>

Last but not least alias terakhir tapi tidak kalah penting adalah menseting layout master kita ke file
BaseController, seperti yang pernah kita lakukan di latihan crud sebelumnya. Kita akan menseting
layout view bernama master.blade.php sebagai layout utama. Tambahkan baris ini di file
BaseController.php dalam folder controllers.
protected $layout = 'master';
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);
}
}
}

4.3. Tampilan depan aplikasi blog dengan laravel

4.4. Tampilan detail postingan blog

4.5. Tampilan login administrator blog

4.6. Tampilan dashboard administrator blog

4.7. Tampilan tambah postingan blog

4.8. Tampilan daftar postingan blog

4.9. Tampilan edit postingan blog

4.10. Tampilan daftar komentar blog

4.2.

Membuat Fitur Export Data

Export data pada pembuatan aplikasi sering menjadi sebuah kebutuhan, dan biasanya export data
digunakan untuk membackup data. Berikut ini adalah dua cara untuk mengexport data menjadi dua
buah output berjenis excel dan pdf.

4.2.1. Export Data ke format Excel dan CSV


Untuk data yang akan kita export kedalam format excel adalah adalah data dari tabel posts. Disini
kita tidak melakukan filtering, tetapi hanya akan mengexport keseluruhan data postingan dari tabel
posts. Untuk melakukan export data ke excel dan CSV, kita akan menggunakan library Laravel
Excel. Library ini merupakan implementasi PHPExcel untuk Laravel. Untuk lebih mengetahui
tentang library ini silahkan buka url http://www.maatwebsite.nl/laravel-excel/docs.

4.11. Website laravel Excel


Untuk mendownload library ini silahkan buka file composer.json yang terdapat di folder utama
proyek. Lalu cari bagian require dan tambahkan baris library ini :
composer.json
....
"require": {
....,
"maatwebsite/excel": "1.1.5",
},
....

Lalu update composer untuk mendownload library, jangan lupa untuk mengarahkan ke folder blog
sebagai folder proyek. Berikut perintahnya :
composer update
Maka laravel akan melakukan update library-library termasuk menginstal library excel yang telah
kita tambahkan di file composer.json tadi.
Setelah itu tambahkan provider 'Maatwebsite\Excel\ExcelServiceProvider' ke file
app/config/app.php :
app/config/app.php
....
'providers' => array(
....,
'Maatwebsite\Excel\ExcelServiceProvider',
),
....

Tambahkan juga alias 'Excel' => 'Maatwebsite\Excel\Facades\Excel' ke app/config/app.php :


app/config/app.php
....
'aliases' => array(
....,
'Excel' => 'Maatwebsite\Excel\Facades\Excel',
),
....

Selanjutnya kita buat view untuk menampilkan form export excel data postingan di
app/views/posts/excel.blade.php. Di form ini kita hanya akan membuat satu tombol untuk
mengexport ke format excel.
app/views/posts/excel.blade.php
<h2 class="new-post">
Export Data Ke Excel
</h2>
<hr>
{{ Form::open(['route'=>['post.exportexcel']]) }}
{{ Form::submit('Export Data',['class'=>'button tiny radius']) }}
{{ Form::close() }}

Lalu kita perlu membuat method di PostController untuk menampilkan view dan menerima post
request dari form yang telah dibuat.
Method pertama bernama exportExcel berfungsi untuk menampilkan form untuk mengexport data
ke excel. Tambahkan fungsi ini di file app/controllers/PostController.php.

app/controllers/PostController.php
public function exportExcel()
{
$this->layout->title = 'Export Data Posting ke Excell';
$this->layout->main = View::make('dash')>nest('content','posts.excel',compact('posts'))->with('title',$this->layout>title);
}

Method kedua bernama exportToExcel berfungsi untuk memproses output ke excel dan
penggunaan library excel. Tambahkan lagi fungsi ini di file app/controllers/PostController.php.
app/controllers/PostController.php
public function exportToExcel()
{
$posts = Post::All();
Excel::create('Data Postingan Blog', function($excel) use ($posts) {
// Set the properties
$excel->setTitle('Data Postingan Blog')
->setCreator('Akhmad Dharma Kasman');
$excel->sheet('Data Postingan', function($sheet) use ($posts) {
$row = 1;
$sheet->row($row, array(
'Title',
'Read More',
'Comment Count'
));
foreach ($posts as $data) {
$sheet->row(++$row, array(
$data->title,
$data->read_more,
$data->comment_count
));
}
});
})->export('xls');
}

Pada export disini kita hanya mengambil 3 field saja yang akan ditampilkan nantinya di file
berformat excel, yaitu title,read_more dan commen_count dari tabel posts.
Untuk mengexport ke format csv, cukup mengganti isi dari ->export('xls') menjadi ->export('csv').
Catatan :
Sebagai tambahan, terkadang format excel gagal dihasilkan dengan isi pesan invalid format. Ini
dikarenakan pada file-file php kita terdapat blank space sebelum tag <?php dan setelah tag ?>.
Pastikan semua file yang menggunakan tag <?php dan ?> hilangkan spasi kosong setelah dan
sesudah kedua tag tersebut.

Berikutnya menambahkan routenya untuk menangani view dan controller yang telah kita buatkan
tadi, tambahkan dua baris ini pada file routes.php.
Route::get('/post/excel',['as' => 'post.excel','uses' =>
'PostController@exportExcel']);
Route::post('/post/excel/export',['as' => 'post.exportexcel','uses' =>
'PostController@exportToExcel']);

Yang terakhir kita tambahkan menu link untuk menu format excel dan pdf di file view
dash.blade.php. Tambahkan baris ini di dalam tag <ul></ul>.
app/views/dash.blade.php

<li class="divider"></li>
<li class="{{ (strpos(URL::current(),route('post.excel'))!== false) ?
'active' : '' }}">
{{HTML::linkRoute('post.excel','Export Ke Excel')}}
</li>
<li class="{{ (strpos(URL::current(),route('post.pdf'))!== false) ?
'active' : '' }}">
{{HTML::linkRoute('post.pdf','Export Ke PDF')}}
</li>

4.12. Tampilan export data ke format excel

4.13. Tampilan export data ke format csv

4.2.2. Export Data ke format PDF


Setelah kita berhasil melakukan export data ke Excel dan CSV, kini kita akan membuat export data
ke PDF. Untuk export ini kita akan menggunakan library Dompdf. Dengan library ini, kita dapat
mengeksport data html menjadi pdf. Di Laravel, ada beberapa package yang memudahkan kita
menggunakan dompdf. Pada buku ini, saya akan menggunakan barryvdh/laravel-dompdf.
Untuk mendownload library Domppdf silahkan buka file composer.json yang terdapat di folder
utama proyek. Lalu cari bagian require dan tambahkan baris library ini :
composer.json
....
"require": {
....,
"barryvdh/laravel-dompdf": "0.4.4",
},
....

Lalu update composer untuk mendownload dan menginstal library Domppdf, jangan lupa untuk
mengarahkan ke folder blog sebagai folder proyek. :
composer update
Tambahkan 'Barryvdh\DomPDF\ServiceProvider' ke array $providers dan 'PDF' =>
'Barryvdh\DomPDF\Facade' ke array $aliases di app/config/app.php.

app/config/app.php
....
'providers' => array(
....,
'Barryvdh\DomPDF\ServiceProvider',
),
....
'aliases' => array(
....,
'PDF' => 'Barryvdh\DomPDF\Facade',
),
....

Lalu kita akan membuat dua buah file view, yang pertama bernama pdf.blade.php ditempatkan di
folder app/views/posts sebagai form untuk menampilkan form export data dan yang kedua
bernama htmlpdf.blade.pdf berfungsi untuk membuat file html yang akan degenerate menjadi file
pdf, diletakkan dalam folder pdf didalam folder posts.
app/views/posts/pdf.blade.php
<h2 class="new-post">
Export Data Ke PDF
</h2>
<hr>
{{ Form::open(['route'=>['post.exportpdf']]) }}
{{ Form::submit('Export Data',['class'=>'button tiny radius']) }}
{{ Form::close() }}

File ini hampir sama dengan view saat tadi kita membuat view untuk export ke excel, hanya
berbeda title h2 dan route post formnya.
app/views/posts/pdf/htmlpdf.blade.php
<h2 class="post-listings">Daftar Postingan</h2><hr>
<table border="1">
<thead>
<tr>
<th width="120" align="left">Judul</th>
<th width="160">Read More</th>
<th width="120">Comment Count</th>
</tr>
</thead>
<tbody>
@foreach($posts as $post)
<tr>
<td align="left">{{$post->title}}</td>
<td>{{$post->read_more}}</td>
<td align="center">{{$post->comment_count}}</td>
</tr>
@endforeach
</tbody>
</table>

Sama seperti export excel sebelumnya, kita akan mengambil 3 buah field saja dari tabel posts, yaitu
yaitu title,read_more dan commen_count untuk dijadikan file berformat pdf. Karena library
pdf ini menggenerate file html ke pdf maka pada hasil file pdf, layout dan tata letaknya akan sama
dengan file html yang kita buat.
Berikutnya adalah membuat method/fungsi untuk menampilkan form dan memproses export pdf.
Yaitu fungsi exportPDF() dan exportToPDF().
Tambahkan lagi kedua fungsi tersebut ke file PostController.php.

app/controllers/PostController.php
public function exportPDF()
{
$this->layout->title = 'Export Data Posting ke PDF';
$this->layout->main = View::make('dash')>nest('content','posts.pdf',compact('posts'))->with('title',$this->layout>title);
}
public function exportToPDF()
{
$posts = Post::All();
$data['posts'] = $posts;
$pdf = PDF::loadView('posts.pdf.htmlpdf', $data);
return $pdf->download('postingan.pdf');
}

4.14. Tampilan export data ke format pdf

BAB 5

MENJALANKAN PROJECT APLIKASI


5.1.

Download Project Aplikasi

Project aplikasi yang terdapat pada bab 3 dan 4 (project blog,crud, nama-proyek dan login)
bisa didownload di http://www.mediafire.com/download/ca9fllis6bm0qa0/04032014lrvl.zip.
Sedangkan Software-software yang berkaitan dengan laravel sudah dijelaskan di bab 2 beserta link
downloadnya.

5.2.

Instal Project Aplikasi

Berikut adalah step untuk menginstal project aplikasi.


1. Setelah Anda berhasil download file project dengan link yang disebutkan diatas, extractlah file
tersebut sehingga akan menghasilkan empat buah folder project bernama blog,crud,
nama-proyek dan login, lihat gambar 5.1.

Gambar 5.1. Empat buah folder hasil extract file download

2. Lalu letakkan ketiga folder tersebut di folder web server Anda. Sesuaikan dengan web server
yang Anda gunakan, Jika menggunakan XAMPP biasanya default folder server ada pada folder
c:\xampp\htdocs. Dan pastikan software yang dibutuhkan seperti composer dan xampp
sudah terinstal dengan baik (lihat bab 2).
3. Untuk menjalankan project blog, caranya adalah menginstal dependency dengan cara masuk
ke terminal lalu arahkan ke folder blog , lalu ketikkan perintah composer update. Lihat
gambar 5.2 (pada gambar letak folder server adalah d, sesuaikan dengan folder server Anda).

Gambar 5.2. Perintah composer update untuk project blog


4. Setelah itu composer akan mendownload segala library/dependency yang dibutuhkan oleh
project, untuk itu dibutuhkan koneksi internet untuk melakukan hal ini.
5. Berikutnya import database blog.sql yang terdapat pada folder project blog, tetapi terlebih
dahulu membuat database bernama blog . Lihat gambar 5.3 dan 5.4.

5.3. Pembuatan database blog

5.4. Import database blog

6. Jika sudah maka akseslah aplikasi blog di url http://localhost/blog/public. Maka


seharusnya akan tampil halaman aplikasi blog seperti pada gambar 4.3 di bab 4.
7. Lakukan hal yang sama untuk project nama-proyek , crud dan login.

Anda mungkin juga menyukai