Академический Документы
Профессиональный Документы
Культура Документы
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!!!.';
});
Parameter get menjelaskan jenis request yang diterima dalam contoh ini GET request. Kita dapat
merubah post untuk mengakses POST request.
/halamanku merupakan URL yang kita inginkan untuk diakses.
function() { ... } merupakan closure (anonymous function) yang akan memberikan jawaban atas
request. Selain menggunakan closure, kita juga dapat mengarahkan request ke fungsi pada sebuah
controller.
3.2. MVC
Seperti pada framework-framework lainnya, laravel juga menganut system MVC(Model View
Controller) dalam pembuatan aplikasinya. Secara sederhana konsep MVC terdiri dari tiga bagian
yaitu bagian Model, bagian View dan bagian Controller. Didalam website dinamis setidaknya terdiri
dari 3 hal yang paling pokok, yaitu basis data, logika aplikasi dan cara menampilkan halaman
wesite. 3 hal tersebut direpresentasikan dengan MVC yaitu model untuk basis data, view untuk cara
menampilkan halaman website dan controller untuk logika aplikasi.
3.2.1. Model
Model merepresentasi struktur data dari website yang bisa berupa basis data struktur data, dan
biasanya berhubungan langsung dengan database untuk memanipulasi data atau CRUD ( create,
read, update, delete ).
Model ini dibuat berdasarkan objek dalam aplikasi kita. Misalnya, jika kita membuat aplikasi
penjualan, maka barang dan transaksi dapat menjadi model. Selain sebagai struktur data, model
juga menyimpan business rules dari aplikasi. Sebagai bisnis rules misalnya, dalam sebuah objek
barang, kode barang minimal berisi 6 karakter, maka model barang memastikan bahwa data yang
isi sudah sesuai dengan aturan tersebut.
Berbicara model, pada laravel kita akan mengenal yang namanya Migration , Seeding dan
Eloquent.
3.2.2. Migration
Migration atau database migration, adalah salah satu fitur yang cukup memudahkan kita ketika ada
pembuatan atau perubahan pada tabel-tabel di database aplikasi kita. Entah itu penambahan
kolom, indexs dan lain sebagainya.
Dengan database migration, kita dapat membuat tabel-tabel tanpa harus membuka aplikasi
administrasi database, seperti phpmyadmin, navicat, sqlyog, dan lainnya. Menggunakan fitur
database migration pada laravel terbilang cukup mudah, lagi dan lagi kita akan dipermudah dengan
command line tool bawaan laravel, yaitu artisan.
Sebelum menggunakan migration, kita harus membuat dulu database mysql nya, silahkan gunakan
phpmyadmin, sqlyog atau yang lainnya untuk membuat database baru. Disini akan kita namakan
databasenya dengan latihan. Jika sudah terbuat, silahkan edit file database.php yang terletak di
nama-proyek/app/config/ lalu ganti baris database pada bagian mysql dengan nama yang
barusan kita buat, lihat gambar 3.2.
Kalau sudah selanjutnya kita buatkan file migrationnya. Sebagai contoh mari kita buat migrations
untuk membuat table Anggota dengan struktur sebagai berikut:
Perintah diatas akan menghasilkan sebuah file, misalnya dengan nama dan lokasi nama-
proyek/app/database/migrations/2014_-03_26_033903_ buat_table_anggota.php.
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\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.
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.
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.
SeederTableAnggota.php
<?php
DB::table('anggota')->delete();
$anggota = array(
);
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
/**
* @return void
*/
Eloquent::unguard();
$this->call('SeederTableAnggota');
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.
Anggota.php
<?php
{
protected $table = 'anggota';
?>
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:
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
Route::get('/cobamodel', function()
Route::get('/cobamodel', function()
echo $anggota->nama;
});
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.
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->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()
});
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->delete();
});
Jalankan lagi url latihan.site/cobamodel. Silahkan apakah data id ke empat sudah terhapus.
Tabel hobi
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
/**
* @return void
*/
$table->increments('id');
$table->string('hobi');
$table->integer('anggota_id');
$table->timestamps();
});
/**
* @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
DB::table('hobi')->delete();
$hobi = array(
array('hobi'=>'Traveling', 'anggota_id'=>'1'),
array('hobi'=>'Kuliner', 'anggota_id'=>'1'),
);
DB::table('hobi')->insert($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.
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
/* Relasi One-to-Many
* ==================
*/
?>
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
* =================
*/
?>
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() {
});
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');
});
app/views/halamanku.php
<html>
<body>
<h1>Halo</h1>
Selamat datang di Aplikasi Laravel Saya<br>
</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
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');
});
@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.
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.
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.
- 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
app/view/includes/footer.blade.php
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;
}
.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;
}
.top-bar {
border-top-left-radius: 3px;
box-shadow: -3px 0 3px -3px #000 inset;
}
.top-bar-section ul {
background: none;
}
.top-bar-section li a:hover:not(.button) {
background: #008CBA;
}
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:
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>
Route::get('form', function()
{
return View::make('form');
});
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.
app/routes.php
Route::get('/about', 'HomeController@showHalaman');
app/contollers/HomeController.php
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.
Belajar pemrograman tidaklah lengkap jika belum membuat program yang sifatnya CRUD. CRUD
sendiri merupakan singkatan dari Create, Read, Update dan Delete. Bila diartikan berarti
menciptakan, membaca, memperbarui dan menghapus. Sebenarnya pada laravel ada berbagai cara,
salah satunya yang bersifat otomatis dengan memanfaatkan laravel generator milik Jeffrey Way.
Disini sengaja dibuat sedikit lebih ribet agar supaya pembaca yang mengikuti tulisan ini mengerti
dan paham, khususnya mengenai fungsi-fungsi dasar yang sering ditemui dan digunakan dalam
membangun sebuah proyek menggunakan Laravel.
Kita akan membuat sebuah aplikasi CRUD sederhana dengan memanfaatkan tabel anggota yang
telah kita buat di sub bab sebelumnya. Baiklah, tidak perlu berlama-lama, mari kita mulai
pembuatan aplikasi CRUD data Anggota.
Supaya proyek tidak tumpang tindih, kita manfaatkan copy-an dari proyek mentah nama-proyek
yang belum dimodifikasi di awal, bisa kita namakan proyeknya adalah crud. Atau bisa juga Anda
create project dan mengunduh dependencynya seperti yang dilakukan di sub bab 2.1.3.
Untuk styling CSS-nya kita menggunakan css foundation seperti pada pembahasan sebelumnya.
Silahkan copy folder assets di dalam folder public pada project nama-proyek yang
sebelumnya telah kita buat ke project crud/ public/assets.
Pada project crud ini, penulis juga membuat satu lagi virtual host bernama http://latihan.crud.
Silahkan buat dengan cara yang telah dijelaskan pada bab 2.
Model
Yang pertama mari kita buatkan model-nya terlebih dahulu. Karena tabel telah kita buatkan pada
sub bab sebelumnya maka proses migrate dan seeder tidak perlu kita lakukan lagi. Namakan
modelnya dengan Anggota.php. Berikut isinya :
app/model/Anggota.php
<?php
class Anggota extends Eloquent {
# Penamaan tabel yang digunakan
protected $table = 'anggota';
# MASS ASSIGNMENT (buatkan field-field yang diperbolehkan menerima
inputan)
protected $fillable = array('nama', 'alamat');
}
Karena hanya satu tabel yang digunakan kita tidak menggunakan Eloquent untuk relasi tabel.
Penggunaan Eloquent relasi akan dibahas pada proyek utama di bab berikutnya.
Route
Berikutnya adalah membuat routenya. Berapa jumlah route yang kira-kira dibutuhkan? Untuk
mengetahuinya Anda bisa membayangkan alur programnya. Mulai dari tampilan awal, hingga
proses delete.
Untuk mempersingkat waktu, kita akan buatkan 6 buah route yang dibutuhkan untuk pembuatan
aplikasi crud ini :
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 :
Route::get('profile/{user}', 'UserController@showProfile');
Route::model('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
Pada fungsi untuk menampilkan seluruh data anggota bernama listAnggota(), lihat potongan skrip
berikut ini :
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 :
Pada fungsi untuk mengedit data anggota bernama editAnggota(), lihat potongan skrip berikut ini :
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 :
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 :
Yang terakhir adalah fungsi untuk menghapus data anggota, lihat potongan sripnya :
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
/**
* Setup the layout used by the controller.
*
* @return void
*/
protected $layout = 'layouts.default';
Artinya yang menjadi file view/layout utama adalah file default.blade.php pada folder layouts yang
akan kita buat pada pembahasan pembuatan view berikutnya.
View
Mari kita buatkan halaman-halaman tampilan untuk aplikasi crud yang telah kita buatkan model,
routes dan controllernya. Berikut ini adalah view yang akan kita buat :
Layout master/utama.
Layout untuk menampilkan semua data anggota -> Membutuhkan View -> list.blade.php
Layout untuk menampilkan form menambah anggota -> membutuhkan View ->new.blade.php
Layout untuk menampilkan form perubahan/edit data anggota -> Butuh View -> edit.blade.php
Masuk ke folder views, buatlah 2 buah folder bernama layouts dan pages. Strukturnya folder
dan file viewnya kurang lebih seperti berikut :
- app
-- views
--- layouts
------- default.blade.php
--- pages
------- list.blade.php
------- new.blade.php
------- edit.blade.php
Pertama kita akan buatkan file-file view untuk layout yang sifatnya master/utama. Yaitu file yang
akan kita letakkan pada folder layouts dan includes.
app/views/layouts/default.blade.php
<!DOCTYPE html>
<html class="no-js" lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>{{$title}}</title>
{{ HTML::style('assets/css/foundation.css') }}
{{ HTML::style('assets/css/custom.css') }}
{{ HTML::script('./assets/js/vendor/custom.modernizr.js') }}
</head>
<body>
<div class="row main">
<div class="small-12 large-12 column" id="masthead">
<header>
<div class="sub-header">
<h1>{{HTML::link('/','CRUD Dengan Laravel')}}</h1>
</div>
</header>
</div>
<div class="row">
{{$main}}
</div>
<div class="row">
<div class="small-12 large-12 column">
<footer class="site-footer"> Copyright 2014 Akhmad Dharma
Kasman</footer> </div>
</div> </div>
</div>
</body>
</html>
File default.blade.php adalah file view/layout utama. Perhatikan variabel {{$title}} dan
{{$main}}, kedua variabel tersebut adalah hasil dari override dari controller
AnggotaController.php ketika menggunakan fungsi $this->layout->title dan $this->layout->main.
app/views/pages/list.php
Juga terdapat link Tambah Anggota yang mengarah ke route anggota.new atau url /new. Dan
menggunakan fungsi newAnggota pada controller.
app/views/pages/new.php
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 :
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
Selain itu juga terdapat tombol cancel untuk membatalkan pengeditan data, dimana linkroutenya
mengarah pada anggota.list (route yang menampilkan semua data anggota).
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 :
update_at timestamp
Mari kita buat file migrationnya, Buka terminal, masuk ke folder login , jalankan perintah berikut:
Perintah diatas akan menghasilkan sebuah file, misalnya dengan nama dan lokasi
login/app/database/migrations/ xxxx_xx_xx_xxxxxx_ buat_table_admin.php.
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('admin', function (Blueprint $table) {
$table->create();
$table->increments('id');
$table->string('username');
$table->string('password');
$table->string('email');
$table->string('remember_token', 100)->nullable();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('admin', function (Blueprint $table) {
$table->drop();
});
}
Berikutnya, silahkan cek database latihan, apakah tabel admin telah terbentuk. Lihat gambar 3.23.
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
// DB::table('admin')->truncate();
$user = array(
);
DB::table('admin')->insert($user);
app/database/seeds/DatabaseSeeder.php.
<?php
/**
* @return void
*/
Eloquent::unguard();
$this->call('AdminTableSeeder');
Terakhir tentu kita akan menjalankan perintah seeder itu sendiri, kembali ke terminal dan folder
proyek lalu ketikkan :
Cek kembali database Anda, apakah tabel admin sudah terisi data dummy yang telah kita buatkan
tadi. Lihat gambar 3.25.
Model
Untuk model autentikasi kita tidak perlu membuat file baru dikarenakan laravel telah membuatkan
file model bernama User.php yang terletak di folder app/models. Disini kita hanya perlu
mengganti nama tabel kita pada baris protected $table. Defaultnya nama tabel yang digunakan
pada laravel adalah users. Karena kita membuat dengan nama admin, maka kita harus
merubah baris tersebut. Berikut skrip lengkap model User.php.
app/models/user.php
<?php
use Illuminate\Auth\UserTrait;
use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableTrait;
use Illuminate\Auth\Reminders\RemindableInterface;
/**
* 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"
|
*/
/*
|--------------------------------------------------------------------
| 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.
|
*/
/*
|---------------------------------------------------------------------
| 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.
|
*/
/*
|--------------------------------------------------------------------
| 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.
|
*/
),
);
Route
Pada pembuatan routes pada aplikasi login ini kita akan membuat 4 buah route sebagai berikut :
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');
});
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 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
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
/**
* Setup the layout used by the controller.
*
* @return void
*/
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>
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
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.
Route::filter('auth', function()
{
if (Auth::guest())
{
if (Request::ajax())
{
return Response::make('Unauthorized', 401);
}
else
{
return Redirect::guest('/');
}
}
});
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.