Menggunakan Eloquent diluar Laravel

Standar

Oke, ini sudah banyak dibahas ditempat lain. Tapi tetep saya bahas supaya saya sendiri gak lupa :|

Jadi ceritanya saya sedang mengerjakan suatu project yang menggunakan masih CodeIgniter 3.0.0-dev. Yang mana pada saat di-update ke stable version tidak bisa -_-” Terlalu banyak error. Mungkin API-nya banyak berubah, atau bisa jadi programmer sebelumnya menambahkan sesuatu ke folder system. Tapi, saya tidak yakin karena tidak ada history tersebut di version control. Dari version control, semua terlihat masih fresh (jumlah commit bisa dikatakan fresh). Atau saya yang kurang familiar dengan CodeIgniter? :/ Karena dulu langsung jump ke Kohana setelah beberapa hari mencoba belajar CodeIgniter.

Saat mau menambahkan suatu fitur, ternyata masih belum menggunakan ORM. Seandainya menggunakan Gas ORM punya Om Taufan atau ORM lain, tentunya hidup saya akan lebih mudah XD .

So, sekalian experiment… jadi saya tambahkan saja sendiri Eloquent ke CodeIgniter. Karena memang Eloquent ini (dan hampir semua Laravel component) loose coupled, jadi saya bisa gunakan di project lain dengan mudah. Info lebih lanjut bisa dipelajari di https://github.com/illuminate/database.

Caranya gampang… saya cukup grab dari packagist dengan menggunakan composer.

composer require illuminate/database

Setelah itu masukkin ke file config/database.php di paling bawah

// Load Eloquent
use Illuminate\Database\Capsule\Manager as Capsule;

$capsule = new Capsule;

$capsule->addConnection(array(
    'driver'    => 'mysql',
    'host'      => $db['default']['hostname'],
    'database'  => $db['default']['database'],
    'username'  => $db['default']['username'],
    'password'  => $db['default']['password'],
    'charset'   => $db['default']['char_set'],
    'collation' => $db['default']['dbcollat'],
    'prefix'    => $db['default']['dbprefix'],
));

$capsule->setAsGlobal();

$capsule->bootEloquent();

Oke, tinggal bikin file untuk model. Misalnya letakkan di Models/User.php, Models/Profile.php. Supaya file itu bisa diload dengan mudah, tanpa harus menggunakan require Models/User.php, saya tambahkan saja ke daftar composer autoloader. Edit file composer.json, lalu tambahin

{
  "autoload": {
    "classmap": [
      "Models/"
    ]
  }
}

Jangan lupa setelah itu jalankan composer dump.

Jangan lupa juga tambahkan require vendor/autoload.php supaya autoloader masuk ke project. Misalnya index.php

Hmm, kendala berikutnya ternyata ada query yang harus menggunakan DB::raw(). Solusi paling mudah adalah dengan menggunakan Illuminate\Database\Query\Expression.

Jadi kira-kira seperti ini codenya

use Illuminate\Database\Query\Expression;

// ...

Book::where('status', 'published')
  ->where(new Expression("MATCH (title, description) AGAINST ('$keyword') IN BOOLEAN MODE"))

Aaaanddd… It works :D

UPDATE

My bad, lupa kalau ada method whereRaw() -_-
Jadi bisa lebih simple lagi tuh.

Reference

Laravel Access Control

laravel-framework
Standar

Tidak seperti pada Symfony, CakePHP, Phalcon, Yii atau Zend Framework, dll; pada Laravel dan Lumen tidak ada built-in fitur seperti ACL, MAC, DAC, RBAC atau apapun itu namanya. Beberapa package memang tersedia untuk menangani hal ini seperti Sentry, Entrust, dll.

Pengalaman terakhir saya dengan beberapa packages tersebut lumayan jelek. Seperti misalnya setelah menggunakan Sentry ntah kenapa menjadi terasa lebih lambat. Dan Sentry ini sudah tidak di-update lagi oleh pembuatnya Cartalyst. Melainkan digantikan dengan Sentinel.

Pengalaman lagi dengan Entrust di Laravel 4. Saat itu Entrust v1 masih menggunakan “versi development” dari Ardent sebagai dependency-nya. Hal itu membuat banyak masalah. Apalagi saya menggunakan mininum-stability: "stable" pada composer.json.

