Skip to main content
Engineering Notes · February 2014

Laravel Development Workflow yang Saya Pakai

Portrait of Komang Artha Yasa — technology leader, two decades building digital platforms across marketplaces, retail, logistics, fintech, and banking.

Mulai mengenal Laravel setahun belakangan, mencoba berbagai struktur dan workflow project, dan akhirnya stick dengan yang berikut ini.

Membuat Project via Composer

composer create-project laravel/laravel path/to/project/root

Belum kenal Composer? You should — anggap saja menambah satu seatbelt di toolchain. Setiap detik dan byte yang dihabiskan untuknya, sepadan.

Konfigurasi Development Environment

Saya selalu pakai .dev sebagai hostname untuk environment lokal. Edit bootstrap/start.php:

$env = $app->detectEnvironment([
  'local'   => ['*.dev', '*.local'],
  'staging' => ['staging.*'],
]);

Artinya semua akses ke .dev dan .local akan menggunakan environment local.

  • Tambahkan direktori app/config/local, dan buat .gitignore — biar tidakditracking git.
  • Kopi app/config/app.php ke app/config/local/, edit sesuai kebutuhan. Tidak perlu mengkopi semua isinya, cukup item yang ingin di-override — biasanya hanya debug dan url.
  • Kopi app/config/database.php dengan cara yang sama:
return [
  'default' => 'pgsql',
  'connections' => [
    'pgsql' => [
      'driver'   => 'pgsql',
      'host'     => '127.0.0.1',
      'database' => 'project_dev',
      'username' => 'iamdev',
      'password' => '',
      'charset'  => 'utf8',
      'prefix'   => '',
      'schema'   => 'public',
    ],
  ],
];
  • Kopi app/config/session.php — biasanya saya hanya override driver dandomain. Intinya: file dan konfigurasi yang berbeda antara production dan development.

Persiapkan vhost Lokal

Karena saya pegang beberapa project paralel, saya pakai vhost untuk development. Setiap project punya hostname .dev lokal yang saya setup di nginx, dengan dnsmasq sebagai local DNS server. Cara yang lebih sederhana: tinggal register di /etc/hosts. Sudah cukup.

Mulai dengan Workbench

Sekecil apapun aplikasinya, saya selalu mulai dari workbench — membuatpackage terpisah, daripada menumpuk file project di direktori app. Ini adalahpemisahan antara Laravel sebagai wrapper dan file project saya sendiri. Kalau sudah cukup stabil, workbench tinggal saya export jadi package, dimaintain via Composer.

1. Membuat workbench baru

php artisan workbench --resources nama_vendor/nama_project

2. Routes, filters, dan helpers

Workbench seharusnya bersifat terisolasi — module yang bisa berdiri sendiri, re-usable, dengan dependensi sendiri. Itu sebabnya workbench juga punya composer.json sendiri; dependensi workbench dimaintain dari sana, bukan dari composer.json di approot.

Buat workbench/nama_vendor/nama_project/src/routes.php:

$router = App::make('router');
$namespace = 'Chz\Website\Controller\\';

// Homepage
$router->get('/', ['as' => 'website.home', 'uses' => "{$namespace}IndexController@index"]);

// Authentication
$router->controller('/auth', "{$namespace}AuthController");

// Protected Area
$router->group(['prefix' => 'protected', 'before' => 'website.auth'], function () use ($router, $namespace) {
  $router->controller('/', "{$namespace}ProtectedController");
});

Buat workbench/nama_vendor/nama_project/src/filters.php:

$router = App::make('router');
$router->filter('website.auth', function () use ($router) {
  $permitted = false;

  if (Auth::check()) {
    $user = Auth::user();
    $operation = strtolower($router->getCurrentRequest()->getMethod());
    $resource  = "website:{$router->getCurrentRoute()->getUri()}";
    if ($user->can($operation, $resource)) $permitted = true;
  }

  if (!$permitted) {
    $referer = $router->getCurrentRequest()->headers->get('referer');
    if ($referer === URL::current() || empty($referer)) {
      $referer = URL::route('website.home');
    }
    return Redirect::guest($referer)->withErrors(['error' => 'You have not enough permission to perform this action']);
  }
});

Optional, workbench/nama_vendor/nama_project/src/helpers.php:

function isHomepage()
{
    return \Route::currentRouteNamed('website.home');
}

Registrasikan di ServiceProvider workbench, biasanya di method boot():

public function boot()
{
    $this->package('chz/website');

    include __DIR__ . '/../../filters.php';
    include __DIR__ . '/../../routes.php';
    include __DIR__ . '/../../helpers.php';
}

3. Bersihkan routing default

Hapus (atau comment) isi default app/routes.php, in favour of routing yang baru di workbench.

4. Registrasikan Service Provider

Daftarkan service provider workbench di app/config/app.php pada section providers.

Initialize Git + Git Flow

git init
git flow init
git add .
git commit -a -m "initial codebase"

Selanjutnya — happy coding, web artisans.