menu

Showing posts with label Laravel-Chapter7. Show all posts
Showing posts with label Laravel-Chapter7. Show all posts

Laravel - RabbitMQ (consume message)


Tahun baru, kita kita akan lanjutkan project rabbitMQ, pada tutorial sebelumnya kita sudah sampai pada engine untuk mengirim pesan rabbitMQ pada server, tutorial kali ini kita akan menitik beratkan pada cara mentrigger untuk membaca pesan.

Oke langsung saja kita mulai tutorialnya, pertama kita buat dulu engine consume rabbitnya, dengan cara buat file baru dengan nama consumeRabbit.php isi dengan code berikut:

<?php
 require_once __DIR__ . '/protected/vendor/autoload.php';
 use PhpAmqpLib\Connection\AMQPStreamConnection;
 use PhpAmqpLib\Message\AMQPMessage;

 $host = '127.0.0.1';
 $port = 5672;
 $user = 'guest';
 $pass = 'guest';
 $queue = 'test_message';

 $connection = new AMQPStreamConnection($host, $port, $user, $pass);
 $channel = $connection->channel();
 $channel->queue_declare($queue, false, false, false, false);
 echo ' [*] Waiting for messages. To exit press CTRL+C', "\n";

 $callback = function($msg) {
   echo " [x] Received ", $msg->body, "\n";
 };

 $channel->basic_consume($queue, '', false, true, false, false, $callback);
 while(count($channel->callbacks)) {
     $channel->wait();
 }
?>


Oke saatnya kita test
nyalakan terlebih dahulu server rabbitnya dengan cara buka tutorial sebelumnya,
kemudian, buka terminal masuk ke path project laravel kita kemudian jalankan engine consume rabbitnya dengan cara: php consumeRabbit.php sehingga akan muncul tampilan seperti ini,


Jika engine sudah ready, sekarang buka project laravel kita sehingga akan muncul halaman home seperti gambar dibawah,


selanjutnya click Send Rabbit jika proses selesai lihat terminal yang sudah kita jalankan engine consumeRabbit.php tadi sehingga akan tampak seperti gambar dibawah,



===DONE!===

Laravel - RabbitMQ (send message)


Pada tutorial sebelumnya kita sudah menginstall rabbitmq, tutorial kali ini kita akan membuat engine send message to rabbitmq dari framework laravel.

Engine yang akan kita buat ini akan kita ditempel pada project laravel yang sudah kita buat sebelumnya (silahkan ikuti tutorial laravel secara terurut, bisa lihat di books), atau download projectnya disini.

Pertama, install library rabbitmq pada laravel, dalam hal ini kita akan menggunakan library php-amqplib/php-amqplib, install library dengan cara, ketikan pada terminal code berikut,
php composer require php-amqplib/php-amqplib

Selanjutnya, tambahkan route baru untuk controller rabbitmq yang akan kita buat, terletak pada path protected/app/routes file web.php
///////////
// QUEUE //
///////////
Route::group(array('prefix' => 'queue'), function(){
 Route::get('sendRabbit', 'Controller\QueueController@sendRabbit');
});

Setelah itu, buat controller baru dengan nama QueueController.php pada path protected/app/controllers/ dan masukkan code berikut,
<?php namespace Controller;

use Model\User;
use \Input;
use \View;
use \Validator;
use \Redirect;
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

class QueueController extends \BaseController 
{
 function sentQueueRabbitMQ($message = [])
 {
    $connection = new AMQPStreamConnection(RABBITMQ_HOST, RABBITMQ_PORT, RABBITMQ_LOGIN, RABBITMQ_PASSWORD);

    $channel = $connection->channel();

    if (!empty($message)) {
      $message = new AMQPMessage(json_encode($message));
      $channel->basic_publish($message, '', RABBITMQ_QUEUE);
    }

    $channel->close();
    $connection->close();
 }

 public function sendRabbit()
 {
  $id = str_random(4);
  $message = [
   'id' => $id,
   'message' => 'halo '.$id
  ];
  $this->sentQueueRabbitMQ($message);
  return Redirect::to('/');
 }
}