Membuat Access Control sendiri

Disini saya akan bahas bagaimana membuat access control sederhana. Saya akan fokus pada kesederhanaan, agar anda bisa mengerti hal basic pada access control. Tentu saja anda bisa modifikasi sendiri sesuai dengan kebutuhkan anda nantinya.

Migrations

Untuk membuat ACL sendiri caranya dengan membuat migrations/table schema

// role
$table->increments('id');
$table->string('name');
// role_user
$table->unsignedInteger('user_id');
$table->unsignedInteger('role_id');

$table->primary(['user_id', 'role_id']);

Relationship

Setelah itu kita buat relasi dengan menggunakan Eloquent.

<?php namespace App;

// ...
use Illuminate\Database\Eloquent\Model;

class User extends Model 
{
    // ...
    
    public function roles()
    {
        return $this->belongsToMany('Role');
    }
    
    // ...
}
<?php namespace App;

use Illuminate\Database\Eloquent\Model;

class Role extends Model 
{
    // ...
    
    public function users()
    {
        return $this->belongsToMany('User');
    }
    
    // ...
}

Fitur Role Assignment/Revoke

Tambahkan fitur untuk assign atau revoke role.

<?php namespace App;

// ...
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    // ...
    
    public function roles()
    {
        return $this->belongsToMany('Role');
    }
    
    public function assignRole($role)
    {
        return $this->roles()->attach($role);
    }
    
    public function revokeRole($role)
    {
        return $this->roles()->detach($role);
    }
    
    // ...
}

Fitur Pengecekan Role

<?php namespace App;

// ...
use Illuminate\Database\Eloquent\Model;

class User extends Model 
{
    // ...
    
    public function roles()
    {
        return $this->belongsToMany('Role');
    }
    
    public function assignRole($role)
    {
        return $this->roles()->attach($role);
    }
    
    public function revokeRole($role)
    {
        return $this->roles()->detach($role);
    }
    
    public function hasRole($name)
    {
        foreach($this->roles as $role)
        {
            if ($role->name === $name) return true;
        }
        
        return false;
    }
    
    // ...
}

Dan sudah selesai :|

Percaya atau tidak, membuat ini sebenernya cuma butuh waktu sekitar 2-6 menit :|

Cara menggunakan

$user = User::find(1);

// Jadikan user ini sebagai admin
$user->assignRole('admin');

// Keluarkan user ini dari admin
$user->revokeRole('admin');

Contoh pada controller untuk mengecek apakah current user memiliki role admin

if (Auth::user()->hasRole('admin'))
{
    return Redirect::to('/backend');
}

Contoh pengecekan menu di view

@if (Auth::user()->hasRole('moderator'))
    <a href="#">Go to Backend</a>
@endif

Middleware dan Filter

Filter

Jika anda menggunakan Laravel 4, anda bisa menggunakan filter. Letakkan ini pada app/filters.php

Route::filter('role', function($name)
{
    if (Auth::check() && ! Auth::user()->hasRole($name))
    { 
        return App::abort(401, 'Unauthorized');
    }
});

Cara menggunakan filter di route

Route::get('/backend', [
    'uses'   => 'BackendController@index',
    'before' => 'role:admin'
]);

Middleware (Laravel 5.0)

Berhubung fitur middleware parameter belum ada di Laravel 5.0, anda bisa menggunakan filter. Karena filter sebenarnya tidak dihilangkan dari core Laravel 5.0. Anda bisa menggunakannya seperti di Laravel 4 seperti biasa.

Middleware (Laravel 5.1)

Buat middleware baru

./artisan make:middleware RoleMiddleware

Edit App\Http\Middleware\RoleMiddleware.php

public function handle($request, Closure $next, $roleName)
{
    if (auth()->check() && ! auth()->user()->hasRole($roleName))
    {
        return abort(401, 'Unauthorized');
    }
    
    return $next($request);
}

Di App\Http\Kernel.php daftarkan middleware ini

protected $routeMiddleware = [
    // ...
    'role' => 'App\Http\Middleware\RoleMiddleware',
];

