BAB 1
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.
BAB 2
Pada bagian ini masukkan/browse path dari php.exe,jika menggunakan XAMPP biasanya letaknya
ada di dalam folder xampp/php. Lihat Gambar 2.5.
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.
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).
Rename folder laravel-master menjadi nama-proyek Anda , atau sesuaikan dengan nama
proyek yang akan Anda buat.
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.
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.
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.
lihat gambar 2.11. Jika anda menggunakan Windows 7/ 8, Anda perlu menggunakan level
administrator untuk mengubah file tersebut.
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).
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.
BAB 3
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!!!.';
});
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.
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
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.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.
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.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
{
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:
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.
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.
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.
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.
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
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;
/**
* 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
*/
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);
}
}
Cek database Anda, jika proses seeder berhasil maka akan menambah 4 data di tabel hobi. Lihat
gambar 3.12.
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.
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.
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');
});
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
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:
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.
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.
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')
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 {
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>
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');
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.
<?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 :
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 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');
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);
}
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 = [
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">
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']);
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">×</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">×</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.20. Tampilan validasi ketika data masih kosong pada aplikasi crud
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
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
dan
lokasi
*/
public function down()
{
Schema::table('admin', function (Blueprint $table) {
$table->drop();
});
}
}
app/database/seeds/AdminTableSeeder.php
<?php
$user = array(
'username' => 'admin',
'password' => Hash::make('admin'),
'created_at' => DB::raw('NOW()'),
'updated_at' => DB::raw('NOW()'),
);
$this->call('AdminTableSeeder');
}
}
Terakhir tentu kita akan menjalankan perintah seeder itu sendiri, kembali ke terminal dan folder
proyek lalu ketikkan :
php artisan db:seed
app/models/user.php
<?php
use
use
use
use
Illuminate\Auth\UserTrait;
Illuminate\Auth\UserInterface;
Illuminate\Auth\Reminders\RemindableTrait;
Illuminate\Auth\Reminders\RemindableInterface;
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 :
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
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('/');
}
}
});
BAB 4
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.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
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
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
dan
lokasi
/**
* 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
varchar
255
comment
text
approve
tinyint
created_at
timestamp
100
update_at
timestamp
dan
lokasi
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
/**
* Reverse the migrations.
*
* @return void
*/
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.
$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()'),
);
}
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?.
*
* @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.
<?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']);
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.
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
$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();
}
}
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') : '';
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
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))
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())
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">×</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">×</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
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">×</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">×</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">×</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.2.
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.
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',
),
....
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>
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');
}
BAB 5
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.
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).