How to use “Laravel facade” outside of Laravel

How to use “Laravel facade” outside of Laravel

I love Laravel facade. With Laravel facade the code be more beautiful and readable than traditional approach. But, what if you don’t use Laravel? How to use the “facade”?

For example, I want to use Laravel “File” facade inside of my application.

First, I need to install illuminate/filesystem via composer.

composer require illuminate/filesystem

Then, just load the composer autoloader and create a new class like this

<?php

require 'vendor/autoload.php';

use Illuminate\Filesystem\Filesystem;

class File
{
    public static function __callStatic($name, $args)
    {
        $self = new Filesystem;

        return $self->{$name}(...$args);
    }
}

Finally, we can use File:: like in Laravel.

File::allFiles('./');

File::get('somefile.txt');

UPDATE 23 Aug 2016 – illuminate/config

For example I have folder structure like this

\ - assets/
  - config/
     \ - database.php
       - site.php
       - mail.php

Inside of database.php, site.php, mail.php just simple array. Example of database.php

<?php

return [
    'hostname' => 'localhost',
    'username' => 'root',
    'password' => '',
    'database' => 'test',
];

Here’s the main file to load all configurations.

<?php

require 'vendor/autoload.php';

use Illuminate\Config\Repository;

class Config
{
    protected static $instance;

    public static function __callStatic($method, $args)
    {
        if (! static::$instance) {
            static::$instance = new Repository(
                (new self)->loadConfig('config')
            );
        }

        return static::$instance->{$method}(...$args);
    }

    protected function loadConfig($configPath)
    {
        $items = [];

        foreach(scandir($configPath) as $file) {
            if (substr($file, -4) === '.php') {
                $filename = str_replace('.php', '', $file);
                $items[$filename] = require $configPath . '/' . $file;
            }
        }

        return $items;
    }
}

To get the configuration, just use Config::

Config::get('database.username');             // root
Config::set('database.username', 'newuser');  // Set new value
Config::get('database.username');             // newuser

Config::all();  // All configs

Pengalaman “Spritual” di Medan

Tahun ini 2016, saya memutuskan lebih lama tinggal di Medan. Tahun ini sudah dua kali bolak-balik ke Medan. Dari sebelum puasa, balik ke Jogja lagi, lalu ke Medan lagi sebelum lebaran.

Selama di Medan saya merasa lebih “dekat” dengan YME. Karena di Medan ini lalu lintas amburadul, jadi lebih sering istigfar. Misalnya jika ada simpang empat, yang selatan lampu hijau, maka yang utara juga lampu hijau. Sehingga yang dari selatan tidak bisa ke timur. Begitu juga yang dari utara kesulitan ke barat. Ntah siapa yang mendesain traffic light seperti ini. Karena tolol, atau ada pertimbangan lain? Saya juga tidak punya jawaban pasti. Hal-hal seperti ini tidak pernah saya temui di Jawa, terutama di Jogja.

Lampu merah artinya berani.

Kasus lalu lintas lain, di Medan ini lampu merah artinya berani, bukan berhenti. Sehingga banyak yang melanggar lampu merah. Lampu merah saja dilanggar, apalagi berhenti di belakang garis? Berhenti saat lampu merah, malah dimarahi dari belakang.

Tidak seperti di Jogja yang kalau belok kiri maka ada tulisan “Kiri Langsung”, dan kalau harus ikuti tanda di lampu juga ada tulisannya. Tapi di Medan tidak ada (setidaknya jalan-jalan yang saya lewati). Jadi bingung, seharusnya berhenti atau langsung. Saya yakin pemerintah setempat tidak ada ilmu tentang UX.

Di Jogja, yang saya rasakan, pengemudi cenderung memberi. Misalnya kita lurus, ada kendaraan lain mau belok, maka kendaraan yang mau belok akan memberi jalan ke yang lurus. Di Medan, hadehh… gak mau ngalah. Jadi lebih banyak beristigfar.