Cara menggunakan di route

Route::get('/backend', [
    'uses'       => 'BackendController@index',
    'middleware' => 'role:admin',
]);

Kesimpulan

Membuat fitur access control itu sangat mudah. Anda bisa menambahkan fitur-fitur lain seperti “permissions”, multiple role check:

Auth::user()->hasRole(['admin', 'operator', 'moderator']);

// atau

Auth::user()->hasRole('admin', 'operator', 'moderator');
dengan 

Atau fitur-fitur lainnya yang anda butuhkan. Sehingga anda tidak mentok karena bergantung terhadap suatu package.

Jika ada pertanyaan silahkan tanyakan pada kolom komentar.

Laravel 5.1: Easy Realtime Push Notification

laravel-framework
Standar

Oke, tadi sudah ngetik panjang lebar dan terlalu detail “how to”-nya. Tapi setelah dibaca-baca lagi, malah ribet, dan esensinya gak dapet. Jadi saya rewrite supaya lebih pendek supaya lebih mudah dipahami :|

Overview

Alkisah Taylor Otwell nambahin fitur Broadcast baru di Laravel 5.1 agar realtime push notification lebih mudah dibuat. Saat ini hanya ada dua driver. Yaitu untuk Pusher dan untuk Redis. Jika anda menggunakan layanan lain, anda tingal menulis code sendiri dengan mengimplement Illuminate/Contracts/Broadcasting/Broadcaster.

Dan bagi anda yang tidak menggunakan Laravel, gampang aja. Fitur ini tidak bergantung pada Laravel kok alias framework agnostic. Misalnya anda menggunakan Panada Framework, Yii, Lumen, Silex, Phalcon atau tanpa framework tinggal gunakan saja https://github.com/illuminate/broadcasting. Enak kan? :D

Let’s get started

Hal-hal yang kita butuhkan untuk praktek adalah:

  • Redis,
  • Web socket server,
  • Web socket client,
  • Laravel 5.1

Untuk web socket server anda bisa menggunakan apapun. Anda bisa menggunakan Go, NodeJS/IO.js, Scala, dll. Mungkin juga bisa menggunakan winsock.dll yang ada di Windows atau System.Net.Sockets.Socket yang ada di .Net Framework :/ Hmm… ntar deh coba jajal kalo ada komputer yang pake Windows nganggur.

Anyway yang penting spesifikasinya mengikuti RFC 6455. Tapi disini saya memberi contoh menggunakan NodeJS/IO.js + Socket.io. Mungkin berikutnya saya coba pakai RatchetPHP. Karena di production saya pakai RatchetPHP :/.

Lanjutt… Begitupula dengan web socket client, anda bisa menggunakan apapun. Tidak hanya JS, misalnya menggunakan PHP, Go, dll. Yaaa siapa tau anda bikin aplikasi yang nggak jalan di web browser. Tapi disini saya menggunakan Socket.io client sebagai contoh.

Anda bisa cari tau sendiri bagaimana cara install Redis di system anda. Jika anda menggunakan Homestead, kita bisa langsung mulai. Karena di Homestead, semua sudah pre-installed.

Disini kita coba bikin fitur notifikasi sederhana. Kalau ada user yang melakukan registrasi, maka otomatis akan mengirimkan notifikasi ke administrator dashboard.

Saya asumsikan sudah cukup familiar dengan Laravel, sehingga beberapa tahap tidak akan saya jelaskan.

Start!!

Edit file config/broadcasting.php, ganti driver dari pusher menjadi redis.

Generate event dan listener. Kira-kira seperti ini di App/Providers/EventServiceProvider.php

protected $listen = [
        'AppEventsUserRegistrationEvent' => [
            'AppListenersUserRegistrationSendSmsNotification',
            'AppListenersUserRegistrationSendEmailNotification',
            'AppListenersUserRegistrationSendWebNotification',
        ],
    ];

Lalu gunakan php artisan event:generate untuk generate event dan listener class.

Cara lain anda bisa menggunakan

php artisan make:event UserRegistrationEvent
php artisan make:listener UserRegistration/SendSmsNotification
php artisan make:listener UserRegistration/SendMailNotification
php artisan make:listener UserRegistration/SendWebNotification