Terakhir buat tampilannya untuk test saja berupa satu button untuk mengirim message yang berupa json ke rabbitmq dengan cara,
edit file header.blade.php pada path protected/app/views/layouts/web/ menjadi seperti ini,
<div class="header">
 <div class="banner">
  <div class="welcome">Welcome</div>
  {{-- code dibawah ini menggunakan constant variabel --}}
  <div class="gambar"><a href="#"><img src="{{ IMAGE_HEADER }}" style="width:"100px" height="129px";"></a></div>
 </div>
 <hr>
 <div class="menu">
  <div class="kiri">
   <li>
    <div class="dropdown">
      <button class="btn btn-default">Menu(css)</button>
      <div class="dropdown-content">
        <a href="{{ URL::to('crud/users')}}">User</a>
        <a href="{{ URL::to('book')}}">Index Book</a>
        <a href="{{ URL::to('javaScript/js1')}}">Belajar Script</a>
        <a href="{{ URL::to('javaScript/js2')}}">Belajar Script2</a>
        <a href="{{ URL::to('javaScript/js3')}}">Belajar Script3</a>
        <a href="{{ URL::to('javaScript/js4')}}">Belajar Script4</a>
        <a href="{{ URL::to('javaScript/js5')}}">Belajar Script5</a>
        <a href="{{ URL::to('javaScript/js6')}}">Belajar Script6</a>
        <a href="{{ URL::to('javaScript/js7')}}">Belajar Script7</a>
      </div>
    </div>
   </li>
   <li>
     <div class="dropdown-script">
      <button onclick="myFunction()" class="dropbtn btn btn-default">Translate</button>
      <div id="myDropdown" class="dropdown-content-script">
        <a href="{{ URL::to('lang/en') }}">English</a>
        <a href="{{ URL::to('lang/ina') }}">Indonesia</a>
      </div>
     </div>
   </li>
  </div>
  <div class="kanan">
   @if(Auth::user())
    <li onclick="if(confirm('Are you sure to logout?')) location.href='{{ URL::to('logout') }}';">Logout</li>
   @else
    <li onclick="location.href='{{ URL::to('login') }}';">Login</li>
   @endif
   <li onclick="location.href='{{ URL::to('register') }}';">Register</li>

   <!-- Send queue rabbit -->
   <li onclick="location.href='{{ URL::to('queue/sendRabbit') }}';">Send Rabbit</li>
  </div>
 </div>
</div>

Sehingga tampilannya akan tampak seperti ini,


