New Laravel 5.1 ACL – Part #1

laravel-framework
Standar

Sekilas

Oke, pertama ini bukan hal baru. Di framework lain seperti Yii, Zend Framework, CakePHP, Rails, dst; fitur ini sudah lama ada. Tapi di Laravel, ini sesuatu yang baru.

Selama ini untuk ACL, sebenernya nggak sulit-sulit amat. Sudah banyak package lain yang bisa meng-handle masalah ini. Seperti Trusty, Sentry, Sentinel, Entrust, dan lain-lain. Dan untuk membuatnya sendiri-pun tidak sulit, hanya membutuhkan waktu beberapa menit.

Tapi setelah membaca tweet dari Taylor ini, sepertinya ACL akan dimasukkan langsung ke core Laravel

Yang mana repository sebelumnya yang dimaksud adalah https://github.com/elabs/pundit, salah satu Gem untuk Ruby on Rails.

Selagi menjawab pertanyaan di group, saya menemukan beberapa hal yang belum pernah saya lihat sebelumnya di dokumentasi, seperti @show. Setelah itu saya mampir source code di GitHub, dan menemukan commit @can. Setelah melihat source code @can, saya sempat bingung dengan facade bernama Gate yang belum pernah saya lihat sebelumnya. Setelah membaca commit, saya menemukan hal yang menarik disini https://github.com/laravel/framework/commit/9a5189822bba546f33a550752b57161e9689c6cd

Ternyata saya sedang menggunakan versi dimana fitur ACL ini sudah bisa dinikmati, yaitu versi 5.1.12. So, bagaimana kira-kira cara menggunakan ACL di Laravel ini?

Hmm, artikel Part #1 ini ditujukan untuk existing project. Yang project-nya menggunakan Laravel versi sebelum 5.1.12. Untuk project baru, bisa langsung skip ke PART #2. Btw, Part #2 belum dibuat. Ini dulu yaa saya publish :|

Upgrade ke versi 5.1.12

Pertama jalankan dulu composer update laravel/framework atau untuk update semua package termasuk non-Laravel composer udpate.

Config

Setelah itu buka config/app.php, tambahkan ini di aliases

'Gate' => IlluminateSupportFacadesGate::class,

Controller

Pada app/Http/Controllers/Controller.php tambahkan trait ini

use AuthorizesRequests;

jangan lupa di-import

use IlluminateFoundationAuthAccessAuthorizesRequests;

Bingung? Detailnya bisa dilihat disini https://github.com/laravel/laravel/commit/c82c5eceda363db1dde8bf9a8a9b1da7b316307f

Model

Di app/User.php import dua class ini

use IlluminateFoundationAuthAccessAuthorizable;
use IlluminateContractsAuthAccessAuthorizable as AuthorizableContract;

Tambahkan di AuthorizableContract belakang implements, sehingga menjadi seperti ini

class User extends Model implements AuthenticatableContract, AuthorizableContract, CanResetPasswordContract

Tambahkan Authorizable trait yang sudah di-import

use Authorizable;

Bingung? Silahkan lihat ini https://github.com/laravel/laravel/blob/master/app/User.php

Service Provider

Tambahkan Service Provider baru app/Providers/AuthServiceProvider.php, isinya bisa dilihat disini https://raw.githubusercontent.com/laravel/laravel/7d4b5d75efb7ec201a0eb9486963cb7bd91e323a/app/Providers/AuthServiceProvider.php

Jangan lupa di-register di config/app.php

AppProvidersAuthServiceProvider::class,

Kalau bingung bisa lihat disini https://github.com/laravel/laravel/commit/7d4b5d75efb7ec201a0eb9486963cb7bd91e323a

Done

Aha! Setup sudah selesai :D Tunggu PART #2 cara menggunakannya.

Update 15 menit kemudian

Ngahahaa… ternyata sudah ada di dokumentasi http://laravel.com/docs/5.1/upgrade#upgrade-5.1.11 :v Ngpain saya bikin ini? :'( Akibat baca source code dulu baru baca dokumentasi -_-”

Aziz & Yahya Ketawa Hahahaa

Mencegah file terhapus karena `rm -rf *`

wahyu
Standar

Alkisah kemarin baca status dari Om Wahyu yang katanya gak sengaja menghapus semua file kerjaannya. Tadinya dia mau ketik &&, tetapi yang terketik adalah **. Alhasil hilanglah semua file.

