Selain melakukan mapping terhadap Controller route juga bisa mengembalikan response secara langsung seperti berikut :
String Response
$router->get('/response',function (){
return "This is my response";
});
jika aplikasi kita jalankan maka route yang telah kita buat akan mampilkan text atau string seperti berikut :
Object Response
Selain string kita bisa mengembalikan response berupa JOSN :
$router->get('/response',function (){
return (new Response(['name'=>'alfazalea'], 200))
->header('Content-Type', 'application/json');
});
JSON Response
jika mengunakan response json maka secara default type header menjadi application/json, serta mengkonversi array yang diberikan menjadi JSON menggunakan fungsi PHP json_encode :
Untuk mengakses nilai pada sebuah request kita bisa menggunakan Dependency Injection pada sebuah method yaitu dengan melakukan injection class Illuminate\Http\Request pada method yang kita buat. Dependency ini sudah include pada framework lumen sehingga kita bisa menggunakannya dengan cara memanggil use Illuminate\Http\Request.
<?php
namespace App\Services;
use Illuminate\Http\Request;
class UserController
{
/**
* @param $name
* @return mixed
*/
public function getName(Request $request){
return 'My Name is :' .$request->name;
}
}
pada script diatas kita mengambil nilai name dari request baik itu method dengan POST/GET.
Request Param ( Query Parameter)
Request query param adalah request yang biasanya mengunakan method GET yaitu dengan cara mengirim nilai request pada parameter URL seperti http://localhost:8000/randomcode?name=alfazalea&age=90, dimana pada request ini kita mengirimkan sebuah parameter dengan variable name. Request param / query paramater diawali dengan(?) di akhir URL dan menggunakan (&) untuk menambah paramater selanjutnya.
Contoh sederhana bagaimana melakukan request dan mendapatkan nilai pada sebiah request :
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ExampleController extends Controller
{
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
//
}
public function index()
{
return response(['message' => 'Hello Word'], 200);
}
/**
* @param Request $request
* @return string
* @throws \Exception
*/
public function getRandomCode(Request $request)
{
return 'Your name is : ' . $request->name . ' and your code : ' . random_int(100000, 999999);
}
}
Mapping class controller yang telah kita buat pada route
Running aplikasi / project dan akses melalui browser dengan menambahkan name pada query param seperti berikut :
Request Path Variable
Sama seperti Request Param, Request Path Variable juga bisa mengirimkan request dengan cara menyisipkan atau menambahkan value yang akan dikirim pada URL. Perbedaanya nilai yang akan kita kirim menjadi sebuah atau bagian dari URL itu sendiri ‘ http://localhost:8000/randomcode/123 ‘, Request Path Variable juga bisa kita gunakan bersamaan dengan Request Param seperti ‘http://localhost:8000/randomcode/123?name=alfazalea&age=90‘, dimana path 123 adalah kode user yang akan kita kirim sedangkan paramater berikutnya adalah query paramater yang akan kita kirim juga.
Contoh sederhana cara membuat Request Path Variable bersamaan dengan Request Param:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ExampleController extends Controller
{
/**
* @param Request $request
* @return string
* @throws \Exception
*/
public function getUserById($id,Request $request)
{
return 'ID :'.$id.' Your name is : ' . $request->name . ' and your age : ' . $request->age;
}
}
Mapping class controller yang telah kita buat pada route
Request body/payload adalah request yang mengirimkan request pada body/payload, request ini mendukung pengiriman beberapa type data seperti raw,binary,form-data,GrapQL dll.
Kita akan membuat contoh sederhana bagaimana melakukan request dengan mengirimkan type raw berupa JSON :
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ExampleController extends Controller
{
/**
* @param Request $request
* @return string
* @throws \Exception
*/
public function calculate(Request $request)
{
$total = $request->amount * $request->price;
return 'Total amount = '.$total;
}
}
Mapping class controller yang telah kita buat pada route dengan method POST
Controller pada lumen adalah sebuah class yang berfungsi sebagai behavior atau logic yang menghandle setiap request dari routes/web.php yang telah dibuat. Semua class controllers pada framework lumen terletak di directory app/Http/Controllers.
Basic Controllers
Semuah class controllers pada framework lumen adalah extends dari class Controller. Berikut contoh sederhana bagaimana mebuat sebuah class controllers buat sebuah class ExampleController pada directory project app/Http/Controllers. cara install atau menbuat project awal lumen bisa mengikuti tutorial lumen sebelumnya
<?php
namespace App\Http\Controllers;
class ExampleController extends Controller
{
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
//
}
public function index(){
return "Hello World";
}
}
Setelah kita membuat class controller maka selanjutnya agar controller yang telah kita buat, tambahkan atau buat route controller pada file app/routes/web.php
Pada script di atas kita mebuat sebuah route dengan nama /example dan methode GET yang melakukan callback pada class ExampleController dengan nama function index. Setelah itu jalankan aplikasi dan kemudian akses service yang kita buat dengan cara jalankan apliaksi lumen dengan mengetik perintah berikut :
php -S localhost:8000 -t public
Dependency Injection (DI) & Controllers
Constructor injection
Dependency Injection pada Controller yaitu melakukan injection sebuah Class pada Constructor, sehingga Class atau dependency yang kita inject secara otomatis akan dibuatkan instance ketika Class controller dieksekusi, berikut contoh Dependency Injection pada Controller :
<?php
namespace App\Http\Controllers;
use App\Services\UserService;
class UserController
{
protected $userService;
public function __construct(UserService $userService)
{
$this->userService = $userService;
}
/**
* @param $name
* @return mixed
*/
public function getMyName($name){
return $this->userService->getName($name);
}
}
Pada contoh script di atas kita melakukan injection pada contructor yaitu dengan memasukan class UserService dan memanggil method getName pada body function/method yang kita buat.
Method Injection
Selain pada construstor kita juga bisa membuat Dependency Injection pada sebuah method, contoh seperti berikut :
<?php
namespace App\Services;
use http\Client\Request;
class UserService
{
/**
* @param $name
* @return mixed
*/
public function getName(Request $request){
return 'My Name is :' .$request->name;
}
}
Pada contoh script di atas kita melakukan injection pada function/method getName yaitu dengan memasukan class Request dan mengambil nilai $request->name pada body function/method yang kita buat.
HTTP Middleware adalah mekanisme yang digunakan untuk filtering HTTP Reguest pada system/aplikasi yang kita buat. contoh Lumen menyediakan middleware untuk melakukan proses authenticated jika user tidak memiliki authentication, maka middleware akan melakukan redirect ke halaman login atau jika aplikasi REST maka system akan memberikan response error.
Defining Middleware
Untuk membuat middleware, pada saat pertama kali kita membuat sebuat project dengan composer maka lumen secara default menyediakan class contoh middleware , kita bisa gunakan ini dengan cara mengkopi terlebih dahulu class contoh tersebut. Contoh class terdapat di directory http/middleware/ExampleMiddleware.php .
class ExampleMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if($request->scope =='admin'){
return redirect('admin');
}
return $next($request);
}
}
Pada contoh class middleware di atas kita melakukan filtering atau validasi jika scope sama dengan admin, maka user akan di arahkan ke halaman admin.
Registering Middleware
Setelah kita membuat class midlleware maka selanjutnya kita harus mendaftarkan class tersebut agar bisa kita gunakan ada beberapa cara agar middleware yang telah kita buat bisa kita gunakan :
Global Middleware
Jika middleware yang kita buat bisa berjalan atau digunakan pada saat semua request, maka kita bisa mendaftarkan class middleware pada file app.ph yang terletak di directory bootstrap/app.php :
Selain secara global kita juga bisa meletakan middleware pada setiap route yang kita buat ini lebih spesifik sesuai dengan yang kita inginkan route mana yang akan kita pasang middleware kita bisa tambahkan pada file php yang terletak di directory bootstrap/app.php :
Selanjutnya kita pasang / gunakan middleware tersebut pada route yang kita buat :
//Single route
$router->group(['middleware' => 'user'], function () use ($router) {
$router->get('/employee', ['uses' => 'EmployeeController@getEmployee']);
});
//Multiple middleware
$router->group(['middleware' => ['user','admin']], function () use ($router) {
$router->get('/employee', ['uses' => 'EmployeeController@getEmployee']);
});
Middleware Parameters
Middleware bisa juga menerima custom parameters, contoh ketika kita membuat verifikasi terhadap user yang memiliki authenticated ‘role’ untuk melakukan action berikutnya, kita bisa membuat sebiah RoleMiddleware yang akan melakukan validasi role contoh pada class berikut :
class RoleMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next,$role)
{
if(!$request->user()->hasRole($role)){
//action
}
return $next($request);
}
}
Middleware spesifik bisa kita gunakan/ tambahkan pada route yang telah kita buat :
$router->group(['middleware' => role:create], function () use ($router) {
$router->post('/employee', ['uses' => 'EmployeeController@getEmployee']);
});
Terminable Middleware
Sewaktu – waktu kita membutuhkan middleware yang akan bekerja setelah HTTP response terkirim kepada browse atau client. contoh seperit session middleware akan membuat session setelah response berhasil dikirim ke browser/client. untuk membuat terminable middleware kita bisa menambahkan function termiate seperti berikut :
class SessionMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
return $next($request);
}
public function terminate($request,$response)
{
// Store session
}
}
Terminate function bisa merima request atau response, ketika kita membuat terminable middleware kita harus menambahkan atau mendaftarkan class tersebut pada file bootstrap/app.php.
Saat memanggil metode terminate pada middleware, Lumen akan membuat fresh instance dari middleware service container. Jika kita ingin menggunakan instance middleware yang sama ketika metode handle dan terminate dipanggil, daftarkan middleware dengan container. menggunakan metode singleton container.