Routing

Routing Dasar

Sebagian besar route aplikasi dituliskan di file app/routes.php. Route Laravel paling sederhana terdiri atas URI dan closure/fungsi anonim.

Route GET Dasar

Route::get('/', function()
{
    return 'Hello World';
});

Route Dasar POST

Route::post('foo/bar', function()
{
    return 'Hello World';
});

Registrasi Route Untuk GET & POST

Route::match(array('GET', 'POST'), '/', function()
{
    return 'Hello World';
});

Registrasi Route Untuk Semua Request HTTP

Route::any('foo', function()
{
    return 'Hello World';
});

Memastikan Route Diakses Melalui HTTPS

Route::get('foo', array('https', function()
{
    return 'Must be over HTTPS';
}));

Seringkali dibutuhkan membuat alamat URL ke route tertentu. Maka gunakan method  URL::to :

$url = URL::to('foo');

Route Parameter

Route::get('user/{id}', function($id)
{
    return 'User '.$id;
});

Route Parameter Opsional

Route::get('user/{name?}', function($name = null)
{
    return $name;
});

Route Parameter Opsional Dengan Nilai Default

Route::get('user/{name?}', function($name = 'John')
{
    return $name;
});

Route Dengan Regular Expression

Route::get('user/{name}', function($name)
{
    //
})
->where('name', '[A-Za-z]+');

Route::get('user/{id}', function($id)
{
    //
})
->where('id', '[0-9]+');

Memberikan Array Kriteria Untuk Parameter

Selain regular expression sebagai kriteria parameter tunggal, bisa juga menggunakan array untuk mendeskripsikan kriteria untuk beberapa parameter pada route:

Route::get('user/{id}/{name}', function($id, $name)
{
    //
})
->where(array('id' => '[0-9]+', 'name' => '[a-z]+'))

Mendefinisikan Pola Route Global (Pattern)

Jika ingin membuat parameter route yg selalu menggunakan batasan/kriteria regular expression, gunakan method pattern :

Route::pattern('id', '[0-9]+');

Route::get('user/{id}', function($id)
{
    // Only called if {id} is numeric.
});

Mengakses/Mengambil Value Parameter Route

Jika ingin mengambil/mengakses value parameter route tetapi diluar fungsi tertutup dr route (closure), misalkan filter, gunakan method Route::input :

Route::filter('foo', function()
{
    if (Route::input('id') == 1)
    {
        //
    }
});

Filter Route

Filter route menyediakan cara yg nyaman untuk membatasi akses ke route tertentu, dimana sangat berguna ketika membuat area situs dimana membutuhkan authentikasi/login. Tersedia beberapa filter di dalam framework laravel, termasuk filter authauth.basic, guest, dan csrf. Filter-filter tersebut tersimpan pada file  app/filters.php.

Mendefinisikan Filter Route

Route::filter('old', function()
{
    if (Input::get('age') < 200)
    {
        return Redirect::to('home');
    }
});

jika ada respon yg dihasilkan oleh filter, maka respon tersebut akan dianggap respon terhadap request dr client/browser dan route yg dituju tak akan dieksekusi, termasuk juga filter after batal untuk dieksekusi.

Menghubungkan Filter ke Route

Route::get('user', array('before' => 'old', function()
{
    return 'You are over 200 years old!';
}));

Menghubungkan Filter ke Action Pada sebuah Controller

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

Menguhubungkan Beberapa Filter ke Sebuah Route

Route::get('user', array('before' => 'auth|old', function()
{
    return 'You are authenticated and over 200 years old!';
}));

Menghubungkan Beberapa Filter Dengan Array

Route::get('user', array('before' => array('auth', 'old'), function()
{
    return 'You are authenticated and over 200 years old!';
}));

Parameter Spesifik Filter

Route::filter('age', function($route, $request, $value)
{
    //
});

Route::get('user', array('before' => 'age:200', function()
{
    return 'Hello World';
}));

Filter “After” menerima variabel $response sebagai argumen ketiga yg diberikan ke fungsi filter:

Route::filter('log', function($route, $request, $response, $value)
{
    //
});

Filter Untuk Pola Route Tertentu

Bisa juga sebuah filter dispesifikasikan untuk serangkaian route dgn pola URI tertentu:

Route::filter('admin', function()
{
    //
});

Route::when('admin/*', 'admin');

Pada contoh diatas, filter admin akan diterapkan ke semua route yg dimulai dgn admin/. Tanda bintang/asterik digunakan sebagai wildcard, sebagai pengganti berbagai kombinasi karakter.