Tapi sebenarnya tidak semua file yang hilang. Jika file diawali dengan dot, file tersebut tidak terhapus. Jadi kalau seandainya menggunakan Git, yang mana Git menyimpan di .git tetap akan ada. Solusinya simple, tinggal checkout aja :|

git checkout -- .

Atau bisa juga pakai stash

git stash --keep-index

Kalau tidak pakai Git (atau VCS lain) gimana? Yaa wasalam. Pakai aja tools lain untuk undelete. Di MS-DOS ada tuh UNDELETE.EXE.

So, tindakan preventif-nya apa supaya kejadian konyol ini tidak terjadi? :/

Backup!!

Selalu Backup pekerjaan anda. Kalau perlu tiap saat. Lebih baik keluar duit beberapa juta daripada hilang datanya. Terserah mau pakai layanan 3rd party di cloud, local network, atau beli alat khusus untuk backup.

Jika menggunakan OS X aktifkan TimeMachine. Yang pakai Windows juga bisa aktifkan fitur backup-nya.

Kalau pakai Linux, tergantung distro-nya. Dari distro-distro yang pernah saya coba, belum ada yang preinstalled dengan backup. Anda bisa install sendiri. Beberapa backup tools https://wiki.archlinux.org/index.php

Jika masih merasa kurang dengan tools bawaan atau open source, anda bisa pakai tools berbayar dari perusahaan semacam Acronis.

Selalu Gunakan VCS (Version Control System).

Ini juga penting. Dan jangan lupa juga commit dan push. -_-”

Gunakan safe-rm

Ini khusus untuk yang pakai *nix shell. Anda bisa install safe-rm

Cara install jika anda menggunakan OS X dan Homebrew

brew install safe-rm

Pengguna Linux, harusnya ada di distro repository-nya. Coba aja install dengan package manager bawaan distro.

Misalnya di ArchLinux

pacman -S safe-rm

di Ubuntu/Debian/Mint

apt-get install safe-rm

Redhat/Fedora/SuSe

yum install safe-rm

Kalau nggak ada, yaa compile. Jangan kayak orang susah. :/

Gunakan Trash command

Trash ini adalah satu tool ampuh buatan Om Sindre Sorhus. Bisa digunakan di OS X, Linux dan Windows. Lebih aman daripada rm dan del, karena file yang dihapus akan dipindahkan ke Trash atau Recycle Bin. Jadi bila salah ketik, bisa dengan mudah di-restore.

Khusus pengguna ZSH

Screen Shot 2015-08-07 at 15.21.18

Tambahkan ini di ~/.zshrc

unsetopt RM_STAR_SILENT
setopt RM_STAR_WAIT

RM_STAR_SILENT dimatikan agar muncul prompt saat menghapus file dengan menggunakan *

RM_STAR_WAIT diaktifkan untuk memberikan waktu delay selama 10 detik sebelum eksekusi. Jadi anda bisa tekan ^C untuk membatalkan.


References:

Apa sih bedanya UI dan UX?

ui-vs-ux
Standar

Yeah, ini pertanyaan yang cukup sering ditanyakan. Biasanya bingung dengan jargon UI dan UX. Padahal, ini sangat sederhana. Jargon apapun, coba diartikan dulu ke bahasa yang anda mengerti. Misalnya ke Bahasa Indonesia.

UI singkatan dari User Interface. User Interface artinya adalah Antar Muka Pengguna. Apa itu antar muka? Anggap aja atara muka loe dan muka orang lain. Liat wajahnya, tangannya, badannya, dll. Anda bisa tau seseorang dengan melihat mukanya.

Kalau dihubungkan dengan web design, itu sama aja dengan ngeliat tombol, link, navigasi, sidebar, dll. Antara muka loe sebagai pengguna dengan muka di design.

Sedangkan UX singkatan dari User Experience. Coba kira artikan ke Bahasa Indonesia. User Experience artinya Pengalaman Pengguna. Sesuatu yang dialami oleh pengguna saat melihat atau menggunakan karya atau suatu product.

