Tips Mensimulasikan CodeIgniter URL di Laravel (Bagian 3) - Modifikasi dan Penyesuaian
Tulisan ini terdiri dari beberapa bagian:
Ada beberapa hal yang dapat dimodifikasi dan disesuaikan dalam route di laravel. Kali ini akan dibahas beberapa di antaranya dan saya masih menggunakan contoh yang ada di tulisan sebelumnya Tips Mensimulasikan CodeIgniter URL di Laravel (Bagian 2)
[php]
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
class ShowProfile extends Controller
{
public function __invoke($id,$param='')
{
return $this->{$id}($param='');
}
function profile($param='')
{
return 'profile test '.$param;
}
function akses($param='')
{
return 'akses test';
}
function wow($param='')
{
return 'wow test';
}
}
[/php]
Contohnya, kita bisa membatasi parameter {param} yang diinputkan hanya terbatas pada angka 0-9 dan nama method {id} hanya huruf a-z (lowercase).
[php]
#setting1
Route::get('user/{id}/{param}', 'ShowProfile')->where(['id' => '[a-z]+', 'param' => '[0-9]+']);
[/php]
Buka web browser lalu coba akses dan perhatikan perbedaan hasilnya http://contoh-nama-domain.com/user/profile/123 dan http://contoh-nama-domain.com/user/profile/abc dan http://contoh-nama-domain.com/user/profile
Apabila parameter {param} dan nama method {id} yang diinputkan keduanya hanya dibatasi huruf a-z (lowercase) saja maka setting kita ubah menjadi:
[php]
#setting1a
Route::get('user/{id}/{param}', 'ShowProfile')->where(array('id','param'), '[a-z]+');
[/php]
Pada contoh #setting1 nama method {id} dan parameter {param} harus diisi sehingga bila kita akses http://contoh-nama-domain.com/user akan menghasilkan error. Pada prakteknya nama method {id} memang harus diisi dan parameter {param} bisa saja dikosongkan. Untuk melakukannya kita ubah sedikit setting route dengan menambahkan "?" setelah parameter {param}
[php]
#setting2
Route::get('user/{id}/{param?}', 'ShowProfile')->where(['id' => '[a-z]+', 'param' => '[0-9]+']);
[/php]
Buka web browser lalu coba akses http://contoh-nama-domain.com/user/profile
Terkadang Anda perlu membuat form misalnya untuk halaman login yang datanya dikirimkan via post. Untuk melakukannya kita ganti get() menjadi post()
[php]
#setting3
Route::post('user/{id}/{param?}', 'ShowProfile')->where(['id' => '[a-z]+', 'param' => '[0-9]+']);
[/php]
Atau kalau dibutuhkan keduanya [get() dan post()] bisa kita gunakan match()
[php]
#setting4
Route::match(['get', 'post'], 'user/{id}/{param?}', 'ShowProfile')->where(['id' => '[a-z]+', 'param' => '[0-9]+']);
[/php]
Ketika route di-setting untuk bisa menerima data via post maka controller harus diubah sehingga datanya bisa dibaca.
[php]
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
class ShowProfile extends Controller
{
public function __invoke($id, $param='',Request $request)
{
return $this->{$id}($param='',$request);
}
function profile($param='',$request)
{
return 'profile test '.$param;
}
function akses($param='',$request)
{
return 'akses test';
}
function wow($param='',$request)
{
return 'wow test';
}
}
[/php]
Misalkan method profile dikirimi data via post dengan field name "datapost" maka contoh untuk membaca datanya kira-kira seperti ini:
[php]
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
class ShowProfile extends Controller
{
public function __invoke($id, $param='',Request $request)
{
return $this->{$id}($param='',$request);
}
function profile($param='',$request)
{
$data_request = $request->post('datapost');
return 'profile test post: '.$data_request;
}
}
[/php]