Tanggal 14 Agustus, saya ke acara resepsi pernikahan sepupu di Hotel Emerald. Saat dipersilahkan makan, saya lagi-lagi beristigfar. Orang-orang mencari makan, seakan-akan gak pernah makan. Bisa-bisanya tamu datang ke belakang stand makanan, ngambil makanan sendiri. Baru kali ini saya lihat seperti itu. Saya yang sudah mengantri dan sudah di posisi paling depan diserobot juga. Akhirnya saya lebih memilih untuk mundur dari kumpulan orang bar bar.

Seperti di alam liar.

Setelah itu cerita dengan sepupu, dua dari Jakarta dan satu dari Medan. Tanggapanannya serupa. Yang dari Jakarta cerita, pas ngambil makanan tadi seperti di alam liar. Yang dari Medan bilang di sini harus keras. Sayapun bengong. Seliar apa orang-orang di Medan ini sampai makanan pun berebut kayak gak pernah makan makanan seperti sate padang, dim sum, bakso, nasi?

Walaupun saya bermarga Nasution, tapi dari kecil gak di Medan. Jadi gak tau liarnya seperti apa. Tapi dengan adanya kejadian-kejadian seperti ini, dan bila frekuensinya cukup tinggi, mungkin saya akan menjadi sosok yang lebih religius.

Uncaught SecurityError: Tainted canvases may not be exported

Today, I play with HTML5 canvas to load an image from a URL, then convert it to dataURL. Here a piece of my JavaScript ES6 code

const image = new Image()
const canvas = document.createElement('canvas')
let dataURL

image.onload = () => {
  canvas.getContext('2d').drawImage(image, 0, 0)
  dataURL = canvas.toDataURL()
}

image.src = 'http://placehold.it/300'

But when I run the code, I got this error message

Uncaught SecurityError: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported.

That’s happen because of CORS. The solution is so simple. Just add crossOrigin="Anonymous" attribute to HTMLImageElement (image object), like so

const image = new Image()
const canvas = document.createElement('canvas')
let dataURL

image.crossOrigin = 'Anonymous'

image.onload = () => {
  canvas.getContext('2d').drawImage(image, 0, 0)
  dataURL = canvas.toDataURL()
}

image.src = 'http://placehold.it/300'

The problem solved.

References:

Vim tidak bisa jalan karena versi libruby tidak sesuai

Ceritanya dapat koneksi bagus pas main ke Gongshin. Langsung upgrade semuanya, dari Mac AppStore, brew, composer, npm, dll, sampai ruby gem.

Keesokan harinya saat buka vim, dapat error seperti ini

dyld: Library not loaded: /usr/local/opt/ruby/lib/libruby.2.3.0.dylib
 Referenced from: /usr/local/bin/vim
 Reason: Incompatible library version: vim requires version 2.3.1 or later, but libruby.2.3.0.dylib provides version 2.3.0
[1] 33234 trace trap vim

Error-nya sih sudah jelas. Tapi tetep cari solusinya di internet. Ternyata tidak ada yang memuaskan.

Tanya di facebook group Vim Indonesia, malah di-like. Saya heran juga, kenapa di-like? 😕 Apa dia senang kalau saya kesulitan? Apa dia suka melihat vim tidak bisa jalan? Atau dia suka dengan error? Ntahlah…

Saat coba brew reinstall ruby, katanya sudah terinstall 2.3.1. Akhirnya saya coba telusuri sana-sini, dan menemukan /usr/local/Cellar/ruby/ mengandung dua versi, yaitu 2.3.0 dan 2.3.1.

Saya coba remove ruby

brew remove ruby

Lalu dapat message

Uninstalling /usr/local/Cellar/ruby/2.3.0... (1,260 files, 19.0M)
ruby 2.3.1 is still installed.
Remove them all with `brew uninstall --force ruby`.

Aha! Berarti aman sudah ini. Tinggal di-link saja dengan brew link ruby.

Tada!! Vim sudah bisa dijalankan kembali.😀

How to use Illuminate/Validation outside of Laravel

How to use Illuminate/Validation outside of Laravel

Ok, judulnya english, tapi isinya Indonesia.😐

Kebetulan hari ini ada pertanyaan di Facebook Group Laravel Indonesia tentang bagaimana cara menggunakan Validator-nya Laravel tapi bukan di dalam project Laravel?