Saat di klik button Send Rabbit maka pada rabbitmq (http://localhost:15672/#/) akan muncul tampilan seperti ini,



Tutorial berikutnya kita akan membuat engine untuk consume message rabbitmq,

===DONE!===

Laravel - RabbitMQ (Setup)


Back to code, lebih dari sebulan vakum akhirnya bisa eksperimen lagi,
pada eksperimen kali ini kita akan bereksperimen membuat sebuah engine rabbitmq yang akan disematkan pada project laravel, rabbitmq adalah salah satu perangkat lunak manajemen antrian yang digunakan untuk pengiriman pesan. Eksperiment ini akan dibagi menjadi 3 tutorial,
  1. Setup rabbitmq
  2. Send message
  3. Consume message
Pada tutorial yang pertama kita akan menginstall rabbitmq pada komputer,
Oke langsung saja kita mulai tutorialnya, pertama install rabbitmq terlebih dahulu dengan cara ikuti saja langkah ini https://www.rabbitmq.com/download.html karena saya menggunakan macOS maka saya akan menggunakan homebrew https://www.rabbitmq.com/install-homebrew.html
brew update
brew install rabbitmq

Jika muncul error ini,



Ini berarti anda tidak memiliki akses pada folder man5, ketikan saja code berikut pada terminal,
sudo chown -R nama_user_mac:admin /usr/local/share
jika sudah ketikan code berikut pada terminal,
brew link rabbitmq

Jika tidak muncul error diatas, langsung lanjut saja ke bawah,
Setelah selesai install rabbitmq pada komputer maka nyalakan servernya pada localhost dengan cara,
ketikan pada terminal
/usr/local/sbin/rabbitmq-server

Sehingga akan muncul seperti pada gambar dibawah,


Untuk mematikan server rabbitmq ketikan syntax berikut pada terminal
/usr/local/sbin/rabbitmqctl stop

Sekarang buka browser dan buka link ini http://localhost:15672/#/ (user:guest password:guest) sehingga akan muncul tampilan seperti ini,


Selanjutnya tambahkan queue pada rabbitmq, caranya

  • Masuk ke menu Queues
  • Isi name
  • Klik Add queue


Tutorial selanjutnya send message,

===DONE!===

Laravel - RESTful project (API delete data)


Pada tutorial kali ini kita akan membuat sebuah engine REST-ful untuk delete data, sebagai lanjutan tutorial yang sebelumnya.

Sama seperti tutorial sebelumnya untuk dapat melakukan delete data user maka kita harus melempar parameter ID data user yang akan didelete.

Oke langsung saja kita mulai experimentnya,
Pertama, tambahkan route baru untuk method baru delete ini dengan mengedit code pada file route api.php yang terletak pada path protected/app/routes/ edit menjadi seperti ini,
<?php 

//////////
// CRUD //
//////////
//pahamilah group route dibawah
Route::group(array('prefix' => 'crud'), function(){
 Route::get('users', 'Controller\Api\UserController@getUsers');
 Route::post('store-user', 'Controller\Api\UserController@storeUser');
 Route::get('{id}', 'Controller\Api\UserController@showUser');
 Route::patch('{id}', 'Controller\Api\UserController@updateUser');
 Route::delete('{id}', 'Controller\Api\UserController@deleteUser');
});

Selanjutnya, edit file UserController.php pada path protected/app/controllers/api/ menjadi seperti ini,
<?php namespace Controller\Api;

use Model\User;
use \Response;
use \Validator;
use \Input;
use Illuminate\Http\Request;


class UserController extends \BaseController 
{
 public function getUsers()
 {
  $users = User::get();

  $response['status'] = 'OK';
  $response['result'] = $users;

  return Response::json($response);
 }

 public function storeUser()
 {
  $validator = Validator::make(
   Input::all(),
   array(
    "name"     => "required",
    "username"    => "required|unique:users,username",
    "email"     => "required|email|unique:users,email",
       "password"              => "required|min:6",
   )
  );
  // dd($_POST);
  if ($validator->passes()) {
      $user = User::storeOrUpdateUser(Input::all(), null);
      // dd($_POST);
      $response['status'] = 'OK';
      $response['result'] = $user;
     }
     else {
      $response['status'] = 'ERROR';
      $response['message'] = $validator->messages();
     }

  return Response::json($response);
 }

 public function showUser($id)
 {
  $user = User::find($id);

  if ($user) {
   $response['status'] = 'OK';
   $response['result'] = $user;
  } else {
   $response['status'] = 'ERROR';
   $response['message'] = 'User not found';
  }

  return Response::json($response);
 }

 public function updateUser($id)
 {
  $validator = Validator::make(
   Input::all(),
   array(
    "name"     => "required",
    "username"    => "required|unique:users,username,".$id,
    "email"     => "required|email|unique:users,email,".$id,
       "password"              => "required|min:6",
   )
  );

  $user = User::find($id); 
  
  if ($user) {
   if ($validator->passes()) {
       $user = User::storeOrUpdateUser(Input::all(), $user);
       $response['status'] = 'OK';
       $response['result'] = $user;
      }
      else {
       $response['status'] = 'ERROR';
       $response['message'] = $validator->messages();
      }
  } else {
   $response['status'] = 'ERROR';
      $response['message'] = 'User not found';
  }

  return Response::json($response);
 }

 public function deleteUser($id)
 {
  $user = User::find($id);

  if ($user) {
   $user->delete();
   $response['status'] = 'OK';
   $response['result'] = 'Success delete user';
  } else {
   $response['status'] = 'ERROR';
   $response['message'] = 'User not found';
  }

  return Response::json($response);
 }
}

Terakhir, test pada postman jika ID user ditemukan maka proses delete user berhasil,



Jika ID user tidak ditemukan maka akan muncul error seperti ini,



===DONE!===

Laravel - RESTful project (API update data)



Pada tutorial sebelumnya kita sudah membuat API untuk show data, tutorial kali ini kita akan meneruskan sistem RESTful membuat API update data. Pada API ini kita akan melemparkan parameter ID yang mrupakan ID data yang akan di edit datanya.

Oke langsung saja kita mulai experimentnya,
Pertama, buat terlebih dahulu route APInya dengan cara edit file api.php pada path protected/app/routes/ menjadi seperti ini,
<?php 

//////////
// CRUD //
//////////
//pahamilah group route dibawah
Route::group(array('prefix' => 'crud'), function(){
 Route::get('users', 'Controller\Api\UserController@getUsers');
 Route::post('store-user', 'Controller\Api\UserController@storeUser');
 Route::get('{id}', 'Controller\Api\UserController@showUser');
 Route::patch('{id}', 'Controller\Api\UserController@updateUser');
});
Dapat dilihat pada code diatas, RESTful untuk update data menggunakan method PATCH.

Selanjutnya, buat method untuk update atau edit dengan cara edit file UserController.php pada path protected/app/controllers/api/ menjadi seperti ini,
<?php namespace Controller\Api;

use Model\User;
use \Response;
use \Validator;
use \Input;
use Illuminate\Http\Request;


class UserController extends \BaseController 
{
 public function getUsers()
 {
  $users = User::get();

  $response['status'] = 'OK';
  $response['result'] = $users;

  return Response::json($response);
 }

 public function storeUser()
 {
  $validator = Validator::make(
   Input::all(),
   array(
    "name"     => "required",
    "username"    => "required|unique:users,username",
    "email"     => "required|email|unique:users,email",
       "password"              => "required|min:6",
   )
  );
  // dd($_POST);
  if ($validator->passes()) {
      $user = User::storeOrUpdateUser(Input::all(), null);
      // dd($_POST);
      $response['status'] = 'OK';
      $response['result'] = $user;
     }
     else {
      $response['status'] = 'ERROR';
      $response['message'] = $validator->messages();
     }

  return Response::json($response);
 }

 public function showUser($id)
 {
  $user = User::find($id);

  if ($user) {
   $response['status'] = 'OK';
   $response['result'] = $user;
  } else {
   $response['status'] = 'ERROR';
   $response['message'] = 'User not found';
  }

  return Response::json($response);
 }

 public function updateUser($id)
 {
  $validator = Validator::make(
   Input::all(),
   array(
    "name"     => "required",
    "username"    => "required|unique:users,username,".$id,
    "email"     => "required|email|unique:users,email,".$id,
       "password"              => "required|min:6",
   )
  );

  $user = User::find($id); 

  if ($user) {
   if ($validator->passes()) {
       $user = User::storeOrUpdateUser(Input::all(), $user);
       $response['status'] = 'OK';
       $response['result'] = $user;
      }
      else {
       $response['status'] = 'ERROR';
       $response['message'] = $validator->messages();
      }
  } else {
   $response['status'] = 'ERROR';
      $response['message'] = 'User not found';
  }

  return Response::json($response);
 }
}

Kemudian, kita test dengan menggunakan postman dengan memasukan url dan method seperti pada gambar dibawah ini,


Terakhir masukan parameter yang akan kita edit datanya seperti pada gambar dibawah,
Dapat dilihat pada gambar diatas, body yang kita lempar menggunakan postman menggunakan format x-www-form-urlencoded bukan form-data seperti pada API store data, hal ini dikarenakan kita menggunakan method PATCH yang tidak support menggunakan format form-data.

Sehingga hasilnya akan tampak seperti pada gambar dibawah ini,



===DONE!===

Laravel - RESTful project (API show data)


Tutorial sebelumnya kita sudah membuat RESTful untuk store data, pada tutorial kali ini kita akan membuat RESTful sistem untuk menampilkan data berdasarkan ID yang ingin ditampilkan.

Oke, langsung saja kita mulai experimentnya,
Pertama, buat dulu route yang akan mengarah pada API show data dengan mengedit file api.php pada path protected/app/routes/ menjadi seperti ini,
<?php 

//////////
// CRUD //
//////////
//pahamilah group route dibawah
Route::group(array('prefix' => 'crud'), function(){
 Route::get('users', 'Controller\Api\UserController@getUsers');
 Route::post('store-user', 'Controller\Api\UserController@storeUser');
 Route::get('{id}', 'Controller\Api\UserController@showUser');
});

Selanjutnya, buat method baru yang akan mengarahkan pada url show data tersebut dengan mengedit file UserController.php pada path protected/app/controllers/api/ menjadi seperti ini,
<?php namespace Controller\Api;

use Model\User;
use \Response;
use \Validator;
use \Input;
use Illuminate\Http\Request;


class UserController extends \BaseController 
{
 public function getUsers()
 {
  $users = User::get();

  $response['status'] = 'OK';
  $response['result'] = $users;

  return Response::json($response);
 }

 public function storeUser()
 {
  $validator = Validator::make(
   Input::all(),
   array(
    "name"     => "required",
    "username"    => "required|unique:users,username",
    "email"     => "required|email|unique:users,email",
       "password"              => "required|min:6",
   )
  );
  // dd($_POST);
  if ($validator->passes()) {
      $user = User::storeOrUpdateUser(Input::all(), null);
      // dd($_POST);
      $response['status'] = 'OK';
      $response['result'] = $user;
     }
     else {
      $response['status'] = 'ERROR';
      $response['message'] = $validator->messages();
     }

  return Response::json($response);
 }

 public function showUser($id)
 {
  $user = User::find($id);

  if ($user) {
   $response['status'] = 'OK';
   $response['result'] = $user;
  } else {
   $response['status'] = 'ERROR';
   $response['message'] = 'User not found';
  }

  return Response::json($response);
 }
}

Kemudian testing dengan Postman masukan url seperti pada gambar dibawah dan dengan method GET, jangan lupa untuk mengganti "http://localhost:2305/BLOG/" sesuaikan dengan url lokal komputer anda,


Sehingga saat di Send hasilnya akan tampak seperti ini,



===DONE!===