Mulai mengenal Laravel setahun belakangan dan mencoba-coba struktur dan workflow project yang saya suka dan akhirnya stick dengan workflow seperti berikut:

Create project via composer

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

Jika belum mengenal composer? well you should, it doesn’t hurt, just adding extra tool chain and workflow to your seatbelt and it’s worth every second and byte you’ve spent for it.

konfigurasi development environment

Edit file bootstrap/start.php karena saya selalu menggunakan .dev hostname untuk development environment, saya setup seperti berikut:

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

artinya semua akses ke .dev dan .local hostname akan menggunakan environment local.

Tambahkan folder app/config/local dan buat .gitignore file yang isinya *, biar nanti tidak ditracking oleh git

Kopi file app/config/app.php ke app/config/local/ dan edit sesuai kebutuhan untuk development local, kita tidak perlu mengkopi semua isinya cukup item-item yang kita perlu override, biasanya saya hanya mengoverride items debug dan url

Kopi file app/config/database.php ke app/config/local/ sama seperti diatas, tidak perlu mengkopi semua isinya, cukup item yang akan di override.

return array(
    'default' => 'pgsql',
    'connections' => array(
        'pgsql' => array(
            'driver'   => 'pgsql',
            'host'     => '127.0.0.1',
            'database' => 'project_dev',
            'username' => 'iamdev',
            'password' => '',
            'charset'  => 'utf8',
            'prefix'   => '',
            'schema'   => 'public',
        ),
    ),
);

Kopi file app/config/session.php ke app/config/local/ items yang saya override biasanya hanya driver dan domain

Mungkin perlu mengkopi dan override konfigurasi file yang lain, intinya adalah file-file dan konfigurasi yang bisa berbeda antara production dan development environment.

Persiapkan vhost local

Karena saya punya beberapa project pararel, saya menggunakan vhost untuk development, semua project punya local .dev hostname yang saya setup di nginx, saya gunakan dnsmasq sebagai local dns server, tetapi meregisterkan hostname di /etc/hosts sudah cukup.

Contoh konfigurasi silahkan googling ada banyak, salah satunya Dayle Rees

Mulai Development dengan Workbench

Sekecil apapun applikasinya saya selalu start dengan workbench, membuat package terpisah ketimbang menempatkan project spesifik files di folder app sebagai pemisahan untuk laravel sebagai wrapper dan project files sendiri. Nantinya setelah cukup stabil saya export bench tersebut menjadi package dan memaintain-nya via composer.

1. Membuat workbench baru

php artisan workbench --resources nama_vendor/nama_project

2. Menambahkan routes, filters dan helpers

Workbench seharusnya bersifat terisolasi, sebagai module terpisah yang bisa berdiri sendiri dan re-usable, sekaligus bisa memaintain dependensi sendiri, itu kenapa workbench juga punya composer.json sendiri, dependensi untuk workbench dimaintain dari compsoer.json tersebut bukan composer.json di approot.

Buat file workbench/nama_vendor/nama_project/src/routes.php dan isi dengan uri routing yang akan dibuat, contoh routing:

// workbench/chz/website/src/routes.php
$router = App::make('router');
$namespace = 'Chz\Website\Controller\\';

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

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

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

Buat file workbench/nama_vendor/nama_project/src/filters.php dan isi dengan filter yang diperlukan untuk protected uri, contoh filter:

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

    $permitted = false;
    if (Auth::check())
    {
        $user = Auth::user();

        // ACL
        $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, buat file workbench/nama_vendor/nama_project/src/helpers.php disini nanti ditempatkan helper functions untuk mempermudah melakukan suatu block code routines, contohnya:

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

Kemudian registrasikan file-file tersebut diatas di ServiceProvider workbench, biasanya saya tempatkan 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

Langkah selanjutnya adalah, hapus semua isi default routing (commenting juga boleh) app/routes.php in favour of routing index yang baru kita bikin.

4. Registrasikan Service Provider

Registrasikan workbench service provider yang kita buat di app/config/app.php di section providers

Intialisasi git & gitflow

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

Selanjutnya, happy coding, web artisans!

© 2015 Komang. All Rights Reserved.

Made with in Kuta, Bali, Indonesia

Proudly published with Hugo