<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Rizal Fauzi Wahyu on Medium]]></title>
        <description><![CDATA[Stories by Rizal Fauzi Wahyu on Medium]]></description>
        <link>https://medium.com/@rizael.ichigo28?source=rss-3003f895a714------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*ElJYb3ypR_4ikk-nge5ENg.jpeg</url>
            <title>Stories by Rizal Fauzi Wahyu on Medium</title>
            <link>https://medium.com/@rizael.ichigo28?source=rss-3003f895a714------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 16 May 2026 17:23:30 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@rizael.ichigo28/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Proses dibalik V8Engine Javascript | Javascript Foundation #2]]></title>
            <link>https://medium.com/@rizael.ichigo28/proses-dibalik-v8engine-javascript-javascript-foundation-2-2819f19cf53a?source=rss-3003f895a714------2</link>
            <guid isPermaLink="false">https://medium.com/p/2819f19cf53a</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[javascript-engine]]></category>
            <category><![CDATA[v8-engine]]></category>
            <category><![CDATA[abstract-syntax-tree]]></category>
            <dc:creator><![CDATA[Rizal Fauzi Wahyu]]></dc:creator>
            <pubDate>Sat, 14 Jan 2023 22:47:08 GMT</pubDate>
            <atom:updated>2023-01-14T22:47:08.977Z</atom:updated>
            <content:encoded><![CDATA[<p>Proses dibalik V8Engine Javascript | Javascript Foundation #2</p><p>Mari kita bicara sedikit tentang <em>Javascript Engine</em>, seperti yang telah kita ketahui bahwa Javascript berjalan diatas sebuah Engine. Kurang lebih seperti pada gambar di bawah ini:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/869/1*R41SKsway4Eu1gtOCwg2IA.png" /><figcaption>Gambaran Javascript Engine</figcaption></figure><p>Skrip JS yang kita tulis diproses oleh<em> Javascript Engine</em> dan diterjemahkan ke dalam bahasa <em>binary</em> yang dimengerti prosesor komputer.</p><p>Apa yang terjadi di dalam mesin Javascript tersebut ? Nah, ini adalah salah satu bagian yang sedikit rumit, seperti yang kita tahu bahwa siapapun dapat membuat sebuah Engine, Ya termasuk kamu juga bisa membuat sebuah Engine, akan tetapi itu membutuhkan banyak sekali sumber daya dan waktu untuk dapat membuatnya, dan pada akhirnya itu hanyalah sebuah program.</p><p>Dan V8 Engine yang paling populer dan paling umum digunakan mengatakan bahwa mesin V8 merupakan mesin tercepat saat ini yang berjalan di browser Chrome.</p><p>Mesin ini, V8 Engine ditulis menggunakan bahasa C++, sebuah bahasa pemrograman tingkat rendah (low level programming). Tapi mari kita lihat apa yang sebenarnya terjadi di dalam Engine ini. Perhatikan Gambar dibawah ini :</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/931/1*WSssarnZQquwIvSdPkAXaQ.png" /><figcaption>Proses didalam Engine Javascript V8</figcaption></figure><p>Pertama, Script JS diproses dalam sesuatu yang disebut dengan analisis leksikal, yaitu proses memecah code dan menjadikannya sesuatu yang disebut token untuk mengidentifikasi artinya sehingga kita tahu apa yang sebenernya mau dilakukan oleh code tersebut. Token ini menjadi apa yang kita sebut sebagai AST (Abstract Syntax Tree). Jadi pertama kita Parser Code mengurainya dan mencari tahu bagaimana teks tersebut dibagi berdasarkan keyboard dari Javascript, dan dibentuk menjadi struktur seperti pohon yang disebut AST.</p><p>Dan ada sebuah Tools yang menyenangkan untuk membantu kita memahami dan mendemonstrasikan proses ini jika kita membuka website <a href="https://astexplorer.net">https://astexplorer.net</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*RnmUUVeo_i-G6aoCy5f2Jw.png" /><figcaption>astexprorer.net</figcaption></figure><p>Dalam contoh sederhana diaatas, kita dapat mengetahui bentuk dari AST dari Script JS tersebut.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/566/1*pplQmqKO-qFOiF9hHXJC-Q.png" /><figcaption>AST (Abstract Syntax Tree)</figcaption></figure><p>Dari gambar diatas, mari kita lihat dibagian Body, terdapat pembagian dari setiap code nya, mulai dari Variable Declaration dimana didalamnya terdapat berbagai property kemudian ada FunctionDeclaration yang semua itu membentuk susunan Pohon (Tree).</p><p>Setelah mecapai proses AST kemudian proses selanjutnya menuju Interpreter, Profiler, Compiler dan menghasilkan kode yang dapat dimengerti oleh CPU.</p><p>Mari kita buat sebuah Mesin sederhana seperti ini.</p><pre>// Javascript Engine<br>function jsengine(code) {<br>  return code.split(/\s+/)<br>}<br><br>jsengine(&#39;var a = 5&#39;)<br><br>// Output<br>[ &#39;var&#39;, &#39;a&#39;, &#39;=&#39;, &#39;5&#39;]</pre><p>Lihat! kita telah membuat Engine yang super duper sederhana yang dapat membantu kita untuk sedikit memahami proses penguraian code dan cara sebuah Engine bekerja.</p><p>Tapi memang begitulah cara kerjanya, pertama kita berikan code yang baru saja di stringify, kemudian kita mencoba untuk memecahnya kedalam beberapa bagian, kemudian hasil dari proses memecah ini, apapun kata kunci variabel yang muncul setelahnya adalah variabel yang akan kita tetapkan dan seterusnya dan seterusnya.</p><p>Dan kalian akan menyadari bahwa akan ada masalah terjadi. Lanjut di Javascript Foundation #3.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2819f19cf53a" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[V8 Engine Javascript Single Thread Language | Javascript Foundation #1]]></title>
            <link>https://medium.com/@rizael.ichigo28/v8-engine-javascript-single-thread-language-a42e0a5f3268?source=rss-3003f895a714------2</link>
            <guid isPermaLink="false">https://medium.com/p/a42e0a5f3268</guid>
            <category><![CDATA[javascript-development]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[javascript-tips]]></category>
            <category><![CDATA[single-threaded-execution]]></category>
            <category><![CDATA[javascript-call-stack]]></category>
            <dc:creator><![CDATA[Rizal Fauzi Wahyu]]></dc:creator>
            <pubDate>Wed, 28 Dec 2022 13:12:54 GMT</pubDate>
            <atom:updated>2023-01-14T22:48:35.374Z</atom:updated>
            <content:encoded><![CDATA[<p>Seperti yang telah kita pelajari tentang bahasa pemrograman yang sekarang sedang marak digunakan pada modern website. Kalian mungkin sudah tidak asing dengan istilah <strong>Single Thread Languange</strong> dan kalian mungkin juga mengetahui bahwa Javascript juga dikenal sebagai <strong>Interpreted Language</strong> saat mempelajarinya.</p><p>Bagaimana mekanisme <strong>Single Thread</strong> ? dan Apa yang membuat bahasa Javascript begitu powerfull ?</p><p>Javascript berjalan pada V8 Engine yang memiliki <strong>Memory Heap</strong> dan <strong>Callstack</strong>.</p><p>Javascript juga merupakan <strong>Single Thread</strong> yang berarti hanya satu statement yang dieksekusi dalam satu waktu.</p><p>Sebelum pelajari lebih dalam tentang <strong>Single Thread</strong>, saya akan menjelaskan dengan terminolgi se-simple mungkin untuk membantu pemahaman teman-teman sekalian.</p><p>Untuk dapat mengerti tentang <strong>Single Thread</strong>, teman-teman harus mengerti terlebih dahulu tentang konsep <strong>Data Structure</strong> yang disebut dengan <strong>Stack</strong>.</p><p>Saya akan menjelaskan sedikit tentang konsep dari <strong>Stack</strong>, sekarang saya asumsikan kalian memiliki setumpuk buku, kamu hanya dapat membaca judul buku yang paling atas dari tumpukan buku tersebut. Katakanlah buku teratas tersebut berjudul “40”, selanjutnya ketika kita ingin menambah satu buku lagi dengan judul “50” pada tumpukan buku tersebut. Maka yang terjadi akan tampak seperti pada gambar dibawah.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/595/1*yQkLltetdk8HtVXVjE6hjA.png" /><figcaption>Ilustrasi Tumpukan Buku di dalam Stack</figcaption></figure><p>Sekarang bayangkan jika kita ingin mengambil buku dengan judul “10”, kita harus menunggu buku dengan judul “40”, “30” dan “20” sudah diambil dari tumpukan buku tersebut. Jika hanya ada beberapa tumpuk mungkin tidak masalah sedikit menunggu untuk mengambil buku yang berada diposisi paling bawah <strong>Stack</strong>, akan tetapi jika tumpukan buku tersebut mencapai ribuan bahkan ratusan ribu, tentu akan membutuhkan waktu yang sangat lama dan inilah yang menjadi masalah.</p><p>Sebagai contoh sederhana pada penerapannya, katakanlah kita menulis beberapa kode seperti dibawah ini :</p><pre>const one() =&gt; {<br>  const two() =&gt; {<br>    console.log(&#39;5&#39;);<br>  }<br>  two();<br>}</pre><p>Yang terjadi pada <strong>Stack</strong> akan seperti ini :</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/335/1*KchpIjSsvTjd-cmnUsEf6Q.png" /></figure><p><strong>CallStack</strong> akan mengerjakan tugasnya dari urutan paling atas, seperti pada prinsip <strong>LIFO (Last In First Out)</strong>, apapun yang terjadi urutan paling atas pada Stack akan dikerjakan terlebih dahulu. Pada program diatas fungsi dijalankan secara berurutan.</p><p>Mari kita perhatikan code dibawah ini :</p><pre>const one() {<br>      console.log(&quot;Hello&quot;);<br>}<br>const two () {<br>    for(i=0; i&lt;= 100000000000000000000000; i++){<br>        // do some heavy stuff<br>    }<br>}<br>const three(){<br>       console.log(&quot;World&quot;);<br>}<br>one();<br>two();<br>three();</pre><p>Dari code diatas, bagaimana jika pada fungsi two() melakukan tugas yang amat berat dan berulang-ulang dengan jumlah pengulangan yang sangat banyak sekali ? Apakah artinya fungsi three() harus menunggu sampai fungsi two() selesai ? Secara teknis, Ya. Hal ini akan menjadi masalah pada proyek nyata dimana kita pengguna mungkin tidak dapat menunggu sampai proses tersebut selesai dijalankan.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/399/1*4urg6Z9_sLgAEPz-aBK_Cg.png" /><figcaption>Waktu yang diperlukan untuk menjalankan program Asynchronous sama dengan tugas yang paling memakan waktu karena dapat menjalankan tugasnya secara paralel dibandingkan dengan program Synchronous.</figcaption></figure><p>Asynchronous (atau async) merupakan metode eksekusi yang dapat berjalan dengan tidak sesuai urutan eksekusi pada kode program. Pada motode Async program tidak harus menunggu sampai sebuah tugas tersebut selesai dijalankan untuk dapat melanjutkan ke tugas selanjutnya. Pada bahasa pemrograman lainnya, masing-masing memiliki caranya sendiri untuk dapat menerapkan metode Async, salah satu cara paling populer adalah melalui Multi-threading.</p><p>Sebagai contoh, bahasa pemrograman Java menerapkan Multi-threading dengan cara membuat child thread yang dapat melakukan eksekusi kode program secara independen dan terpisah. Pada akhirnya child thread tersebut akan bergabung kembali pada parent thread saat proses eksekusi kode program telah selesai.</p><p>Sekarang mari kita lihat bagaimana Aynchronous ini diterapkan pada Javascript :</p><pre>console.log(&#39;1&#39;);<br>setTimeout(() =&gt; {<br>  console.log(&#39;2&#39;);<br>}, 3000);<br>console.log(&#39;3&#39;);</pre><p>Setelah menjalankan kode diatas, kamu akan melihat output ‘1’, ‘3’, kemudian setelah beberapa saat akan muncul output ‘2’. Mengapa ini bisa terjadi ? Singkatnya implementasi Asynchronous pada javascript dilakukan menggunakan callstack, callback queue, web api dan event loop.</p><p>V8 Engine akan mengecek apakah call stack kosong, jika ternyata kosong maka engine akan melakukan cek pada callback queue di dalam instruksi setTimeout. Antrian callback memanggil kembali instruksi code untuk kemudian dieksekusi.</p><p>Manfaat dari prosedur ini adalah JavaScript tidak perlu khawatir tentang berapa banyak core atau node yang dijalankan oleh CPU. Hanya ada satu callstack untuk implementasi ini.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a42e0a5f3268" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Berkenalan dengan NodeJs dan Express]]></title>
            <link>https://medium.com/@rizael.ichigo28/berkenalan-dengan-nodejs-dan-express-2476467e292e?source=rss-3003f895a714------2</link>
            <guid isPermaLink="false">https://medium.com/p/2476467e292e</guid>
            <dc:creator><![CDATA[Rizal Fauzi Wahyu]]></dc:creator>
            <pubDate>Wed, 30 Jan 2019 05:21:05 GMT</pubDate>
            <atom:updated>2019-07-19T14:46:36.124Z</atom:updated>
            <content:encoded><![CDATA[<h3>Node.js Express Tutorial For Beginners From Scratch 2019</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/0*sicz0rK0K7KvtDlY.jpg" /></figure><p>Apa itu NodeJs ? adalah aplikasi web server berbasis bahasa pemrograman javascript. Sama dengan peran php, nodejs dapat digunakan untuk memproses konten dan transaksi dinamis yang dikirimkan oleh browser, aplikasi mobile, dll. NodeJs biasanya digunakan untuk membangun aplikasi RESTful API.</p><p>Beberapa website seperti Trello, Paypal, Netflix, Linkedin, Medium, Uber telah menggunakan NodeJs sebagai aplikasi webservernya. Karena NodeJS merupakan bahasa pemrograman berbasis javascript maka jika kita sebelumnya telah menguasai javascript, belajar nodejs akan terasa jauh lebih mudah.</p><p>NodeJs menggunakan prinsip non-bloking I/O yang artinya tidak menunggu sampai sebuah request selesai terlebih dahulu untuk menangani request berikutnya, hal ini membuat nodejs dapat menerima relatif lebih banyak request dan lebih cepat daripada teknologi webserver lainnya. Oleh karena itu nodejs mudah untuk diperbesar kapasitasnya atau biasa disebut scale-up.</p><p>NodeJs sendiri cocok digunakan untuk membangun aplikasi realtime seperti aplikasi chat, IOT dll. NodeJs memiliki library yang cukup lengkap dan komunitas yang besar sehingga mudah untuk mendapatkan open sourcenya. NodeJs ini sangat cocok digunakan untuk membangun API berbasis REST yang dapat dikonsumsi oleh berbagai aplikasi lainnya.</p><p>Sama seperti php yang memiliki banyak framework yang dapat digunakan seperti Laravel, Codeigniter dll. NodeJs juga memiliki framework, salah satu diantaranya yang cukup populer yaitu Express. Pada artikel kali ini saya akan mengajak kalian untuk lebih dekat lagi dengan nodejs dan express, melalui studi kasus bagaimana memulai sebuah proyek dengan express.</p><h4>Prasyarat</h4><p>Sebelum kalian lanjut ke studi kasus, ada beberapa hal yang perlu kalian ketahui :</p><ul><li>Dasar HTML/CSS/Javascript</li><li>JSON</li><li>Konsep dasar bahasa pemrograman seperti variael, array, perulangan dll.</li></ul><h4>Install NodeJs</h4><p>Pastikan kalian telah menginstall nodejs ke pc kalian masing-masing. Silahkan pergi ke website resmi <a href="https://nodejs.org/en/">nodejs</a> dan download NodeJs versi LTS, atau bagi kalian yang menggunakan OS Linux khusunya Ubuntu kalian bisa mengikuti tutorial nya <a href="https://www.digitalocean.com/community/tutorials/how-to-install-node-js-on-ubuntu-18-04">disini</a>.</p><p>Apabila sudah terinstall jangan lupa cek versi node dan npm kalian</p><pre>node -v &amp;&amp; npm -v</pre><h4>Memulai Proyek</h4><p>Kita mulai proyek nodejs kita dengan membuat sebuah direktori baru dengan nama first-project yang nantinya berisi source code nodejs kita:</p><pre>$ mkdir first-project<br>$ cd first-project/</pre><p>setelah kita membuat direktori, masuk ke direktori yang telah dibuat tadi dan menginisialisasi project kita dengan perintah :</p><pre>$ npm init</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/642/1*7YX7vhGqtc1_AnXwjSBB8A.png" /></figure><p>setelah kita menginisialisasi proyek node kita, akan ada file package.json didalam direktori proyek kita.</p><h4>Install Express kedalam Proyek</h4><p>untuk menginstall express ke dalam proyek kita, ketikkan perintah dibawah ini :</p><pre>$ npm install express --save</pre><p>setelah kita berhasil menginstall express maka didalam direktori proyek kita akan terdapat file package-lock.json dan direktori node_modules. Jika kita melihat direktori node_modules disana terdapat direktori express yang merupakan framework yang kita install tadi.</p><h4>Hello World</h4><p>Untuk membuat program hello world dengan express, buat file index.js di dalam direktori proyek kita :</p><pre>$ touch index.js</pre><p>lalu ketikkan baris kode berikut ke dalam file index.js yang telah kita buat :</p><pre>const express = require(&#39;express&#39;)<br>const app = express()</pre><pre>app.get(&#39;/&#39;, (req, res, next) =&gt; {<br>    res.send(&#39;Hello World&#39;)<br>})<br>app.listen(3000) // 3000, 5000, 8000, 8080</pre><p>save dan jalankan script yang telah kita buat dengan perintah :</p><pre>$ node index.js</pre><p>lalu pergi ke browser dan ketikkan di url <a href="http://localhost:3000">http://localhost:3000</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/377/1*SWSYRBlHU7lDCC_mIP5y4g.png" /></figure><p>kita telah berhasil membuat program hello world dengan nodejs dan express.</p><h3>Responses</h3><p>Setelah kita berhasil membuat proyek hello world yang sangat sederhana, selanjut nya mari kita belajar mengenai response handler pada express. Untuk membuat response caranya cukup mudah, buka kembali file index.js dan tambahkan baris kode sehingga menjadi seperti berikut ini :</p><pre>const express = require(&#39;express&#39;)<br>const app = express()</pre><pre>app.get(&#39;/&#39;, (req, res, next) =&gt; {<br>    res.send(&#39;Hello World&#39;)<br>})</pre><pre>app.get(&#39;/json&#39;, (req, res, next) =&gt; {<br>    const data = {<br>        greeting: &#39;hallo nama saya fauzi, saya adalah backend developer&#39;<br>    }<br>    res.json({<br>        confirmation: &#39;success&#39;,<br>        data: data<br>    })<br>})</pre><pre>app.listen(3000)</pre><p>simpan dan jalankan script index.js nya dengan perintah node index.js kemudian pergi ke browser dan buka url http://localhost:3000/json</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/685/1*c0BizC07iBuY6XII8swWaw.png" /></figure><h3>View Engine</h3><p>Selanjutnya mari kita belajar tentang view engine, dimana nanti nya kita akan merender konten html, jadi yang akan kita lakukan adalah membuat sebuah template html dan merender halaman html yang telah kita buat nantinya, inilah yang dinamakan template engine, kita dapat meng inject suatu data untuk ditampilkan secara dinamis di halaman html tersebut.</p><p>Pertama mari kita buat direktori untuk views di dalam project kita</p><pre>$ mkdir views<br>$ cd views<br>$ touch home.mustache</pre><p>disini kita akan menggunakan template engine .mustache, selain mustache masih banyak template engine yang dapat digunakan seperti pug, jade dll. Setelah kita membuat file home.mustache kita akan membuat tag dasar html di dalam file tersebut.</p><pre>&lt;html&gt;<br>&lt;head&gt;<br>&lt;/head&gt;<br>&lt;body&gt;<br>    &lt;h1&gt; This is the home page! &lt;/h1&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;</pre><p>simpan file home.mustache tersebut, dan mari kita atur views direktorinya supaya express dapat mengenali direktori beserta template engine yang kita gunakan, dalam hal ini kita menggunakan mustache.</p><p>kita akan menginstall template engine</p><pre>$ npm install hjs --save<br>$ npm install hogan-middleware --save</pre><p>buka file index.js dalam direktori proyek kita lalu tambahkan baris kode sehingga menjadi seperti berikut ini:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/635/1*vORtMCFBUEuxLLR0g9e8IQ.png" /></figure><p>simpan file index.js , kemudian jalankan express nya dengan perintah node index.js , kemudian pergi ke browser dan buka url <a href="http://localhost:3000/home">http://localhost:3000/home</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/684/1*KWzV3AxmEpIta5kKq2THiQ.png" /></figure><h3>Static Assets</h3><p>Setelah kita berhasil merender template engine yang telah kita buat pada step sebelumnya, maka kali ini kita akan melanjutkannya dengan menambahkan asset asset seperti css, img dll.</p><p>Kita buat direktori public di dalam direktori proyek kita, yang nantinya direktori public ini digunakan untuk menyimpan asset pada web yang kita buat.</p><pre>$ mkdir public<br>$ cd public/<br>$ mkdir css img js</pre><p>setelah membuat direktori untuk static asset, selanjutya kita daftarkan direktori public yang kita buat tadi di file index.js supaya nanti direktori public dapat dikenali oleh express, tambahkan baris kode berikut ke dalam file index.js</p><pre>app.use(express.static(path.join(__dirname, &#39;public&#39;)))</pre><p>setelah itu kita download gambar di google kemudian kita taruh pada direktori public/img , setelah itu kita edit file home.mustache pada direktori views</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/634/1*EPBbTgRg9h3-oRPmQgv0gA.png" /></figure><p>simpan, kemudian jalankan express nya dengan menggunakan perintah node index , lalu buka browser dan ketikkan pada url <a href="http://localhost:3000/home">http://localhost:3000/home</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/682/1*Seq1ASmfQJx5LxlxzakDHQ.png" /></figure><p>Sekian sedikit perkenalan tentang NodeJs dan Express, pada tutorial selanjutnya saya akan membahas tentang express generator yang akan mempermudah kita untuk membuat proyek baru dengan express. Jangan lupa saran kritik yang membangun untuks saya supaya kedepannya dapat menulis tutorial tutorial dengan lebih baik lagi. Selamat mencoba dan semoga berhasil.</p><p>Referensi:</p><ul><li><a href="https://www.youtube.com/watch?v=xVMoctB_1Rw">https://www.youtube.com/watch?v=xVMoctB_1Rw</a></li><li><a href="https://www.udemy.com/intro-to-node-js-express/">https://www.udemy.com/intro-to-node-js-express/</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2476467e292e" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Cara membuat sistem log Laravel 5.7]]></title>
            <link>https://medium.com/@rizael.ichigo28/cara-membuat-sistem-log-laravel-5-7-2f86eae6b9cb?source=rss-3003f895a714------2</link>
            <guid isPermaLink="false">https://medium.com/p/2f86eae6b9cb</guid>
            <dc:creator><![CDATA[Rizal Fauzi Wahyu]]></dc:creator>
            <pubDate>Tue, 15 Jan 2019 04:34:09 GMT</pubDate>
            <atom:updated>2019-01-15T04:34:09.824Z</atom:updated>
            <content:encoded><![CDATA[<p><em>Referensi : </em><a href="https://medium.com/@SlyFireFox/laravel-how-to-make-incident-logs-d7fa88e48490"><em>https://medium.com/@SlyFireFox/laravel-how-to-make-incident-logs-d7fa88e48490</em></a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/750/0*y4vEJ4Enhzpt7ouX" /></figure><p>Mencatat log data yang penting tentu tidaklah mudah, mencatat data penting dan membuatnya dapat diakses tentunya lebih sulit lagi. Kita bisanya hanya mencatat log exception thrown karena sering melihat permasalahnya pada saat routing, padahal sebenarnya kita perlu melihat seluruh riwayat log selama terjadinya request.</p><p>Bayangkan skenario ini, pelanggan sedang mengakses website milik anda dan mereka mencoba untuk melakukan sesuatu dan hanya menerima 500 internal server error. Tidak ada konteks yang jelas pada halaman itu dan tidak ada yang dapat membantu pelanggan untuk mengatasi isu yang terjadi, tentu saja hal ini menyebabkan pelanggan anda merasa kebingungan dalam menjelaskan apa yang ia alami kepada contact support anda untuk mendapatkan jawaban.</p><p>Sebaiknya yang harus kita lakukan adalah menyediakan pelanggan kita sebuah error code yang menjadi point penting dalam error tersebut, sehingga nantinya tim support kita akan memberikan error code tersebut kepada developer untuk disamakan dengan data log yang telah tercatat di dalam sistem, hal ini juga akan mempercepat developer untuk menganalisa error berdasarkan error code yang diberikan.</p><h4>Mengatur pesan log pada event listener</h4><p>Pertama kita perlu mengumpulkan semua pesan log yang telah dibuat secara default oleh Laravel. Laravel logging sistem juga sudah menangani masalah pengiriman pesan log, jadi kita hanya tinggal membuat listerner untuk itu. Kita dapat membuat listener dengan perintah artisan :</p><pre>php artisan make:listener LoggingListener -e Illuminate\Log\Events\MessageLogged</pre><p>Listener yang telah kita buat akan terletak pada direktori App\Listeners, kemudian kita edit listener yang telah kita buat menjadi seperti di bawah ini, kita juga menambahkan sebuah collection yang nantinya akan kita kirim ke MessageLogged events untuk nantinya digunakan apabila terjadi fatal exception.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/6748ce7acbcbaec7c5e4a81d85f2c156/href">https://medium.com/media/6748ce7acbcbaec7c5e4a81d85f2c156/href</a></iframe><p>Kita juga perlu memodifikasi EventServiceProvider dan menambahkan MessageLogged kedalam properti listen untuk memastikan bahwa events akan dikirimkan kepada LoggingListener yang telah kita buat.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/e67834b1038bfba2a45cca6e3fe911e5/href">https://medium.com/media/e67834b1038bfba2a45cca6e3fe911e5/href</a></iframe><p>Kita juga perlu membuat listener menjadi singleton agar dapat mengakses event yang telah dikumpulkan di MessageLogged, untuk itu kita hanya perlu menulisakan satu baris ini di dalam method register.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/8f83e22e5973dcf0438681f605a22bf1/href">https://medium.com/media/8f83e22e5973dcf0438681f605a22bf1/href</a></iframe><h4>Memodifikasi exception handler</h4><p>Untuk melaporkan exception dengan log dan output berupa error code kepada pengguna, kita perlu memodifikasi exception handler, yang dapat ditemukan ti app/Exception/Handler.php yang mana secara default terdapat dua method yaitu report dan render, untuk lebih jelasnya mengenai exception handler klik <a href="https://medium.com/@rizael.ichigo28/exception-and-error-handler-laravel-5-7-6df4b62a9740">disini</a>.</p><p>Kita tidak akan merubah method render tetapi kita akan mengubah prosesnya dengan cara overriding method renderHttpException ke class parent nya.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/6a0befd930340eb46bf07f8c785cecc4/href">https://medium.com/media/6a0befd930340eb46bf07f8c785cecc4/href</a></iframe><p>Kalian dapat melihat bahwa pada method report terdapat mekanisme simpel untuk mengirim data log ke local disk sebagah file json.</p><h4>Menambahkan halaman error untuk menampilkan error code</h4><pre>@extends(&#39;errors::layout&#39;) <br>@section(&#39;title&#39;, &#39;Error&#39;) <br>@section(&#39;message&#39;, &#39;Whoops, looks like something went wrong.&#39;.(isset($incidentCode) ? &#39; Please contact support with incident code: &#39;.$incidentCode : &#39;&#39;))</pre><p>Maka seharunya error akan terlihat seperti dibawah ini :</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*tvbu96BUnPlfqg8PH1a5RA.png" /></figure><p>Jangan lupa untuk mengatur APP_DEBUG=true menjadi APP_DEBUG=false di file .env kamu.</p><h4>Tes Sederhana</h4><p>Ini adalah route simple yang dapat kamu tambahkan di routes/web.php yang nantinya akan mengenerate logs error ke storage/app/incident/ pada project kamu</p><pre>Route::get(&#39;/error-test&#39;, function() {          <br>   Log::info(&#39;calling the error route&#39;);<br>   throw new \Exception(&#39;something unexpected broke&#39;);<br>});</pre><p>Kalian dapat melihat kode program project ini secara penuh di bawah ini :</p><p><a href="https://gitlab.com/danton27/laravel-factory-exceptions-handler-and-implement-last-seen.git">Muhammad Rizal Fauzi Wahyu Putra / Laravel Factory Exceptions Handler and Implement Last Seen</a></p><p>Sekian pembelajaran kita hari ini, mohon saran dan kritiknya yang membangun serta mohon maaf apabila terdapat kesalahan, selamat mencoba dan semoga berhasil :).</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2f86eae6b9cb" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Middleware : Implementing Last Seen / Last Visited Laravel 5.7]]></title>
            <link>https://medium.com/@rizael.ichigo28/middleware-implementing-last-seen-last-visited-laravel-5-7-c3758ec0e5cd?source=rss-3003f895a714------2</link>
            <guid isPermaLink="false">https://medium.com/p/c3758ec0e5cd</guid>
            <dc:creator><![CDATA[Rizal Fauzi Wahyu]]></dc:creator>
            <pubDate>Mon, 14 Jan 2019 08:00:08 GMT</pubDate>
            <atom:updated>2019-01-14T08:00:08.759Z</atom:updated>
            <content:encoded><![CDATA[<h3>Middleware : Implementing Last Seen / Last Visited Laravel 5.7</h3><p><em>Referensi : </em><a href="https://medium.com/@grmcameron/implementing-last-visited-last-seen-in-laravel-237dbbed9027"><em>https://medium.com/@grmcameron/implementing-last-visited-last-seen-in-laravel-237dbbed9027</em></a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*58XXNH_r3PT-lYCy.jpg" /></figure><p>Fitur Last Seen / Last Visited biasanya sering digunakan ketika kita ingin mengetahui kapan user terakhir kali mengunjungi laman kita, mengetahui user yang sudah lama tidak aktif dan masih banyak lagi kegunaan dari fitur last seen ini.</p><h4>Step 1. Membuat Middleware</h4><p>Untuk memulai mengimplementasikan fitur ini, kita perlu membuat middleware baru yang nantinya akan merekam waktu terakhir request ke web. Kita dapat membuat middleware dengan menggunakan perintah artisan :</p><pre>php artisan make:middleware LastSeen</pre><h4>Step 2. Mendaftarkan middleware ke dalam kernel</h4><p>Di dalam App\Http\Kernel.php, tambahkan baris di bagian akhir dari middlewareGroup array untuk memastikan middlware kita berjalan setiap kali ada web request. Jika kalian ingin ini juga berjalan untuk setiap API request, tambahkan baris dibawah ini di dalam $middleware array</p><pre>\App\Http\Middleware\LastSeen::class,</pre><h4>Step 3. Membuat Migration</h4><p>Kita dapat menggunakan perintah artisan untuk membuat migration :</p><pre>php artisan make:migration addLastSeenToUser</pre><p>Sekarang edit migrationnya</p><pre>Schema::table(&#39;users&#39;, function (Blueprint $table) {</pre><pre>$table-&gt;dateTime(&#39;last_seen&#39;)-&gt;nullable();</pre><pre>});</pre><p>Setelah itu jalankan perintah untuk menambahkan colom yang telah dibuat di migration ke database</p><pre>php artisan migrate</pre><p>Sekarang kita sudah punya kolom untuk menginputkan data last seen, mari kita edit App\Http\Middleware\LastSeen.php dan tambahkan kode program berikut :</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/cae93f1673e82b82645016799a08013a/href">https://medium.com/media/cae93f1673e82b82645016799a08013a/href</a></iframe><p>Sekarang, untuk mengakses waktu dari last request yang mempresentasikan waktu terakhir mereka mengakses web kalian, caranya simpel sama seperti waktu kita mengambil properti dari variabel.</p><pre>$user-&gt;last_seen;</pre><p>Untuk melihat kode program secara penuh, silahkan klik tautan dibawah ini :</p><p><a href="https://gitlab.com/danton27/laravel-factory-exceptions-handler-and-implement-last-seen.git">Muhammad Rizal Fauzi Wahyu Putra / Laravel Factory Exceptions Handler and Implement Last Seen</a></p><p>Cukup sekian pembelajaran kita pada hari ini, apabila terdapat penjelasan yang membingungkan anda dapat mengunjungi referensi dibawah judul artikel, selamat mencoba dan semoga berhasil :)</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c3758ec0e5cd" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Exception and Error Handler Laravel 5.7]]></title>
            <link>https://medium.com/@rizael.ichigo28/exception-and-error-handler-laravel-5-7-6df4b62a9740?source=rss-3003f895a714------2</link>
            <guid isPermaLink="false">https://medium.com/p/6df4b62a9740</guid>
            <dc:creator><![CDATA[Rizal Fauzi Wahyu]]></dc:creator>
            <pubDate>Mon, 14 Jan 2019 06:08:12 GMT</pubDate>
            <atom:updated>2019-01-14T08:04:00.107Z</atom:updated>
            <content:encoded><![CDATA[<p><em>Referensi : </em><a href="https://laraveldaily.com/how-to-catch-handle-create-laravel-exceptions/"><em>https://laraveldaily.com/how-to-catch-handle-create-laravel-exceptions/</em></a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/899/0*ZZd8bwsSNoM3b-Rb.png" /></figure><p>Laravel exception merupakan salah satu cara bagi para developer web untuk menangani dan menanggapi pesan error yang terjadi, biasanya para developer kurang peduli mengenai hal ini dan ketika terdapat error, laravel menampilkan pesan defaultnya, bisa berupa error code atau yang lain. Tentu saja hal ini bisa membingungkan para pengunjung. Atas dasar inilah mari kita bersama sama belajar bagaimana caranya untuk menangani error dengan cara yang elegan dengan mempresentasikan informasi error yang dapat dipahami oleh pengunjung.</p><p>Pada artikel ini kita akan belajar membuat sebuah contoh membuat service kita sendiri dengan menggunakan Dependency Injection, dan menangani exceptionnya melalui service tersebut.</p><h4>Persiapan: User Search Task</h4><p>Jadi kita akan membuat contoh yang simpel yaitu sebuah form yang digunakan untuk mecari user berdasarkan ID.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/750/0*NeeEl6BZkXwCwu2G.png" /></figure><p>Kita akan membuat dua route di routes/web.php</p><pre>Route::get(&#39;/users&#39;, &#39;UserController@index&#39;)-&gt;name(&#39;users.index&#39;);<br>Route::post(&#39;/users/search&#39;, &#39;UserController@search&#39;)-&gt;name(&#39;users.search&#39;);</pre><p>dan kita buat controller UserController dengan perintah artisan :</p><pre>php artisan make:controller UserController</pre><p>dan buatlah dua method seperti berikut :</p><pre>class UserController extends Controller<br>{<br>    public function index()<br>    {<br>        return view(&#39;users.index&#39;);<br>    }<br><br>    public function search(Request $request)<br>    {<br>        $user = User::find($request-&gt;input(&#39;user_id&#39;));<br>        return view(&#39;users.search&#39;, compact(&#39;user&#39;));<br>    }<br>}</pre><p>Setelah itu, buat view nya pada direktori resources/views/users/index.blade.php</p><pre>&lt;form action=&quot;{{ route(&#39;users.search&#39;) }}&quot; method=&quot;POST&quot;&gt;<br>@csrf<br>&lt;div class=&quot;form-group&quot;&gt;<br>&lt;input id=&quot;user_id&quot; class=&quot;form-control&quot; name=&quot;user_id&quot; type=&quot;text&quot; value=&quot;{{ old(&#39;user_id&#39;) }}&quot; placeholder=&quot;User ID&quot;&gt;<br>&lt;/div&gt;<br>&lt;input class=&quot;btn btn-info&quot; type=&quot;submit&quot; value=&quot;Search&quot;&gt;<br>&lt;/form&gt;</pre><p>Jika kita mencari user berdasarkan ID nya dan itu ditemukan, maka kita akan melihat hasil seperti dibawah ini, tetapi sebelumnya kita buat dulu view nya di resources/views/users/search.blade.php :</p><pre>&lt;h3 class=&quot;page-title text-center&quot;&gt;User found: {{ $user-&gt;name }}&lt;/h3&gt;<br>&lt;b&gt;Email&lt;/b&gt;: {{ $user-&gt;email }}<br>&lt;br&gt;<br>&lt;b&gt;Registered on&lt;/b&gt;: {{ $user-&gt;created_at }}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/572/0*rdJzLOBaQL00YLqs.png" /></figure><p>Yup ini adalah skenario ideal kita, tetapi bagaimana jika user ID tidak ditemukan ?</p><h4>Exception Handling</h4><p>Mari kita keluar dari zona nyaman. Kita sebelumnya tidak mencari keberadaan user, tetapi kita hanya melakukan ini pada controller kita :</p><pre>$user = User::find($request-&gt;input(&#39;user_id&#39;));</pre><p>dan ketika user tidak ditemukan , kita akan melihat hal ini :</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/750/0*VWpyzKE41O9wT765.png" /></figure><p>atau bisa saja kita mengatur .env file dengan mengedit APP_DEBUG=false dan selanjutnya browser akan menampilkan halaman kosong yang bertuliskan <em>Whoops, look like something went wrong. </em>Tetapi itu tidak memberikan informasi yang dapat dimengerti oleh pengunjung kita. Cara lain untuk dapat dengan cepat menyelesaikan masalah ini adalah dengan menggunakan User::findOfFail() atau hanya find()- selanjutnya jika user tidak ditemukan, laravel akan memperlihatkan halaman error code 404, tetapi halaman default 404 tetap saja tidak memberikan informasi yang dapat membantu pengunjung kita.</p><p>Jadi kita perlu menangkap errornya dan memprosesnya yang kemudian akan kita kembalikan ke form dengan menampilkan pesan error yang dapat dimengerti.</p><p>Kita perlu tau tipe exception dan nama class yang akan kita return. Dalam kasus findOrFail() ini akan mengembalikan exception ModelNotFoundException, jadi kita perlu melakukan hal ini dalan UserController :</p><pre>public function search(Request $request)<br>{<br>    try {<br>        $user = User::findOrFail($request-&gt;input(&#39;user_id&#39;));<br>    } catch (ModelNotFoundException $exception) {<br>        return back()-&gt;withError($exception-&gt;getMessage())-&gt;withInput();<br>    }<br>    return view(&#39;users.search&#39;, compact(&#39;user&#39;));<br>}</pre><p>Untuk menampilkan pesan error, kita perlu menambahkan hal berikut pada index.blade.php</p><pre>@if (session(&#39;error&#39;))<br>&lt;div class=&quot;alert alert-danger&quot;&gt;{{ session(&#39;error&#39;) }}&lt;/div&gt;<br>@endif</pre><p>Hasilnya :</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/750/0*egWzXHuF19diQRNe.png" /></figure><p>kita telah berhasil menampilkan pesan error nya, tetapi tetap saja ini tidak bagus bukan ? Karena itu kita perlu menampilkan pesan dari kita sendiri :</p><pre>return back()-&gt;withError(&#39;User not found by ID &#39; . $request-&gt;input(&#39;user_id&#39;))-&gt;withInput();</pre><p>Selesai!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/750/0*T2xH2nWWmxgAzAWV.png" /></figure><h4>Memindahkan Error Message Handling ke Service</h4><p>Kita telah membuat contoh simple penanganan error message handling di controller. Pada kenyataanya seringkali hal ini akan lebih compleks oleh karena itu controller memanggil beberapa external service atau package method yang mana akan gagal dengan beberapa macam error yang berbeda. Oleh karena itu mari kita belajar untuk membuat sendiri service yang akan melakukan hal yang sama, tetapi akan throw exception, jadi kontroller bahkan tidak perlu tahu teks pesan error yang akan kita berikan.</p><p>Mari kita pindahkan Logic kita menuju app/Services/UserService.php:</p><pre>namespace App\Services;<br><br>use App\User;<br>use Illuminate\Database\Eloquent\ModelNotFoundException;<br><br>class UserService<br>{<br><br>    public function search($user_id)<br>    {<br>        $user = User::find($user_id);<br>        if (!$user) {<br>            throw new ModelNotFoundException(&#39;User not found by ID &#39; . $user_id);<br>        }<br>        return $user;<br>    }<br><br>}</pre><p>Dan pada kontroller, kita perlu memanggil service ini. Pertama, kita dapat meng inject service ini ke method __contruct() :</p><pre>use App\Services\UserService;<br><br>class UserController extends Controller<br>{<br><br>    private $userService;<br><br>    public function __construct(UserService $userService)<br>    {<br>        $this-&gt;userService = $userService;<br>    }<br><br>// ...</pre><p>Jika kalian kurang familiar dengan istilah dependency injection dan bagaimana Laravel IOC container bekerja, ini adalah <a href="https://laravel.com/docs/5.6/container#automatic-injection">dokumentasi resmi</a> atau <a href="http://slashnode.com/dependency-injection/">artikel yang bagus</a> tentang ini.</p><p>Sekarang, method search() kita akan terlihat seperti ini :</p><pre>public function search(Request $request)<br>{<br>    try {<br>        $user = $this-&gt;userService-&gt;search($request-&gt;input(&#39;user_id&#39;));<br>    } catch (ModelNotFoundException $exception) {<br>        return back()-&gt;withError($exception-&gt;getMessage())-&gt;withInput();<br>    }<br>    return view(&#39;users.search&#39;, compact(&#39;user&#39;));<br>}</pre><p>Perhatikan bahwasanya kita dapat menggunakan $exception-&gt;getMessage() lagi, dan semua error validasi atau pesan error akan terjadi di dalam service. Hal ini merupakan salah satu tujuannya, untuk membagi aksi, sehingga controller tidak harus melakukan aksi itu sendiri.</p><h4>Step Lanjutan : Membuat Exception Class kita sendiri</h4><p>Akan jauh lebih baik ketika service yang kita buat tadi throws exception nya sendiri yang terkait dengan error yang ditangani, dan dengan ini kita dapat menambahkan multiple exception tergantung pada error itu sendiri.<br>Kita dapat membuat exception dengan menggunakan perintah artisan :</p><pre>php artisan make:exception UserNotFoundException</pre><p>dan exception yang kita buat akan berada pada direktori app/Exception/UserNotFoundException.php</p><pre>namespace App\Exceptions;<br><br>use Exception;<br><br>class UserNotFoundException extends Exception<br>{<br>    //<br>}</pre><p>Mari kita tambahkan exception kita dengan beberapa logic. Terdapat dua methods pada class exception ini :</p><ul><li><strong>report()</strong> digunakan ketika kita ingin menambahkan log / mengirim error ke BugSnag, email, Slack dll.</li><li><strong>render()</strong> digunakan ketika kita ingin mengembalikan ke halaman sebelumnya dengan pesan error atau mengembalikan HTTP response (seperti blade file kita) secara langsung dari Exception class.</li></ul><p>Pada contoh kali ini , mari kita isi method report() kita :</p><pre>namespace App\Exceptions;<br><br>use Exception;<br><br>class UserNotFoundException extends Exception<br>{<br>    /**<br>     * Report or log an exception.<br>     *<br>     * @return void<br>     */<br>    public function report()<br>    {<br>        \Log::debug(&#39;User not found&#39;);<br>    }<br>}</pre><p>Pada akhirnya, beginilah proses kita memanggil exception yang kita buat tadi dari kontroller :</p><pre>public function search(Request $request)<br>{<br>    try {<br>        $user = $this-&gt;userService-&gt;search($request-&gt;input(&#39;user_id&#39;));<br>    } catch (UserNotFoundException $exception) {<br>        report($exception);<br>        return back()-&gt;withError($exception-&gt;getMessage())-&gt;withInput();<br>    }<br>    return view(&#39;users.search&#39;, compact(&#39;user&#39;));<br>}</pre><p>Kalian dapat melihat kode program secara penuh dibawah ini :</p><p><a href="https://gitlab.com/danton27/laravel-factory-exceptions-handler-and-implement-last-seen.git">Muhammad Rizal Fauzi Wahyu Putra / Laravel Factory Exceptions Handler and Implement Last Seen</a></p><p>Sekian belajar kita pada kesempatan kali ini, apabila kalian merasa bingung dengan penjelasan di atas anda dapat mengunjungi sumber aslinya yang tertera di bawah judul, selamat mencoba dan terimakasih :)</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6df4b62a9740" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Request Validation di Laravel 5.7]]></title>
            <link>https://medium.com/@rizael.ichigo28/request-validation-di-laravel-5-7-6c3ee5f7d411?source=rss-3003f895a714------2</link>
            <guid isPermaLink="false">https://medium.com/p/6c3ee5f7d411</guid>
            <dc:creator><![CDATA[Rizal Fauzi Wahyu]]></dc:creator>
            <pubDate>Mon, 14 Jan 2019 03:01:37 GMT</pubDate>
            <atom:updated>2019-01-14T03:01:37.435Z</atom:updated>
            <content:encoded><![CDATA[<p><em>Referensi : </em><a href="https://medium.com/@kamerk22/the-smart-way-to-handle-request-validation-in-laravel-5e8886279271"><em>https://medium.com/@kamerk22/the-smart-way-to-handle-request-validation-in-laravel-5e8886279271</em></a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*MUdkTWMoxs372BtPHpmx_A.jpeg" /><figcaption>“You become responsible, forever, for what you have tamed.” <br>― <strong>Antoine de Saint-Exupéry, </strong><a href="https://www.goodreads.com/work/quotes/2180358"><strong>The Little Prince</strong></a></figcaption></figure><p>Kebanyakan dari kita seringkali membuat sebuah validasi di dalam controller, itu memang merupakan salah satu cara bagi kita untuk melakukan validasi terhadap <em>request</em> yang masuk.</p><p>Membuat sebuah logika validasi di dalam kontroller akan menghilangkan prinsip tanggung jawab tunggal (<em>Single Responsibility Principle)</em>. Seperti yang kita ketahui request bisa saja mengalami perubahan dan pada saat itu juga validasi yang telah kita buat juga mengalami perubahan. Oleh karena itulah memiliki logika validasi dalam sebual class akan membuat kita sulit untuk mengaturnya, apalagi jika ada sangat banyak validasi yang kita buat dalam sebuah class tersebut.</p><p>Laravel mempunyai class Form Request yang digunakan untuk membuat class request secara terpisah. Untuk membuatnya gunakan perintah artisan :</p><pre>php artisan make:request ItemRequest</pre><p>Class ItemRequest yang telah kita buat akan berada pada direktori app/Http/Request/ItemRequest.php</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/cd3fcbcbe8867e31963e2d06c77bb38a/href">https://medium.com/media/cd3fcbcbe8867e31963e2d06c77bb38a/href</a></iframe><p>Laravel Form Request mempunyai dua default methods auth() dan rules() . Anda dapat membuat logika authrization di auth() dan kamu juga dapat membuat aturan validasi pada method rules(). Ada juga method tambahan message() untuk anda menuliskan sendiri pesan dari validasi yang telah anda buat.</p><p>Sekarang buat sebuah controller dengan nama ItemController dengan menggunakan perintah artisan :</p><pre>php artisan make:controller ItemController</pre><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/4dcf4dac9a123b4fce77530d029ba2cc/href">https://medium.com/media/4dcf4dac9a123b4fce77530d029ba2cc/href</a></iframe><p>Jadi, controller kita jadi terlihat lebih baik dan mudah untuk kita rawat (<em>easy to maintain</em>) dan kita tidak perlu lagi menulis logic dari validasi kita dalam controller karena kita telah memiliki class validasi tersendiri yang hanya bertanggung jawab atas satu validasi yang ia kerjakan.</p><p>Anda dapat melihat kode program secara penuh di bawah ini.</p><p><a href="https://gitlab.com/danton27/custom-form-validation-laravel5.7.git">Muhammad Rizal Fauzi Wahyu Putra / custom-form-validation-laravel5.7</a></p><p>Sekian dari saya selamat mencoba dan semoga anda memahami apa yang saya tulis, mohon saran dan kritiknya yang membangun, terimakasih :)</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6c3ee5f7d411" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Multiple Authentication Laravel 5.7]]></title>
            <link>https://medium.com/@rizael.ichigo28/multiple-authentication-laravel-5-7-47e42ef0579d?source=rss-3003f895a714------2</link>
            <guid isPermaLink="false">https://medium.com/p/47e42ef0579d</guid>
            <dc:creator><![CDATA[Rizal Fauzi Wahyu]]></dc:creator>
            <pubDate>Wed, 02 Jan 2019 23:31:18 GMT</pubDate>
            <atom:updated>2019-01-07T10:10:02.319Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/1*KV9Qexip9GtDmZ5sG90SSw.png" /></figure><p>Referensi : <a href="https://hdtuto.com/article/laravel-57-multiple-authentication-example">https://hdtuto.com/article/laravel-57-multiple-authentication-example</a></p><p>Ketika kita ingin membuat sebuah website yang membutuhkan users dan admin di dalam registernya dengan otentikasi yang berbeda, dan kita ingin membuatnya memiliki login yang berbeda dengan menggunakan model App\User sebagai basisnya, maka disaat inilah kita dapat menggunakan Multiple Authentication.</p><p>Setelah kita memahami kegunaan dari Multiple Authentication selanjutnya mari kita langsung terapkan saja dengan mengikuti step berikut, tetapi sebelumnya pastikan kalian sudah menginstall Laravel 5.7, kalian dapat melihat dokumentasi install Laravel 5.7 di link berikut :</p><p><a href="https://laravel.com/docs/5.7/installation">Installation - Laravel - The PHP Framework For Web Artisans</a></p><h4><strong>Step 1 . Membuat Migration untuk users dan admins</strong></h4><p>Pada tahap pertama ini , kita harus membuat dua tabel untuk user dan admin, secara default laravel sudah menyediakan migration dan model untuk tabel users , kita hanya perlu mengeditnya sedikit.</p><p><strong>User Migration :</strong></p><pre><em>&lt;?php<br><br>use </em>Illuminate\Support\Facades\Schema;<br><em>use </em>Illuminate\Database\Schema\Blueprint;<br><em>use </em>Illuminate\Database\Migrations\Migration;<br><br><em>class </em>CreateUsersTable <em>extends </em>Migration<br>{<em><br>    public function </em>up()<br>    {<br>        Schema::create(&#39;users&#39;, <em>function </em>(Blueprint $table) {<br>            $table-&gt;increments(&#39;id&#39;);<br>            $table-&gt;string(&#39;name&#39;);<br>            $table-&gt;string(&#39;email&#39;)-&gt;unique();<br>            $table-&gt;string(&#39;password&#39;);<br>            $table-&gt;rememberToken();<br>            $table-&gt;timestamps();<br>        });<br>    }</pre><pre><em>    public function </em>down()<br>    {<br>        Schema::dropIfExists(&#39;users&#39;);<br>    }<br>}</pre><p><strong>Admin Migration</strong></p><p>Untuk Admin Migration ini anda dapat membuat model sekaligus migration nya dengan cara berikut :</p><pre>php artisan make:model Admin -m</pre><p>maka secara otomatis laravel akan membuatkan model dan migration untuk admin. Kemudian edit admins migration seperti berikut :</p><pre><em>&lt;?php<br><br>use </em>Illuminate\Support\Facades\Schema;<br><em>use </em>Illuminate\Database\Schema\Blueprint;<br><em>use </em>Illuminate\Database\Migrations\Migration;<br><br><em>class </em>CreateAdminsTable <em>extends </em>Migration<br>{<em><br>    public function </em>up()<br>    {<br>        Schema::create(&#39;admins&#39;, <em>function </em>(Blueprint $table) {<br>            $table-&gt;increments(&#39;id&#39;);<br>            $table-&gt;string(&#39;name&#39;);<br>            $table-&gt;string(&#39;email&#39;)-&gt;unique();<br>            $table-&gt;string(&#39;password&#39;);<br>            $table-&gt;timestamps();<br>        });<br>    }<em><br>    public function </em>down()<br>    {<br>        Schema::dropIfExists(&#39;admins&#39;);<br>    }<br>}</pre><h4><strong>Step 2. Membuat Model User dan Admin</strong></h4><p>Karena kita sudah membuat model untuk admin dan user di step sebelumnya maka kita tinggal mengeditnya seperti berikut :</p><p><strong>app\User.php</strong></p><pre><em>&lt;?php<br><br>namespace </em>App;<br><br><em>use </em>Illuminate\Notifications\Notifiable;<br><em>use </em>Illuminate\Foundation\Auth\User <em>as </em>Authenticatable;<br><br><em>class </em>User <em>extends </em>Authenticatable<br>{<br>    <em>use </em>Notifiable;<br><em><br>    protected </em>$fillable = [<br>        &#39;name&#39;, &#39;email&#39;, &#39;password&#39;,<br>    ];<br><em><br>    protected </em>$hidden = [<br>        &#39;password&#39;, &#39;remember_token&#39;,<br>    ];<br>}</pre><p><strong>app/Admin.php</strong></p><pre><em>&lt;?php<br><br>namespace </em>App;<br><br><em>use </em>Illuminate\Database\Eloquent\Model;<br><em>use </em>Illuminate\Notifications\Notifiable;<br><em>use </em>Illuminate\Foundation\Auth\User <em>as </em>Authenticatable;<br><br><em>class </em>Admin <em>extends </em>Authenticatable<br>{<br>    <em>use </em>Notifiable;<br><br>    <em>protected </em>$fillable = [<br>        &#39;name&#39;,&#39;email&#39;,&#39;password&#39;,<br>    ];<br><br>    <em>protected </em>$hidden = [<br>      &#39;password&#39;,&#39;remember_token&#39;,<br>    ];<br><br>}</pre><h4><strong>Step 4: Konfigurasi Auth Config</strong></h4><p>Pada step ini kita akan menambahkan guard baru untuk admin di dalam file config/auth.php . Jadi buka file auth.php dan tambahkan menjadi seperti berikut:</p><pre><em>&lt;?php<br><br>return </em>[<em><br><br>    </em>&#39;defaults&#39; =&gt; [<br>        &#39;guard&#39; =&gt; &#39;web&#39;,<br>        &#39;passwords&#39; =&gt; &#39;users&#39;,<br>    ],<em><br><br>    </em>&#39;guards&#39; =&gt; [<br>        &#39;web&#39; =&gt; [<br>            &#39;driver&#39; =&gt; &#39;session&#39;,<br>            &#39;provider&#39; =&gt; &#39;users&#39;,<br>        ],<br><br>        &#39;api&#39; =&gt; [<br>            &#39;driver&#39; =&gt; &#39;token&#39;,<br>            &#39;provider&#39; =&gt; &#39;users&#39;,<br>        ],<br>        &#39;admin&#39; =&gt; [<br>            &#39;driver&#39; =&gt; &#39;session&#39;,<br>            &#39;provider&#39; =&gt; &#39;admins&#39;,<br>        ],<br>    ],<br><em><br>    </em>&#39;providers&#39; =&gt; [<br>        &#39;users&#39; =&gt; [<br>            &#39;driver&#39; =&gt; &#39;eloquent&#39;,<br>            &#39;model&#39; =&gt; App\User::<em>class</em>,<br>        ],<br><br>        &#39;admins&#39; =&gt; [<br>            &#39;driver&#39; =&gt; &#39;eloquent&#39;,<br>            &#39;model&#39; =&gt; App\Admin::<em>class</em>,<br>        ],<br>        <em>// &#39;users&#39; =&gt; [<br>        //     &#39;driver&#39; =&gt; &#39;database&#39;,<br>        //     &#39;table&#39; =&gt; &#39;users&#39;,<br>        // ],<br>    </em>],<em><br><br>    </em>&#39;passwords&#39; =&gt; [<br>        &#39;users&#39; =&gt; [<br>            &#39;provider&#39; =&gt; &#39;users&#39;,<br>            &#39;table&#39; =&gt; &#39;password_resets&#39;,<br>            &#39;expire&#39; =&gt; 60,<br>        ],<br>        &#39;admins&#39; =&gt; [<br>            &#39;provider&#39; =&gt; &#39;admins&#39;,<br>            &#39;table&#39; =&gt; &#39;password_reset&#39;,<br>            &#39;expire&#39; =&gt; 60,<br>        ],<br>    ],<br><br><br>];</pre><h4><strong>Step 5: Membuat Default Auth</strong></h4><p>Laravel 5.7 sudah menyediakan default auth, jadi kita tinggal membuatnya dengan command berikut :</p><pre>php artisan make:auth</pre><h4><strong>Step 6: Membuat Route</strong></h4><p>Pada step kali ini kita akan membuat route untuk user dan admin, jadi pertama tambahkan route di file web.php :</p><p><strong>routes/web.php</strong></p><pre><em>&lt;?php<br><br></em>Route::get(&#39;/&#39;, <em>function </em>() {<br>    <em>return </em>view(&#39;welcome&#39;);<br>});<br><br>Auth::routes();<br><br>Route::get(&#39;/home&#39;, &#39;HomeController@index&#39;)-&gt;name(&#39;home&#39;);</pre><pre>Route::get(&#39;/admin&#39;, <em>function</em>(){<br>    <em>return </em>view(&#39;admin&#39;);<br>})-&gt;name(&#39;adminpage&#39;);</pre><pre>Route::get(&#39;admin-login&#39;,&#39;Auth\AdminLoginController@showLoginForm&#39;);</pre><pre>Route::post(&#39;admin-login&#39;, [&#39;as&#39; =&gt; &#39;admin-login&#39;, &#39;uses&#39; =&gt; &#39;Auth\AdminLoginController@login&#39;]);</pre><pre>Route::get(&#39;admin-register&#39;,&#39;Auth\AdminLoginController@showRegisterPage&#39;);</pre><pre>Route::post(&#39;admin-register&#39;, &#39;Auth\AdminLoginController@register&#39;)-&gt;name(&#39;admin.register&#39;);</pre><h4><strong>Step 7: Membuat Controller</strong></h4><p>Pada step ini kita akan membuat controller untuk admin, kita bisa mengcopy file pada <strong>app/Http/Controller/Auth/LoginController.php </strong>dan mengpaste nya dengan nama AdminLoginController.php kemudian tambahkan kode seperti berikut :</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/84444566237dc98f09e3d25a70cd68c0/href">https://medium.com/media/84444566237dc98f09e3d25a70cd68c0/href</a></iframe><h4><strong>Step 8: Membuat Blade Files</strong></h4><p>Pada step ini kita akan membuat view untuk login admin, register admin, dan home untuk admin</p><p><strong>resource/views/auth/adminLogin.blade.php</strong></p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/911429ec2f20ca79410215e1189ac633/href">https://medium.com/media/911429ec2f20ca79410215e1189ac633/href</a></iframe><p><strong>resource/views/auth/adminregister.blade.php</strong></p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/23dbd4ca5bbdb39ace43c3eb47dce825/href">https://medium.com/media/23dbd4ca5bbdb39ace43c3eb47dce825/href</a></iframe><p><strong>resource/views/admin.blade.php</strong></p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/0c489b52aa4a84e662d5380ea6698a9f/href">https://medium.com/media/0c489b52aa4a84e662d5380ea6698a9f/href</a></iframe><p>Sekarang kalian bisa mengeceknya dengan mengetikkan di url localhost:8000/admin-register, setelah berhasil melakukan register silahkan login di url localhost:8000/admin-login</p><p>Semoga Berhasil :)</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=47e42ef0579d" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Gitflow Workflow]]></title>
            <link>https://medium.com/@rizael.ichigo28/gitflow-workflow-463645732a29?source=rss-3003f895a714------2</link>
            <guid isPermaLink="false">https://medium.com/p/463645732a29</guid>
            <dc:creator><![CDATA[Rizal Fauzi Wahyu]]></dc:creator>
            <pubDate>Wed, 02 Jan 2019 08:49:43 GMT</pubDate>
            <atom:updated>2019-01-02T08:49:43.230Z</atom:updated>
            <content:encoded><![CDATA[<p>Gitflow Workflow adalah sebuah fitur dari Git yang digunakan untuk keperluan desain alur kerja, yang dapat digunakan untuk mendefinisikan model percabangan alur kerja secara jelas dan efisien. Dengan menggunakan Gitflow dapat mempermudah dalam mengerjakan project yang besar di dalam sebuah tim, karena Gitflow memungkinkan kita untuk membuat kerangka kerja sehingga project yang kita kerjakan menjadi lebih efisien. Gitflow Workflow ini pertama kali diterbitkan oleh Vincent Driessen di nvie.</p><p>Gitflow cocok digunakan untuk project yang memiliki siklus rilis yang terjadwal, adanya <em>Feature Branch Workflow </em>memberikan peran yang sangat spesifik untuk <em>branch </em>yang berbeda dan menentukan bagaimana dan kapan mereka harus berinteraksi. Selain <em>Feature Branch Workflow</em> juga terdapat <em>Individual Branch </em>yang dapat digunakan untuk melakukan <em>prepare, maintaining, </em>dan <em>recording releases. </em>Tentu saja dengan memanfaatkan semua fitur yang ada pada gitflow ini akan membuat kolaborasi tim menjadi lebih efisien.</p><p><strong><em>Develop and Master Branches</em></strong></p><p>Didalam master <em>branch, workflow </em>menggunakan dua <em>branch </em>untuk merekan semua <em>history </em>dari sebuah proyek. Master <em>branch </em>digunakan untuk <em>official release history </em>dan develop <em>branch </em>digunakan untuk mengintegrasikan <em>branch </em>untuk <em>features</em>. Hal ini juga memungkinkan untuk kita memberikan tag pada semua commit dengan nomor versi.</p><p>Untuk menerapkan hal yang telah kita pelajari,pertama kita dapat dengan mudah membuat <em>branch </em>develop di lokal dan <em>push branch </em>develop tadi kedalam server.</p><p>#code</p><p>$ git branch develop</p><p>$ git push -u origin develop</p><p>Sekarang <em>branch </em>develop sudah ada di dalam proyek kita dan para developer akan <em>clone repository </em>dan membuat <em>tracking branch </em>untuk develop.</p><p>Ketika kita menggunakan git-flow <em>extension library</em>, ketikkan perintah : git flow init dan secara otomatis akan membuat <em>branch </em>develop.</p><p><strong><em>Feature Branches</em></strong></p><p>Setiap feature baru harus dibawah branch develop karena feature branch menggunakan develop sebagai parent nya. Ketika feature sudah selesai dikerjakan, selanjutnya di merge ke branch develop. Feature seharusnya tidak pernah berinteraksi secara langsung dengan branch master.</p><p><strong>Creating a feature branch</strong></p><p>Tampa menggunakan git-flow extension</p><p>$ git checkout develop</p><p>$ git checkout -b feature_branch</p><p>Ketika menggunakan git-flow extension</p><p>$ git flow feature start feature_branch</p><p>Selanjutnya lanjutkan menggunakan git seperti yang biasa kamu lakukan.</p><p><strong>Finishing a feature branch</strong></p><p>Ketika kamu telah selesai dengan development di dalam feature selanjutnya adalah dengan me merge feature_branch ke develop.</p><p>Tampa menggunakan git-flow extension</p><p>$ git checkout develop</p><p>$ git merge feature_branch</p><p>Dengan menggunakan git-flow extension</p><p>$ git flow feature finish feature_branch</p><p><strong>Release Branches</strong></p><p>Ketika develop sudah dirasa cukup feature untuk kemudian di rilis, kamu dapat melakaukan fork release branch dari develop. Dengan membuat branch release kita telah memulai siklus release, jadi feature baru dapat ditambahkan setelah perilisan , hanya fix bug, document generation dan beberapa yang berorientasi pada perilisan yang boleh dilakukan pada branch ini. Setelah siap untuk diluncurkan maka release branch di merge ke branch master dengan ditambahi tag dengan nomor versi.</p><p>Pererapan :</p><p>Tampa menggunakan git-flow extension</p><p>$ git checkout develop</p><p>$ git checkout -b release/0.1.0</p><p>Menggunakan git-flow extension</p><p>$git flow release start 0.1.0</p><p>Ketika release branch sudah selesai, gunakan metode dibawah ini :</p><p>Tampa menggunakan git-flow extension</p><p>$ git checkout develop</p><p>$ git merge release/0.1.0</p><p>Menggunakan git-flow extension</p><p>$ git chekout master</p><p>$git flow release finish ‘0.1.0’</p><p><strong>Hotfix Branches</strong></p><p>Hotfix branch tidak sama dengan release branch release dan feature karena branch itu berbasis pada branch develop sedangkan branch hotfix secara langsung berbasis pasa branch master. branch hotfix ini digunakan ketika pada saat proyek kita live dan terdapat error kita dapat langsung membenahinya dengan meng fork langsung branch masterk dan setelah perbaikan bug sudah selesai , branch hotfix ini di merge ke branch master dan branch develop dan setelah kedua branch tersebut di merge, hapus branch hotfix nya. Untuk menggunakan branch hotfix ini ikuti cara berikut :</p><p>Tampa menggunakan git-flow extension</p><p>$ git checkout master</p><p>$ git checkout -b hotfix_branch</p><p>Ketika menggunakan git-flow extension :</p><p>$git flow hotfix start hotfix_branch</p><p>Sama dengan finishing release branch, hotfix branch juga akan di merge ke branch master dan develop, caranya seperti berikut ini :</p><p>Tampa menggunakan git-flow extension</p><p>$git checkout master</p><p>$git merge hotfix_branch</p><p>$git checkout develop</p><p>$git merge hotfix_branch</p><p>$git branch -D hotfix_branch</p><p><strong>Kesimpulan</strong></p><p>Dari penjelasan diatas dapat kita simpulkan bahwasanya Gitflow Workflow ini merupakan desain kerangka kerja yang digunakan untuk mempermudah kerja tim dalam suatu proyek. Alur umum dari Gitfow adalah :</p><ol><li>Membuat develop branch dari master</li><li>Release branch dibuat dari develop</li><li>Feature branch dibuat dari develop</li><li>Ketika feature branch sudah selesai merge ke develop branch</li><li>Ketika release branch sudah selesai merge ke develop dan master</li><li>Ketika terdapat isu di branch master, hotfix branch dibuat dari master</li><li>Setelah hotfix sudah selesai merge ke branch develop dan master</li></ol><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=463645732a29" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>