Ini dia enaknya Laravel, kita bisa menggunakan component-nya di luar Laravel itu sendiri. Ngg… sebenernya bukan cuma Laravel sih. Symfony, ZF, CakePHP, Aura, dll juga bisa digunakan component-nya di luar framework-nya sendiri. Mungkin pengecualian untuk Yii. Component di Yii terlalu terikat dengan framework-nya. Sehingga sangat sulit menggunakan component di Yii tanpa Yii.😐 Itu salah satu alasan saya kurang suka Yii. Karena nggak mau berbagi dengan komunitas PHP secara keseluruhan.

Ok, kembali ke topik utama. Saya anggap kita bikin project from scratch. Pertama bikin folder project, setelah itu gunakan composer init untuk generate file composer.json

Ambil illuminate/validation dengan composer require illuminate/validation.

Buat file baru index.php dan load composer autoloader.

<?php
require __DIR__.'/vendor/autoload.php';

Kalau kita lihat di vendor/Illuminate/Validation/, ada file Factory.php. Factory adalah istilah yang umum digunakan untuk membuat suatu object.

Tambahkan code berikut.

<?php
require __DIR__.'/vendor/autoload.php';

$validator = new Illuminate\Validation\Factory();

Hmm, untuk membuat Validation\Factory kita membutuhkan Translator dari Symfony. Ini digunakan untuk menentukan error message dalam bahasa apa. Jadi kita tambahkan Symfony Translator

<?php
require __DIR__.'/vendor/autoload.php';

$trans = new Symfony\Component\Translation\Translator($locale = 'en');
$validator = new Illuminate\Validation\Factory($trans);

Nah, sekarang $validator sudah bisa digunakan😀 Mari kita coba

<?php
require __DIR__.'/vendor/autoload.php';

$trans = new Symfony\Component\Translation\Translator($locale = 'en');
$validator = new Illuminate\Validation\Factory($trans);

$validation = $validator->make([
  'name' => ''
  'email' => 'hello'
],[
  'name' => 'required'
  'email' => 'required|email'
]);

var_dump($validation->fails()); // Seharusnya true

Ok, that’s it😀 Selamat bereksperimen! Kalau ada pertanyaan, jangan ditanyakan.😐

Postman sebagai XML-RPC Client

Postman sebagai XML-RPC Client

Hari ini kebetulan saya harus bermain-main dengan XML RPC di WordPress karena mau bikin fitur auto-post dari aplikasi yang dibikin dengan NodeJS. Untuk mengakses xmlrpc.php di WordPress, awalnya saya menggunakan curl. Ternyata… Lihat ini deh kak. :'(

xml-rpc

Seperti yang terlihat pada screenshot, menggunakan XML di command line itu gak enak dan bisa bikin pusing. Padahal itu masih XML yang sederhana. Gimana kalau udah banyak? :O

Walaupun di command line kita bisa menggunakan “new line”, tapi tetap aja pusing. -_-

Postman to the rescue

Setelah melihat sekilas pola dengan menggunakan curl, saya langsung buka Postman. Tinggal set header dengan Content-type: text/xml, lalu pada body ganti menjadi “raw”. Dan, tadaaa… enak enak :3

postman-as-xmlrpc-client
Click to zoom in

Haruskah Validasi di Model?

Haruskah validasi dilakukan di Model (MVC)?

Saya pribadi tidak termasuk yang suka melakukan validasi di model. Kenapa? Saya coba membuat suatu kasus. Kasusnya adalah newsletter.

Ada beberapa pertanyaan jika saya membuat form untuk newsletter.

  1. Haruskah saya menyimpan email tsb?
  2. Bagaimana jika email tsb langsung dikirim ke 3rd party services seperti MailChimp?
  3. Haruskah saya menunggu error yang dikembalikan oleh MailChimp hanya untuk mengetahui email tidak valid?

Kisah di atas bahkan tidak membutuhkan Model. Sehingga lebih masuk akal jika validasi tidak dilakukan di model, tetapi pada saat request diterima, saat itulah request di-validasi.

Bagaimana pendapat anda?:/