Lalu edit file App/Providers/EventServiceProvider.php seperti diatas.

Btw, kita gak bahas Sms dan Mail notification. Ini cuma supaya dapat gambaran kalau kita trigger satu event, maka hal-hal dibelakang event tersebut bisa jalan. Juga ini dapat membuat controller anda tetap clean, karena masing-masing notifikasi bertanggung jawab didalam class-nya sendiri-sendiri.

Edit file App/Listeners/UserRegistration/SendWebNotification.php, ubah kira-kira menjadi seperti ini

<?php namespace AppEvents;

use IlluminateContractsBroadcastingShouldBroadcast;

class UserRegistrationEvent implements ShouldBroadcast
{
    public $name;

    public $email;

    public function __construct(array $payload)
    {
        $this->name  = $payload['name'];
        $this->email = $payload['email'];
    }

    public function broadcastOn()
    {
        return ['user_registration'];
    }
}

Buat suatu yang akan menggunakan event ini. Sebagai contoh, kita tambahin saja di file App/Http/Controllers/Auth/AuthController.php pada create method

protected function create(array $data)
{
    $user = User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => bcrypt($data['password']),
    ]);

    event(new UserRegistrationEvent($data)); // trigger the event

    return $user;
}

Web Socket Server

Kita install dulu package yang dibutuhkan untuk membuat socket server dengan nodejs + socket.io

npm install --save socket.io redis express

Lalu buat file socket.js yang isinya

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
var redis = require('redis');

server.listen(9090);

io.on('connection', function (socket) {

    var redisClient = redis.createClient();

    redisClient.subscribe('user_registration');

    redisClient.on('message', function(channel, message) {
        socket.emit(channel, message);
    });

    socket.on('disconnect', function() {
        redisClient.quit();
    });

});

Jalankan dengan

node socket.js

Web Socket Client

Tambahkan ini di view anda yang akan menampilkan log dari aktifitas registrasi

<div id="notifications"></div>

<script src="//cdn.socket.io/socket.io-1.3.5.js"></script>
<script>
  var socket = io('http://localhost:9090');

  socket.on('message', function (msg) {
    console.log(msg);

    var notif = document.getElementById('notifications');

    var div = document.createElement('div');

    div.innerHTML = msg.name + '('+ msg.email +') baru saja mendaftar';

    notif.appendChild(div);
  });
</script>

Selesai

Redis PubSub

Tadaa… selesai :) Sekarang tiap kali user melakukan registrasi, suatu event akan di-trigger dan akan memberikan notifikasi ke admin.

Gambar diatas, pada kiri atas adalah redis server. Kebetulan nggak dijadiin daemon. Lalu di kiri bawah untuk ngeliat proses yang terjadi dengan redis-cli. Kanan atas artisan serve, dan kanan bawah web socket server.

Btw, source code-nya menyusul yaa :D

Disini bisa dicoba source code-nya https://github.com/mul14/laravel-5.1-broadcast-example

Kalau ada pertanyaan dan counter attack silahkan tulis di kolom komentar.

Laravel Eloquent Has Many Through

laravel-framework
Standar

Kebetulan di group Laravel Indonesia ada pertanyaan Eloquent mengenai has many through relationship.

Apa itu has many through relationship? Seperti biasa, untuk mengerti sesuatu kita sebaiknya mengerti dulu artinya. Karena istilah itu biasanya tidak sembarangan dibuat. Biasanya mirip dengan dunia nyata. Kata “through” berdasarkan Google Translate artinya “melalui”. Sedangkan relationship adalah hubungan. Hubungan apa? Jangan dibahas -_-”

Contoh kasus paling mudah itu adalah negara, provinsi, dan kota. Misalnya kita punya tiga table, yaitu countries, provinces dan cities. Berikut field yang ada di masing-masing table yang saya ilustrasikan dalam format YAML:

---
countries:
    - id          : int
    - name        : string

provinces:
    - id          : int
    - name        : string
    - country_id  : int

cities:
    - id          : int
    - name        : string
    - province_id : int    # tidak ada country_id disini

