Controller

Dasar Controller

Daripada membuat semua logika route-level terpusat pada file routes.php, Anda bisa mengatur pola kerja ini dgn class Controller. Controller dapat mengelompokkan route yg saling terkait pada sebuah class, selain itu jg memudahkan fitur lanjutan seperti dependency injection otomatis.

Controller umumnya disimpan di direktori app/controllers, dan direktori tsb terdaftar di opsi classmap pada file composer.json secara default. Akan tetapi, controller secara teknis bisa ada di direktori atau sub-direktori manapun. Deklarasi route tidak bergantung pada lokasi direktori peyimpanan class controller. Jadi, selama Composer bisa melakukan autoload class controller, tempat penyimpanannya bebas di direktori mana saja.

Contoh class controller dasar:

class UserController extends BaseController {

    /**
     * Show the profile for the given user.
     */
    public function showProfile($id)
    {
        $user = User::find($id);

        return View::make('user.profile', array('user' => $user));
    }

}

Semua controller merupakan extend dari class BaseController. Class BaseController  juga tersimpan di app/controllers, dan bisa digunakan sbg tempat penyimpanan logic controller yg digunakan bersama. Class BaseController merupakan extend dr class Controller pada framework. Sekarang, Kita bisa membuat route ke controller sbb:

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

Jika memilih untuk menggunakan controller bersarang (nested) atau mengatur controller menggunakan namespace PHP, langsung saja gunakan nama class lengkap keetika membuat route:

Route::get('foo','Namespace\FooController@method');

Note: Karena kita menggunakan Composer untuk auto-load class PHP, controller bisa ditempatkan dimana saja pada sistem, selama composer bisa me-load file tsb. Direktori controller tidak mengharuskan struktur folder tertentu untuk aplikasi. Route ke controlller sepenuhnya terpisah, tidak terikat mati dgn file-sistem.

Anda jg bisa memberikan nama pada route controller:

Route::get('foo', array('uses'=>'FooController@method','as'=>'name'));

Untuk membuat/generate alamat URL controller, bisa menggunakan perintah  URL::action atau perintah helper action:

$url = URL::action('FooController@method');

$url = action('FooController@method');

Anda jg bisa mengakses nama action-controlller yg sedang dijalankan menggunakan perintah currentRouteAction:

$action = Route::currentRouteAction();

Filter Controller

Filters dapat ditambahkan pada route controller sama dgn route dasar:

Route::get('profile', array('before'=>'auth','uses'=>'UserController@showProfile'));

Akan tetapi, filter jg dapat disisipkan didalam controller:

class UserController extends BaseController {

 /**
 * Instantiate a new UserController instance.
 */
 public function __construct()
 {
 $this->beforeFilter('auth', array('except' => 'getLogin'));

 $this->beforeFilter('csrf', array('on' => 'post'));

 $this->afterFilter('log', array('only' => array('fooAction', 'barAction')));
 }

}

Anda jg bisa menyisipkan filter berupa Closure/fungsi tertutup pada controlller:

class UserController extends BaseController {

 /**
 * Instantiate a new UserController instance.
 */
 public function __construct()
 {
 $this->beforeFilter(function()
 {
 //
 });
 }

}

JIka Anda ingin menggunakan perintah/fungsi pada controller sbg filter pada controlller yg sama, bisa menggunakan sintaks @ untuk mendefinisikan filter:

class UserController extends BaseController {

 /**
 * Instantiate a new UserController instance.
 */
 public function __construct()
 {
 $this->beforeFilter('@filterRequests');
 }

 /**
 * Filter the incoming requests.
 */
 public function filterRequests($route, $request)
 {
 //
 }

}

RESTful Controller

Laravel memudahkan definisi sebuah route tunggal untuk menangani setiapaksi perintah di controllermenggunakan penamaan REST. Pertama, sebutkan route menggunakan perintah Route::controller:

Definisikan RESTful Controller

Route::controller('users', 'UserController');

Perintah controller menerima 2 argumen. Pertama alamat URI yg ditangani, yg kedua nama class controller. Selanjutnya, cukup menambahkan perintah di controller, diawali (prefix) dgn HTTP verb yg hendak direspon:

class UserController extends BaseController {

 public function getIndex()
 {
 //
 }

 public function postProfile()
 {
 //
 }

}

Perintah index akan merespon ke URI induk (root) yg ditangani oleh controller, dimana dlm contoh tsb adalah users.

Jika action-controller mengandung beberapa kata, Anda bisa mengakses action menggunakan sintaks “dash”/strip pada URI. Misalnya, action-controller berikut pada UserController akan merespon alamat URI users/admin-profile:

public function getAdminProfile() {}

Resource Controller

Resource controller memudahkan untuk membangun controller RESTful around resources. Contohnya, ingin membuat controller yg mengatur foto (photo) yg tersimpan pada aplikasi. Menggunakan perintah controller:make via CLI-Artisan dan perintah Route::resource, Kita dapat dgn cepat membuat controller tsb.

Untuk membuat controller dgn command-line, eksekusi perintah berikut:

php artisan controller:make PhotoController

Sekarang, registrasikan sumber route ke controller:

Route::resource('photo', 'PhotoController');

Route tunggal sederhana ini mendeklarasikan beberapa route untuk menangani berbagai tindakan RESTful pada sumber data foto. Demikian juga, controller yang dihasilkan sudah akan memastikan perintah untuk masing-masing tindakan ini dengan catatan yang menginformasikan URI dan verba mereka tangani.

Tindakan yg DItangani Resource Controller

Verb Path Action Route Name
GET /resource index resource.index
GET /resource/create create resource.create
POST /resource store resource.store
GET /resource/{resource} show resource.show
GET /resource/{resource}/edit edit resource.edit
PUT/PATCH /resource/{resource} update resource.update
DELETE /resource/{resource} destroy resource.destroy

Kadangkala Anda hanya perlu menangani beberapa bagian tindakan saja:

php artisan controller:make PhotoController --only=index,show

php artisan controller:make PhotoController --except=index

Dan, Anda jg bisa menyebutkan sebagian tindakan yg ditangani ada route:

Route::resource('photo', 'PhotoController',
 array('only' => array('index', 'show')));

Route::resource('photo', 'PhotoController',
 array('except' => array('create', 'store', 'update', 'destroy')));

Secara default, semua tindakan resource controller memiliki nama have a route; akan tetapi, Anda bisa menulis ulang nama ini dgn memberikan array names pada opsi:

Route::resource('photo', 'PhotoController',
 array('names' => array('create' => 'photo.build')));

Menangani Perintah yg HIlang

Sebuah perintah alternatif pengganti perintah lainnya (catch-all) bisa didefinisikan dimana akan dipanggil ketika tak ada fungsi/perintah yg cocok pada controller yg ditunjuk. Perintah tsb harus diberi nama missingMethod, dan menerima perintah & array parameter untuk setiap request:

Mendefinisikan Perintah Catch-All

public function missingMethod($parameters = array())
{
 //
}