Lumen HTTP Response

Basic Response

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 :

$router->get('/user',function (){
    return response()->json(
        [
            'id'=>1,
            'name' => 'alfazalea',
            'age' => '20'
        ]
    );
});

File Download

Ketika kita ingin mengembalikan response berupa file / download file maka kita bisa mengunakan function response->donwload seperti berikut :

$router->get('/download',function (){
    return response()->download($pathToFile);
});

Redirect Response

Untuk melakukan response redirect ke halaman/page lain kita bisa menggunakan redirect seperti berikut :

$router->get('/redirect',function (){
return redirect('home/dashboard');
});

Redirect to Name Routes

$router->get('/login',function (){
    return redirect()->route('login');
});

Redirect with paramaters

//parsing array
$router->get('/home',function (){
    return redirect()->route('profile',['id'=>1]);
});

//parsing object/model

$router->get('/home',function (){
    return redirect()->route('profile',[$user]);
});

 

 

 

 

References :

  1. https://lumen.laravel.com/

hyvercode

Lumen HTTP Request

Accessing Request

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

$router->get('/randomcode','ExampleController@getRandomCode');

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

$router->get('/userby/{id}','ExampleController@getUserById');

Running aplikasi / project dan akses melalui browser dengan menambahkan name dan age pada query param seperti berikut :

atau kita bisa menggunakan tools seperti Postman https://www.postman.com/downloads/

Request Body/Payload

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

$router->post('/calculate','ExampleController@calculate');

Running aplikasi / project dan request melalui postman

The lumen tutorial source code can be downloaded at github alfazalea/lumen-tutorial

 

Reference :

  1. https://lumen.laravel.com
  2. https://developer.mozilla.org
  3. https://www.postman.com

 

hyvercode

Lumen HTTP Controllers

Introduction

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

Lumen Introduction

<?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

$router->get('/example', 'ExampleController@index');

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.

 

Source code tutorial lumen bisa di download di github alfazalea/lumen-tutorial

 

References :

  1. https://lumen.laravel.com/

hyvercode

Lumen HTTP Middleware

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 :

$app->middleware([
    App\Http\Middleware\ExampleMiddleware::class
]);

Assigning Middleware To Routes

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 :

$app->routeMiddleware([
    'user' => App\Http\Middleware\ExampleMiddleware::class
]);

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.

 

References :

  1. https://lumen.laravel.com/

 

hyvercode

Lumen HTTP Routing

Basic Routing

Routing adalah entripoint pada aplikasi webservice atau disebut juga endpoint dimana routing inilah yang akan menjadi link/URL pada aplikasi webservice kita. untuk membuat routing pada aplikasi lumen, terdapat pada file routes/web.php, berikut contoh dasar atau senderhana untuk membuat route :

// Get
$route->get('foo', function(){
    return 'Hello World';
});

//Post 
$route->post('foo', function(){
    return 'Hello Lumen';
});

Lumen menyediakan beberapa method untuk membuat route :


$route->get($uri,$callback);
$route->post($uri,$callback);
$route->put($uri,$callback);
$route->patch($uri,$callback);
$route->delete($uri,$callback);
$route->option($uri,$callback);

Route With Parameter

Required Parameter

Lumen jugan menyediakan route dengan path variable atau paramater


$route->get('user/{id}', function($id){
    return 'Hello World '.$id;
});

//multiple parameter
$route->get('post/{id}/comments/{commentsId}', function($id,$commentsId){
    //
});

Optional Parameter

Optional paramater adalah tipe paramater yang bersifat optional atau route akan tetap bisa kita akses ketika paramater tidak kita isi:

$route->get('user[/{id}]', function($id){
    return 'Hello World '.$id;
});

Regular Expression Constraints

Regular Expression Constraints adalah route yang parameternya bisa kita buat atau tambahkan pola tertentu (regex):

$route->get('user/{name:[A-Za-z]}', function($name){
    return 'Hello World '.$name;
});

Named Routes

Penggunaan nama pada route memungkinkan pembuatan URL atau pengalihan untuk rute tertentu.

$route->get('user',['as'=>'user', function(){
    //
}]);

atau kita bisa membuat route yang terhubung dengan Controller

$route->get('user',['as'=>'user','use'=>'UserController@show']});

Generating URLs To Names Routes

Setelah kita membuat nama untuk rute tertentu, Kita dapat menggunakan nama rute untuk membuat URL atau melakukan redirect melalui fungsi rute global:

$url = route('profile');

// Redirect url
return redirect()->route('profile')

redirect route / URL dengan paramater

$route->get('user/{id}/profile',['as'=>'profile', function($id){
   //
}]);


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

Routes Groups

Grup rute memungkinkan kita untuk berbagi atribut rute, seperti middleware atau namespaces, di sejumlah besar rute tanpa perlu menentukan atribut tersebut pada setiap rute. Atribut bersama ditentukan dalam format array sebagai parameter pertama ke metode $router->group.

Middleware

$router->group(['middleware' => 'auth'], function () use ($router) {
    $router->get('/', function () {
        // Uses Auth Middleware
    });

    $router->get('user/profile', function () {
        // Uses Auth Middleware
    });
});

Namespaces

Kasus penggunaan umum lainnya untuk grup rute adalah menetapkan Namespaces PHP yang sama ke group Controllers.

$router->group(['namespace' => 'Admin'], function() use ($router)
{
    // Using The "App\Http\Controllers\Admin" Namespace...

    $router->group(['namespace' => 'User'], function() use ($router) {
        // Using The "App\Http\Controllers\Admin\User" Namespace...
    });
});

Routes Prefix

Kita bisa membuat group URLs, contoh kita membuat beberapa route dalam group admin:

$router->group(['prefix' => 'admin'], function () use ($router) {
    $router->get('users', function () {
        // Matches The "/admin/users" URL
    });
});

Group prefix juga bisa kita tambahkan sebuah paramater

$router->group(['prefix' => 'accounts/{accountId}'], function () use ($router) {
    $router->get('detail', function ($accountId) {
        // Matches The "/accounts/{accountId}/detail" URL
    });
});

 

 

References :

  1. https://lumen.laravel.com/

hyvercode

Lumen Introduction

Lumen adalah micro-framework dari Laravel yang sangat ringan dan cepat, Lumen adalah solusi terbaik untuk membuat microservice berdasarkan atau dengan konsep dasar Laravel.

Installation

Server Requirment

  1. PHP >=7.3
  2. OpenSSL PHP Extension
  3. PDO PHP Extension
  4. Mbstring PHP Extension
  5. Composer

Untuk membuat project lumen kita bisa mengunakan composer yaitu dengan printah create-project contoh seperti berikut :

composer create-project --prefer-dist laravel/lumen blog

Struktur awal project Lumen seperti gambar di atas, sedangkan untuk menjalankan aplikasi pada local server kita bisa menggunakan perintah berikut :

php -S localhost:8000 -t public

Sama seperti Laravel file configurasi lumen terletak pada file .env, Karena Lumen adalah framework yang benar-benar terpisah dari Laravel, Lumen tidak secara default menawarkan kompatibilitas dengan library Laravel tambahan seperti Cashier, Passport, Scout, dll. Jika kita ingin mengunakan atau memakai library-library tersebut kita bisa melakukan configurasi secara mandiri.

 

References :

  1. https://lumen.laravel.com/

hyvercode