Karena tidak ada country_id pada cities, bagaimana caranya untuk bisa mendapatkan data cities dari countries? Solusinya adalah has many through. Ingat kata “melalui”? Jadi untuk mendapatkan data cities dari countries harus “melalui” provinces.

Bagaimana penggunaannya di Eloquent?

Saya asumsikan anda sudah familiar dengan relationship antar table seperti 1-1, 1-n, dan juga sudah familiar menggunakan hasOne, hasMany dan belongsTo di Eloquent.

Sebagai contoh kita buat tiga class turunan Eloquent. Kita buat dari City dulu, baru lanjut ke Province dan Country.

<?php 

# app/City.php

use Illuminate\Database\Eloquent\Model;

class City extends Model
{
	/**
	  * Kota dimiliki oleh satu provinsi
	  */
	public function province()
	{
		return $this->belongsTo('Province');
	}
}
<?php

# app/Province.php

use Illuminate\Database\Eloquent\Model;

class Province extends Model
{
	/**
	  * Provinsi dimiliki oleh satu negara
	  */
	public function country()
	{
		return $this->belongsTo('Country');
	}
	
	/**
	  * Provinsi memiliki banyak kota
	  */
	public function cities()
	{
		return $this->hasMany('City');
	}
}
<?php

# app/Country.php

use Illuminate\Database\Eloquent\Model;

class Country extends Model
{
	/**
	  * Negara memiliki banyak provinsi
	  */ 
	public function provinces()
	{
		return $this->hasMany('Province');
	}
}

Oke, jika kita lihat file yang terakhir, belum ada method dengan nama cities disana. Karena jika kita tambahkan hasMany('City') tentu saja tidak bisa. Karena seperti yang disebutkan sebelumnya, tidak ada field dengan nama country_id pada cities.

Solusinya kita tambahkan method ini:

	public function cities()
	{
		return $this->hasManyThrough('City', 'Province');
	}

Penjelasannya gini

eloquent-hasmanythrough

Sehingga untuk mengambil data cities dari Country cukup menggunakan

App\Country::with('cities')->get();

// Hanya dari negara Indonesia
App\Country::with('cities')->where('name', 'Indonesia')->get();

Tutup dulu

Informasi lebih detail mengenai hal ini bisa dilihat pada dokumentasi Laravel http://laravel.com/docs/master/eloquent#has-many-through

Jika ada pertanyaan atau error, silahkan sampaikan di kolom komentar. Karena code ini sebenarnya belum dicoba. :|

You don’t need XAMPP!!

xampp-slashed
Standar

Seringkali saya lihat di forum pertanyaan dan kebingungan saat menjalankan Laravel. Seperti menghilangkan /public di URL. Semua teman-teman yang punya masalah ini, pasti menggunakan XAMPP. Ntah itu XAMPP di Windows atau XAMPP di Linux.

Padahal /public itu dimaksudkan agar directory tersebut yang di-serve oleh web server. Agar file-file yang sebenarnya tidak bisa diakses langsung dari luar.

Yang memisahkan directory ini bukan cuma Laravel. Symfony2 dan Yii2 juga ada directory web khusus untuk di-serve. Sedangkan CakePHP menggunakan webroot.

PHP Built-In Web Server

Anda tidak butuh XAMPP!!

Jika anda menggunakan PHP 5.4+, cukup gunakan command line. Anda tidak perlu install Apache, Nginx atau web server lainnya untuk menjalankan PHP. Untuk mengecek versi PHP anda, gunakan php --version

Berikut beberapa contoh command pada PHP framework yang sudah menyediakan perintah untuk menjalankan web server.

Laravel

Di Laravel cukup gunakan

php artisan serve

PHP web server by default akan jalan di port 8000. Anda bisa buka localhost:8000 di browser.

Bila ingin menggunakan port yang berbeda anda bisa tambahkan --port=[port]. Misalnya

php artisan serve --port=9090

Agar web server di local anda bisa diakses oleh komputer lain, anda bisa mengganti host dengan --host=[ip/host]. Misalnya

php artisan serve --host=0.0.0.0

artisan-serve

Symfony

Di Symfony juga ada. Cukup jalankan perintah ini

php app/console server:start