Bisa juga batasan filter berupa HTTP verbs tertentu:

Route::when('admin/*', 'admin', array('post'));

Filter Class

Untuk filter tingkat lanjut, bisa juga menggunakan class untuk menggantukan closure/fungsi tertutup. Karena filter class diakomodir oleh IoC Container, maka bisa menggunakan dependency injection pada filter-filter ini supaya tahan uji pada berbagai skenario.

Mendefinisikan Filter Class

class FooFilter {

    public function filter()
    {
        // Filter logic...
    }

}

Meregistrasikan Filter Class

Route::filter('foo', 'FooFilter');

Nama Route

Route yg memiliki nama akan memudahkan saat membuat alamat redirect/pengalihan, dan juga membuat Alamat URL. Nama route dapat diberikan dgn cara berikut:

Route::get('user/profile', array('as' => 'profile', function()
{
    //
}));

Bisa juga nama diberikan ke action pada controller:

Route::get('user/profile', array('as' => 'profile', 'uses' => 'UserController@showProfile'));

Sekarang, nama route dapat digunakan untuk membuat alamat URL atau pengalihan/redirect:

$url = URL::route('profile');

$redirect = Redirect::route('profile');

Nama route juga bisa diakses melalui method currentRouteName:

$name = Route::currentRouteName();

Group Route

Kadangkala dibutuuhkan untuk menerapkan filter untuk serangkaian/grup route. Daripada menuliskan satu persatu pada tiap route, gunakanlah group route:

Route::group(array('before' => 'auth'), function()
{
    Route::get('/', function()
    {
        // Has Auth Filter
    });

    Route::get('user/profile', function()
    {
        // Has Auth Filter
    });
});

Bisa juga menggunakan parameter namespace di dalam array group untuk menunjukan bahwa semua controller di dalam group tersebut berada pada namespace yg diberikan:

Route::group(array('namespace' =&gt; 'Admin'), function()
{
    //
});

Route Sub-Domain

Route Laravel mampu untuk menangani sub-domain wildcard, dan memberikan parameter wildcard dari domain:

Registrasi Route Sub-Domain

Route::group(array('domain' => '{account}.myapp.com'), function()
{

    Route::get('user/{id}', function($account, $id)
    {
        //
    });

});

Awalan Route Prefix

Sekelompok/group route dapat diberi awalan dgn menggunakan opsi prefix pada array atribut pada group tersebut:

Memberi Prefix Group Route

Route::group(array('prefix' => 'admin'), function()
{

    Route::get('user', function()
    {
        //
    });

});

Route Model Binding

Model terkait (binding) menyediakan cara yg nyaman untuk memasukan/injeksi objek instan ke dalam route. Misalnya, daripada menginjeksi ID user, lebih baik menginjeksi seluruh instan model User dgn ID tertentu. Pertama, gunakan method Route::model untuk menunjukan model yg harus digunakan untuk parameter yg ada:

Binding Parameter ke Model

Route::model('user', 'User');

Selanjutnya, definisikan route yg memuat parameter {user} :

Route::get('profile/{user}', function(User $user)
{
    //
});

Karena parameter {user} sudah dikaitkan dengan model User , sebuah objek instan akan diinjeksikan ke dalam route. Jadi, misalkan, sebuah request ke profile/1 akan menginjeksikan instan objek User dengan ID 1.

Note: Jika model yg cocok tidak ditemukan dalam database, maka akan muncul error 404.

Jika ingin mengatur sendiri tindakan untuk model yg tidak ditemukan, berikan closure/fungsi tertutup sebagai argumen ketiga method model :

Route::model('user', 'User', function()
{
    throw new NotFoundException;
});

Bila ingin menggunakan resolver sendiri, selain model,  untuk mengolah parameter yg diterima. Gunakan method Route::bind :

Route::bind('user', function($value, $route)
{
    return User::where('name', $value)->first();
});

Menampilkan Error 404

Ada 2 cara untuk secara manual memicu error 404 dari route. Pertama, bisa menggunakan method App::abort :

App::abort(404);

Kedua, mengeluarkan objek instan dr Symfony\Component\HttpKernel\Exception\NotFoundHttpException.

Informasi lebih lanjut tentang penanganan eksepsi 404 dan kostumisasi respon untuk error ini dapat ditemukan pada bagian errors pada dokumentasi.

Route ke Controller

Laravel tidak hanya menggunakan closure untuk membuat route, tapii juga class controller, dan bahkan bisa juga membuat resource controllers.

Lihatlah dokumentasi Controllers untuk lebih detailnya.