Laravel Development Workflow
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!