Misalnya saos seperti di gambar, kalau ente menggunakan botol saos itu, mana yang lebih enak? Kalau ente normal, tentu lebih enak yang kanan. Karena saos-nya udah pasti turun ke bawah pas dibutuhkan. Apa yang anda alami? Yaa lebih enak. Nah!! Itulah UX. Apa yang anda alami, enak atau nggak. Good experience atau bad experience?

Kalau dihubungkan dengan web design itu seperti buka website ada popup mengganggu, bentuk tombol nggak seperti tombol sehingga gak tau kalau itu bisa diklik, untuk pencarian ada filter atau tidak, dll.

Simple kan? :/ Gak usah ribet-ribet. Intinya, artikan ke bahasa yang anda mengerti, Bahasa Indonesia.

Laravel 5 – Trik Menggunakan Queue tanpa akses SSH

laravel-framework
Standar

Pada suatu hari… saya membuat code untuk mengirimkan SMS broadcast melalui Zenziva. Seperti yang kita tau, karena ini broadcast, jadi ada kemungkinan pengiriman akan memakan waktu yang cukup lama. Makin besar jumlah user-nya, maka akan makin lama prosesnya.

Jika langsung eksekusi di web tentu saja request akan time out. Jika menggunakan set_time_limit(0), problem request time out bisa diatasi. TAPI, masa iya menunggu berjam-jam menunggu proses pengiriman SMS selesai dilakukan? :/ Belum lagi problem “connection reset” atau browser crash, atau apapunlah.

Solusinya kita bisa menggunakan queue. Queue dalam Bahasa Indonesia artinya adalah antrian. Setiap perintah yang akan dieksekusi akan dimasukkan ke antrian. Enaknya adalah, perintah ini akan dieksekusi pada proses yang berbeda di background. Sehingga kita tidak perlu menunggu http request.

Nah, tapi problem lainnya adalah saya tidak punya akses menggunakan SSH untuk install ini itu seperti Beanstalkd, Redis, Gearman, RabbitMQ, atau apapun itu yang bisa membantu proses queue ini.

Server telah di-install CPanel, tapi bukan shared hosting. Daripada minta akses SSH dan karena environment-nya seakan-akan adalah shared hosting, saya pikir lebih baik sekalian experiment :p (bukan social experiment, ntar ditabok).

How to

By default di Laravel 5, sudah ada queue driver menggunakan database. Driver ini belum ada di Laravel 4. So, tinggal ganti queue driver dan lakukan migrations.

Edit file .env atau config/queue.php, ubah driver menjadi database.

Jalankan artisan command:

php artisan queue:table
php artisan queue:failed-table

Artisan command tersebut akan membuat file di database/migrations.

Buat Job baru

php artisan make:job SmsBroadcast --queued

Ini akan membuat file baru di app/Jobs/SmsBroadcast.php

Jika menggunakan Laravel 5.0, namanya adalah Command, bukan Job. Silahkan pelajari di Laracasts mengenai Command Bus.

Sebagai contoh isi SmsBroadcast saya adalah:

public function __construct($phoneNumber, $message)
{
    $this->phoneNumber = $phoneNumber;
    $this->message = $message;
}

public function handle()
{
    Zenviva::sendSms($this->phoneNumber, $this->message);
}

Lalu pada controller yang akan men-trigger pengiriman SMS

public function postSmsBroadcast()
{
    $users = User::getAllMembers();

    $smsBody = Input::get('sms_body');

    $users->each($users, function($user)
    {
        $job = new SmsBroadcast($user->phone_number, $smsBody);

        $this->dispacth($job);
    });
}

Yap, bagian pertama selesai. Sekarang jika eksekusi method tersebut, maka akan ada record baru ditambahkan ke jobs table. Tapi SMS belum benar-benar dikirimkan. Ini hanya memasukkan perintah yang akan dieksekusi ke antrian.

Untuk menjalankan perintah yang ada di antrian, kita perlu menjalankan artisan command.

php artisan queue:listen

Atau queue:work yang bisa digunakan untuk mengaktifkan daemon

Nah ini dia, karena tidak punya akses SSH di server, kita tidak bisa menjalankan queue:listen. Hmm, Jadi gimana caranya? :/

Kita bisa panggil artisan command langsung dengan menggunakan Artisan class atau facade. Misalnya Artisan::call('queue:listen'). Tapi, jika menggunakan http request, ada kemungkinan ini akan membuat seakan-akan hang. Tapi saya belum coba :| .

