Belajar Kode Program

Blog belajar menulis kode program dan aplikasi komputer

Sabtu, 13 Mei 2017

Praktik Routing pada Laravel

Sistem routing Laravel berbeda dengan framework yang lain, semisal CI atau Yii. Laravel menggunakan file-file khusus routing, sementara CI atau Yii menggunakan controller. Karena menggunakan file khusus, sifat routing Laravel ini lebih dinamis dan dapat dimodifikasi sesuka hati. Namun, kita dituntut untuk rajin mendefinisikan routing. Menurut hemat kami, ini justru lebih aman ketimbang ternyata pengguna dapat mengakses url-url yang ternyata belum kita amankan.


Seperti pernah kami singgung dalam 5 Konsep Minimal Memahami Laravel, bahwa file-file routing terletak pada folder routes. Ada dua file yang secara default sudah didefinisikan pada file app\Providers\RouteServiceProvider.php, yaitu web.php dan api.php. File web.php digunakan untuk routing antarmuka web sedangkan file api.php digunakan untuk antarmuka API yang sifatnya stateless (tidak menyimpan session). Gambar di bawah ini adalah potongan pada file RouteServiceProvider.php yang menunjukkan bahwa untuk file web.php sudah dibekali dengan middleware web dan file api.php dengan middleware api. Khusus untuk routing api sudah diberikan prefix 'api' sehingga penulisan route pada file api.php tidak perlu menambahkan prefix lagi.


Selanjutnya, ada beberapa topik mengenai routing ini yang perlu kita pelajari.

Routing Laman Statis

Untuk laman statis, sistem routing menggunakan closure atau fungsi tak bernama. Contoh:

//contoh dasar, closure 
Route::get('hello', function () {
  return 'Hello World';
});

//menggunakan file template
Route::get('about', function()
{
  return View::make('about'); //merujuk ke file app/views/about.blade.php
});

//atau bisa juga ditulis
Route::view('/about', 'about'); 


//jika menggunakan data yang hendak disertakan
Route::view('/welcome', 'welcome', ['name' => 'Taylor']);

//menggunakan controller
Route::get('/user', 'UsersController@index');

Untuk menangani rekues pengguna, routing mengenal beberapa metode sesuai HTTP verb, yaitu:

Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);

Untuk menggunakan beberapa HTTP verb, misalnya GET dan POST, dapat digunakan metode berikut:

Route::match(['get', 'post'], '/', function () {
    //
});

Route::any('foo', function () {
    //
});

Khusus untuk HTTP verb POST, PUT, dan DELETE yang biasa dipakai untuk mengolah data form yang disubmit pengguna, mensyaratkan adanya field token CSRF. Caranya, pada form harus diberikan sebuah sintaks crsf_field() seperti contoh berikut:

<form method="POST" action="/profile">
    {{ csrf_field() }}
    ...
</form>

Routing dengan Parameter

Dengan parameter kita dapat mendefinisikan sebuah variabel akan dibaca sebagai apa dalam sebuah route. Parameter ditulis dalam tanda kurung kurawal ({}) dan tidak boleh mengandung karakter hypen atau strip (-). Parameter ini ada yang sifatnya wajib (harus ada) dan opsional, jika tidak ada tidak akan mengakibatkan laman error. Contoh untuk parameter wajib:

Route::get('user/{id}', function ($id) {
    return 'User '.$id;
});
//parameter bisa juga menggunakan type hinting
Route::get('profile/{user}', function (App\User $user) {
    //
});

//lebih dari satu parameter
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
    //
}); 

Untuk parameter opsional, gunakan tanda tanya pada akhir nama parameter. Contohnya sebagai berikut:

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

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

Karena parameter ini diolah dari rekues pengguna, maka perlu untuk melakukan validasi dasar terhadap nilai yang diberikan oleh pengguna. Kita dapat memanfaatkan regex dalam hal ini yang diletakkan pada metode where. Contoh:

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

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

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

Selain cara regex yang disematkan pada klausa where, untuk memvalidasi input dari pengguna kita juga bisa melakukan pengaturan pada file RouteServiceProvider.php di bagian metode boot.

public function boot()
{
  Route::pattern('id', '[0-9]+');
  parent::boot();
}

Dengan demikian, pada routing berikut sudah otomatis divalidasi inputan penggunanya:

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

Penamaan Routing  

Penamaan routing ini akan bermanfaat terutama jika kita akan memanggil URL.

Route::get('user/profile', function () {
  //
})->name('profile');

Selanjutnya kita bisa menggunakan nama tersebut untuk membuat URL dan melakukan redireksi.

// Membuat URLs...
$url = route('profile');

// Melakukan Redirects...
return redirect()->route('profile');

Lalu, bagaimana jika route itu menggunakan parameter? Simak contoh berikut:

Route::get('user/{id}/profile', function ($id) {
    //
})->name('profile');

$url = route('profile', ['id' => 1]);

Untuk mengecek rute, dapat digunakan metode named seperti contoh di bawah ini:

public function handle($request, Closure $next)
{
    if ($request->route()->named('profile')) {
        //
    }
    return $next($request);
}

Pengelompokan Route

Pengelompokan sangat berguna terutama jika kita ingin mengumpulkan beberapa rute dengan karakteristik tertentu yang sama. Ada beberapa cara pengelompokan route yang akan dicontohkan pada sintaks berikut:

Route::middleware(['first', 'second'])->group(function () {
    Route::get('/', function () {
        // Uses first & second Middleware
    });
    
    Route::get('user/profile', function () {
        // Uses first & second Middleware
    });
});

Route::namespace('Admin')->group(function () {
    // Controllers Within The "App\Http\Controllers\Admin" Namespace
});

Route::domain('{account}.myapp.com')->group(function () {
    Route::get('user/{id}', function ($account, $id) {
        //
    });
});

Route::prefix('admin')->group(function () {
    Route::get('users', function () {
        // Matches The "/admin/users" URL
    });
});

Filter Routing untuk Admin

Misalnya kita memiliki fitur admin, sebaiknya kita buat pengelompokan dulu dengan group.

Route::group(array('prefix' => 'admin'), function()
{
    // main page for the admin section (app/views/admin/dashboard.blade.php)
    Route::get('/', function()
    {
        return View::make('admin.dashboard');
    });

    // subpage for the posts found at /admin/posts (app/views/admin/posts.blade.php)
    Route::get('posts', function()
    {
        return View::make('admin.posts');
    });

    // subpage to create a post found at /admin/posts/create (app/views/admin/posts-create.blade.php)
    Route::get('posts/create', function()
    {
        return View::make('admin.posts-create');
    });
});

Lalu kita buatkan juga

Route::get('login', function()
{
    // show the login page (app/views/login.blade.php)
    return View::make('login');
});

Route::group(array('prefix' => 'admin', 'before' => 'auth'), function()
{
    // main page for the admin section (app/views/admin/dashboard.blade.php)
    Route::get('/', function()
    {
        return View::make('admin.dashboard');
    });

    ...

});

Penanganan Laman Error


Mengakses Route

$route = Route::current();
$name = Route::currentRouteName();
$action = Route::currentRouteAction();

Referensi:
https://laravel.com/docs/5.5/routing
https://scotch.io/tutorials/simple-and-easy-laravel-routing

Tidak ada komentar:

Posting Komentar