Making Dooitkoo – Bagian 5

Lanjutan dari bagian 4

Controller

Controller adalah otak dari aplikasi yang bertugas menghandel rekues dari klien dan melakukan operasi CRUD terhadap model. Dalam Laravel, controller secara default disimpan dalam direktori /application/controllers/. Kontroler bisa menghandel rekues HTTP biasa atau restful. Kalo rekues biasa, non-restful, semua public function yang menghandel rekues harus berawalan action_.

class Home_Controller extends BaseController{

	public action_index(){ ... }

	public action_login(){ ... }

	public action_logout(){ ... }
}

Sedangkan kontroler restful bentuknya seperti contoh di bawah. Semua method diberi awalan sesuai dengan restful request yang dihandel, post_,get_, update_, dsb.

class Home_Controller extends BaseController{

	public $restful = true;

	public get_index(){ ... }

	public get_login(){ ... }
	public post_login(){ ... }

	public post_logout(){ ... }
}

Gimana Laravel bisa tau method mana yang harus dipanggil untuk menghandel sebuah rekues? Semuanya diatur lewat mekanisme URI routing, yang didefinisikan di dalam file /application/routes.php. Contohnya,

Route::any('/login','home@login');
Route::post('/logout','home@logout');
Route::get('/','home@index');

Dalam aplikasi Dooitkoo, ada dua routing yaitu application route dan api route. Kenapa ada dua? Saya ingin memisahkan controller yang bikin HTML view berdasarkan perubahan URL di address bar dari controller yang handel data request.

Di sisi klien (browser) Dooitkoo menggunakan JavaScript (ajax) & saya nantinya juga bikin aplikasi mobile client, yang otomatis hanya butuh akses API untuk manipulasi data, & saya ga ingin kontroler aplikasi web campur aduk sama API karena ribet development & maintenancenya. Kalo dicampur, setiap kali saya utak-atik API, saya juga harus ngetes web-controller-nya & juga sebaliknya. Tapi kalo dipisah dan web-controller-nya ga tau apa-apa tentang API controller & API controller juga ga tau web controller, saya cukup ngetes salah satunya aja.

Normal request

Untuk implementasi dua route saya bikin bundle khusus untuk API. Setiap bundle mirip seperti versi mini dari application, strukturnya bisa sama persis dengan direktori /application/, ada controllers, models, views, routes, dsb. Sebenarnya, direktori /application/ itu juga bisa disebut “main bundle”.

Ajax request

View

Untuk bikin view saya bisa pake plain php atau template engine bawaan Laravel bernama Blade yang terinspirasi oleh Razor Engine, sebuah template engine untuk .NET.

Untuk bikin kontroler & view, saya pakai Bob karena dengan satu perintah saya bisa bikin kontroler plus view-nya.

$ php artisan bob::build controller home login logout --blade

Perintah di atas akan menghasilkan 4 file yaitu /controllers/home.php dan 3 buah file .blade.php, satu untuk setiap method di kontroler, sekaligus mendaftarkan kontroler di routes.php supaya bisa dikenali oleh aplikasi.

$ php artisan bob::build controller home login logout --blade
-- Can we build it? --
(~) View		home/index.blade.php
(~) View		home/login.blade.php
(~) View		home/logout.blade.php
(~) Controller	Home_Controller
-- Yes we can! --

Blade

Blade memungkinkan saya memisahkan bagian-bagian view yang dipake berulangkali dan menyimpannya di sebuah master layout.

Master layout

Master layout

Kalo saya butuh override atau menambah elemen, saya tinggal masukin elemen baru di dalam blok @section.




	Dooitkoo

@section('styles')
@yield_section





@section('content') @yield_section
@section('footer-scripts') {{HTML::script('vendor/jquery/jquery-1.9.1'.Config::get('dooitkoo.asset_suffix').'.js')}} {{HTML::script('vendor/bootstrap/js/bootstrap'.Config::get('dooitkoo.asset_suffix').'.js')}} @yield_section
//pake master layout 'home/master.blade.php'
@layout('home.master')

@section('styles')
{{HTML::style('theme/home/css/signin.css')}}
@endsection

@section('content')

Login

//login form dst

Belum punya akun? Daftar sekarang

@endsection @section('footer-scripts') @parent //tambahin skrip selain yang ada di master layout {{HTML::script('js/login'.Config::get('dooitkoo.asset_suffix').'.js')}} @endsection

Kirim data ke View

View ga punya akses ke kontroler. Semua data dinamis, selain yang sifatnya global seperti Session, Config, Auth::user() dsb, disediain oleh kontroler pada waktu view dibuat. Kalo saya ingin kirim data ke view dari kontroler, saya bisa pake with.

//di salah satu method yg handel rekues di kontroler
return View::make('home.index')->with('username','Boss');

//di home/index.blade.php

Halo, {{$username}}

//atau

Halo,

Web Client

Yang penting-penting tentang server udah dicatet. Artikel selanjutnya akan membahas masalah web client.

Also in this category ...