Cron for Rescue

Kita bisa manfaatkan kombinasi antara cron dan Laravel Scheduler.

Tambahkan ke app/Console/Kernel.php

protected function schedule(Schedule $schedule)
{
    $schedule->command('queue:work')
             ->everyMinute()
             ->withoutOverlapping();
}

Yap, selesai. Setiap menit akan memeriksa antrian dan sms akan dikirimkan ;)

Jika ada pertanyaan, saran atau cara yang lebih baik–langsung aja isi kolom komentar.

Docker, CoreOS, Google, Microsoft, Amazon And Others Come Together To Develop Common Container Standard

Featured Image -- 1229
Standar

Originally posted on TechCrunch:

Docker, CoreOS, Google, Microsoft and Amazon are now working on a new standard for software containers with the help of the Linux Foundation. Other members of this coalition include Apcera, Cisco, EMC, Fujitsu Limited, Goldman Sachs, HP, Huawei, IBM, Intel, Joyent, Mesosphere, Pivotal, Rancher Labs, Red Hat and VMware — that is, virtually everybody who has a stake in building a thriving container ecosystem.

Docker may have become synonymous with containers, but it’s not the only container format around and not everybody agrees that it should become the standard format. Last December, CoreOS announced that it was launching its own container runtime (rkt) and format (appc), a project that received some support from major players like Google, Red Hat and VMware.

At the time, Docker and CoreOS looked like they were on a collision course, and having even more container formats wasn’t likely going to help the overall ecosystem.

DSC00365

Now, however, the two…

Lihat yang asli 563 kata lagi

Laravel 5 Custom Pagination

laravel-framework
Standar

Several minutes ago my friend ask me about how to create custom pagination with Laravel 5. This is interesting. I’ve never tried create custom pagination on Laravel 5. On Laravel 4, that’s easy. Just change the app/config/view.php with your implementation, and you are done.

By the way, he is a Python programmer. I don’t know what is he doing with Laravel 😕

After seconds looking the source code, Whoaa that’s very easy.

For quick demo, I just put the presenter on app/Http/routes.php file.

<?php

class CustomPresenter implements Illuminate\Contracts\Pagination\Presenter
{
    public function render()
    {
        return 'Alpha and Omega';
    }

    public function hasPages()
    {
        // do something here
    }
}


Route::get('/', function()
{
    $items = range('a', 'z'); // will create a, b, c, ..., z

    $paginatedItems = new Illuminate\Pagination\Paginator($items, 10);

    return view('welcome', compact('paginatedItems'));
});

And add this to the view resources/views/welcome.blade.php

{!! $paginatedItems->render(new CustomPresenter) !!}

And we are done. 😜

Maybe I will add the part two of this post.

Mengirim Email menggunakan Laravel

laravel-framework
Standar

Untuk mengirim email di Laravel sangat mudah. Behind the scene sebenarnya Laravel menggunakan SwiftMailer untuk mengirimkan email. Tersedia beberapa pilihan driver yang sudah bisa digunakan seperti menggunakan MailGun, Mandrill dan SMTP.

Kali ini kita akan bahas setup dan kirim email di Laravel 5 yang masih fresh. So, persiapkan Laravel 5.

Konfigurasi

Pertama kita ubah informasi email dan nama pengirim di config/mail.php.

'from' => ['address' => null, 'name' => null],

Untuk bisa mengirim email, anda bisa mengubahnya menjadi apapun. Tidak harus email asli anda. Misalnya kita ubah menjadi

'from' => [
    'address' => 'no-reply@example.org', 
    'name'    => 'No Reply'
],

Jika anda tidak menggunakan .env, anda bisa mengubah konfigurasi pada file config/mail.php atau system environment anda. Tapi disini saya akan memberi contoh dengan menggunakan .env. Lebih detail mengenai hal ini bisa anda baca di dokumentasi http://laravel.com/docs/master#environment-configuration .

By default setelah selesai instalasi, ada file .env. Buka dan edit file .env

MailTrap.io

MAIL_DRIVER=smtp
MAIL_HOST=mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

Jika anda mau menggunakan mailtrap.io yang sudah disediakan, langsung saja ubah username dan password. Bila belum punya, yaa daftar toh…

Mailtrap.io