Juga by default jalan di port 8000. Detailnya untuk mengganti host dan port, bisa dilihat di http://symfony.com/doc/current/cookbook/web_server/built_in.html

CakePHP

Di CakePHP, gunakan cake command

bin/cake server

By default akan jalan di port 8765. Detailnya bisa anda baca di http://book.cakephp.org/3.0/en/installation.html#development-server

cakephp-builtin-webserver

Yii, CodeIgniter, FuelPHP, lainnya

Jika anda tidak menggunakan framework, atau ternyata di PHP framework yang anda gunakan tidak menyediakan command untuk menjalankan web server, anda bisa menggunakan php -S [host:port]. By default akan jalan pada current directory. Misalnya di CodeIgniter

php -S localhost:8000

Bila directory yang mau di-serve bukan current directory, gunakan -t [directory].

Misalnya pada Yii2, directory yang digunakan dan mengandung index.php adalah web. Maka perintahnya

php -S localhost:8000 -t web

php-builtin-webserver-yii2

Tips

Terkadang saya cuma butuh sedikit experiment. Mengetik php -S localhost:8000 saya rasa masih terlalu panjang :(

Solusinya saya buat alias dengan nama phpserver. Tambahkan ini di file yang di-load oleh shell anda. Misalnya di ~/.bashrc.

phpserver() { 
    php -S 0.0.0.0:${2:-8080} -t ${1:-.} 
}

Kini bila butuh php web server, cukup gunakan phpserver. By default akan jalan pada current directory dan port 8080. Bila directory berbeda, gunakan

phpserver directory

Bila port-nya beda gunakan

phpserver directory 9123

Apa saya harus menggunakan ini?

Jika website/aplikasi yang anda buat cukup sederhana, anda bisa menggunakan PHP built-in web server ini. Tapi jika aplikasi yang anda buat sudah sangat serius atau untuk production, silahkan gunakan solusi lain.

Informasi detail mengenai built-in web server ini bisa anda lihat di http://php.net/manual/en/features.commandline.webserver.php

That’s all :D

Jika ada pertanyaan silahkan tanyakan langsung di kolom komentar yang sudah disediakan.

Cara Menggunakan Lumen

lumen
Standar

Beberapa rekan seringkali kebingungan dengan Lumen. Karena memang ada sedikit perbedaan. Tapi sedikit, tidak terlalu banyak. Karena Lumen juga menggunakan component yang digunakan Laravel.

Disini saya akan mencoba membantu teman-teman yang kesulitan saat menggunakan Lumen.

Install

Untuk install Lumen, gunakan composer atau lumen installer. Detailnya bisa dipelajari di dokumentasi http://lumen.laravel.com/docs/installation. Misalnya dengan

lumen new mylumen

Configuration

Tidak banyak konfigurasi yang bisa dilakukan di Lumen. Tapi bila anda ingin melakukan konfigurasi, anda bisa menggunakan file .env. Tapi sebelumnya edit dulu file bootstrap/app.php. Lalu hilangkan tanda comment pada Dotenv::load(__DIR__.'/../');. Kini anda bisa edit beberapa konfigurasi di file .env.

Misalnya untuk kebutuhan local development, anda mau mengganti default driver. Edit file .env, lalu ganti

CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync

Untuk konfigurasi lebih lanjut, anda bisa copy directory vendor/laravel/lumen-framework/config/ ke root project directory anda. Setelah itu anda bisa menggunakan konfigurasi dari config directory.

cp -r vendor/laravel/lumen-framework/config/ .

Facade

Mungkin ada beberapa dari kalian kebingungan karena Facade tidak bisa digunakan di Lumen. Misalnya saat menggunakan Auth::attempt(). Solusinya sangat mudah. Edit file bootstrap/app.php, lalu hilangkan tanda comment dari $app->withFacades();

Eloquent

Begitu juga dengan Eloquent, bila ingin menggunakannya edit file bootstrap/app.php, cari $app->withEloquent();, lalu hilangkan tanda comment.

Middleware

Global Middleware

Untuk menggunakan global middleware, anda bisa mengaktifkannya melalui file bootstrap/app.php. Edit line seperti berikut

$app->middleware([
    'Illuminate\Cookie\Middleware\EncryptCookies',
    'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse',
    'Illuminate\Session\Middleware\StartSession',
    'Illuminate\View\Middleware\ShareErrorsFromSession',
    'Laravel\Lumen\Http\Middleware\VerifyCsrfToken',
]);

Anda bisa memilih middleware mana yang akan digunakan. Tidak harus semua.

Route Middleware

Begitu pula dengan Route Middleware, anda bisa aktifkan dengan menghilangkan dan meregister (apa ini bahasanya?) di

$app->routeMiddleware([

]);

Misalnya mau menambahkan auth.admin,

$app->routeMiddleware([
    'auth.admin' => 'App\Http\Middleware\Auth\AdminMiddleware'
]);

Service Provider

Seperti konfigurasi diatas, untuk mengaktifkan/registrasi Service Provider baru, cukup hilangkan tanda comment atau tambahkan disekitar

$app->register('App\Providers\AppServiceProvider');

Routes

Untuk meng-organize routes lebih baik, anda bisa edit atau tambahkan line disekitar

require __DIR__.'/../app/Http/routes.php';

Misalnya saya mau ada routes khusus untuk admin.

require __DIR__.'/../app/Http/routes/admin.php';

Btw, untuk menggunakan routing di Lumen, anda harus menggunakan lengkap namespace dan nama class. Misalnya pada app/Http/routes.php,

$app->get('api/news', 'App\Http\Controllers\NewsController@index');
$app->get('api/user/{userId}', 'App\Http\Controllers\UserController@show');

Agar lebih mudah, anda bisa menggunakan group.

$app->group(['namespace' => 'App\Http\Controllers'], function()
{

    $app->get('api/news', 'NewsController@index');

    $app->get('api/user/{userId}', 'UserController@show');

});

Views

Mungkin anda mau menggunakan Lumen bukan hanya untuk penyedia REST API. Tapi untuk membuat website biasa. Tapi by default Lumen tidak menyediakan directory resources seperti di Laravel. So, caranya sangat mudah. Jalankan artisan make seperti ini

php artisan make resources

Dengan menggunakan resources maka ada akan muncul resources directory. Didalamnya sudah ada directory lang dan views.

Bila anda hanya membutuhkan views, tapi tidak membutuhkan lang, anda bisa menggunakan

php artisan make views

Ada beberapa parameter yang bisa digunakan dengan artisan make, yaitu resources, views, lang. Dua parameter lagi akan saya bahas dibawah.

Database Migrations & Seeders

Pada Lumen, tidak ada directory database. Mungkin anda bingung bagaimana caranya menggunakan migrations dan seeders. Kita bisa menggunakan artisan make untuk membuat directory database.

php artisan make database

Untuk membuat kedua directory resources dan database sekaligus, anda bisa menggunakan foundation

php artisan make foundation

That’s all… Semoga dapat membantu.

Cara menggunakan adamwathan/eloquent-oauth di Lumen

Standar

Ada pertanyaan di facebook group Laravel Indonesia. Bagaimana cara menggunakan adamwathan/eloquent-oauth di Lumen?

Jadi gini caranya…

Copy folder vendor/laravel/lumen-framework/config ke root project directory anda. Soalnya nanti akan di-copy file konfigurasi eloquent-oauth.php ke folder config

Ambil package eloquent-oauth dengan composer

composer require adamwathan/eloquent-oauth dev-laravel-5

Tambahkan di file bootstrap/app.php pada section Register Service Provider

$app->register('AdamWathan\EloquentOAuth\EloquentOAuthServiceProvider');

Tambahkan alias (optional)

class_alias('AdamWathan\EloquentOAuth\Facades\OAuth', 'OAuth');

Hmm, problem-nya sekarang pada Lumen, tidak ada config_path(). Tambahkan saja dimanapun helper ini. Untuk demo, letakkan di file bootstrap/app.php, sebelumn return $app

function config_path($path = '')
{
    return $path ?: base_path('config');
}

Dan problem berikutnya tinggal nunggu pull request ini diterima https://github.com/adamwathan/eloquent-oauth/pull/64

Kalau sudah, coba jalankan ./artisan eloquent-oauth:install

Good luck ;)