Gmail

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=465        # atau 587
MAIL_USERNAME=emailanda@gmail.com
MAIL_PASSWORD=password_email_anda
MAIL_ENCRYPTION=tls

Bagi pengguna 2-step authentication akan mendapatkan message dari Google. Tinggal ikut saja informasi dari message tersebut.

Detailnya bisa anda lihat di website Google https://support.google.com/a/answer/176600?hl=en

Yahoo

MAIL_DRIVER=smtp
MAIL_HOST=smtp.mail.yahoo.com
MAIL_PORT=465        # atau 587
MAIL_USERNAME=emailanda@yahoo.com
MAIL_PASSWORD=password_email_anda
MAIL_ENCRYPTION=tls

Detail konfigurasi bisa anda lihat di website Yahoo https://help.yahoo.com/kb/SLN4724.html

Mandrill dan MailGun

Mandrill dan MailGun menyusul (ntah kapan). Mandrill dan MailGun bisa menggunakan API ataupun SMTP.

Zoho Mail

MAIL_DRIVER=smtp
MAIL_HOST=smtp.zoho.com
MAIL_PORT=587
MAIL_USERNAME=emailanda@yahoo.com
MAIL_PASSWORD=password_email_anda
MAIL_ENCRYPTION=tls

Detail informasi konfigurasi SMTP menggunakan Zoho bisa anda lihat di dokumentasinya https://www.zoho.com/mail/help/zoho-smtp.html

Driver “log”

MAIL_DRIVER=log

Saya biasa menggunakan driver log ini untuk development. Driver ini tidak benar-benar mengirimkan email, tapi hanya menulis ke log file di storage/logs, sehingga lebih cepat, aman dan bisa offline.

Laravel Mail Log

MailCatcher

MAIL_DRIVER=smtp
MAIL_HOST=127.0.0.1
MAIL_PORT=1025

Selain menggunakan “log”, saya juga biasa menggunakan MailCatcher untuk melihat apakah email yang dikirimkan sudah sesuai tampilannya atau belum, tanpa harus terhubung ke internet. Dan ini proses-nya cukup cepat.

Detail bagaimana menggunakan MailCatcher bisa anda pelajari di mailcatcher.me

MailCatcher

Kirim email

Agar mudah, kita letakkan saja di app/Http/routes.php. Anda bisa meletakkannya dimanapun, tergantung dari bagaimana anda membuat struktur aplikasi anda.

Route::get('/', function()
{

    // Variable data ini yang berupa array ini akan bisa diakses di dalam "view".
    $data = ['prize' => 'Peke', 'total' => 3 ];

    // "emails.hello" adalah nama view.
    Mail::send('emails.hello', $data, function ($mail)
    {
      // Email dikirimkan ke address "momo@deviluke.com" 
      // dengan nama penerima "Momo Velia Deviluke"
      $mail->to('momo@deviluke', 'Momo Velia Deviluke');

      // Copy carbon dikirimkan ke address "haruna@sairenji" 
      // dengan nama penerima "Haruna Sairenji"
      $mail->cc('haruna@sairenji', 'Haruna Sairenji');

      $mail->subject('Hello World!');
    });

});

Sekarang kita buat view-nya pada resources/views/emails/hello.blade.php yang isinya

Anda mendapatkan hadiah {{ $total }} buah {{ $prize }}

Yup, sekarang buka jalankan php artisan serve, dan buka web browser.

Kesimpulan

Mengirim email menggunakan Laravel sangat mudah. Anda juga bisa memasukkan email ke queue dengan menggunakan facade Mail::queue() atau Mail::later().

Bila anda ingin mengirimkan hanya berupa plain text, anda bisa menggunakan Mail::plain(). Atau hanya bisa text pendek Mail::raw(). Atau bisa juga dengan memasukkan key,

`Mail::send(['plain' => 'view'], ...)`

Detailnya bisa anda pelajari di dokumentasi dan source code :| http://laravel.com/docs/master/mail

Oh, iya… seperti component lain yang ada di komunitas PHP lainnya seperti CakePHP, Symfony, Nette, Aura, Kohana, PHPixie dan Zend Framework; yang saling berbagi dan mengisi di komunitas PHP itu sendiri, anda juga bisa menggunakan mail component ini diluar Laravel.

Bila ada pertanyaan langsung saja di kolom komentar.