Menguruskan Fail Route Laravel

June 15, 2020

Fail Route Laravel secara lalainya terdiri daripada 3 fail: api.php, channel.php, web.php. Fail-fail tersebut memberitahu laravel apa yang perlu dijalankan apabila satu-satu request dibuat.

request --> fail route --> apa dijalankan

Kebiasaannya satu sistem kecil ke sederhana saiznya, tiga fail ini sudah mencukupi. Tetapi apabila sistem dah agak besar dan mempunya pelbagai modul, mungkin 3 fail route menjadi terlalu gemuk dan membuat kita menarik nafas panjang setiap kali membukanya.

Untuk menipiskan fail routing kita, ada beberapa cara yang mudah saya sarankan.

Menggunakan Resource RouteServiceProvider

Jadikan amalan membina 7 fungsi asas ke atas data mengikut bentuk Restful yang disediakan laravel. Dalam controller dibuat 7 fungsi tersebut iaitu

- index()   - Mendapatkan senarai rekod
- create()  - Memaparkan borang untuk rekod baru
- store()   - Menyimpan rekod baru 
- show()    - Memaparkan satu rekod
- edit()    - Memaparkan borang untuk mengemaskini rekod
- update()  - Menyimpan rekod dikemaskini
- destroy() - Memadam satu-satu rekod

Jika dibuat restful mengikut kaedah Laravel, kita tidak perlu membuat 7 baris pemetaan request-fungsi pada fail routing kita. Cuma gunakan satu baris seperti berikut:

Route::resource('users', 'UserController');

Ini adalah sama seperti berikut:

Route::get('/users', 'UserController@index')
                ->name('users.index');
Route::get('/users', 'UserController@index')
                ->name('users.index');
Route::get('/users/create', 'UserController@create')
                ->name('users.create');
Route::get('/users/{user}', 'UserController@show')
                ->name('users.show');
Route::post('/users', 'UserController@store')
                ->name('users.store');
Route::get('/users/{user}/edit', 'UserController@edit')
                ->name('users.edit');
Route::put('/users/{user}', 'UserController@update')
                ->name('users.update');
Route::delete('/users/{user}', 'UserController@destroy');

Ini sebenarnya agak no-brainer tetapi di beberapa tempat saya perhatikan developer tidak menggunakan bentuk resource controller seperti yang laravel ada. Trainer dulu tak ajar atau dia start dari version Laravel yang sangaaaaaat lapuk.

Mengagihkan Pemetaan Route Kedalam Fail Berasingan

Jika tidak gemar melonggokkan semua pada satu fail routes/web.php, kita boleh letakkan dalam fail routes/user.php atau routes/moduleA.php. Ini lebih nampak terurus.

Caranya, buka fail ‘app/Providers/RouteServiceProvider.php’. Cari dan perhatikan function map(). Disini kita dapat lihat bagaimana fail web.php dan api.php dipanggil.

public function map()
{
    $this->mapApiRoutes();

    // yang ini memanggil function yang membaca fail web.php
    $this->mapWebRoutes(); 
}

Kandungan function mapWebRoutes() pula:

protected function mapWebRoutes()
{

    Route::middleware('web')  // (1)
        ->namespace($this->namespace) // (2)
        ->group(base_path('routes/web.php')); // (3) 
}

1)  kod ini memanggil middleware web yang ada csrf dan semua yang diperlukan aplikasi web kita   

2) kod bawah ni untuk set namespace supaya kita tak perlu taip 'App\Http\Controllers' apabila memberitahu route apakah controller yang akan digunakan

3) akhirnya dia baca fail web.php dan menampal middleware dan namespace atas kepada kandungan web.php 

Jadi jikalau kita hendak menambah fail routes/moduleA.php, kita tambah satu method (atau function) pada RouteServiceProvider ini.

protected function mapModuleARoutes()
{
    Route::middleware('web')
        ->namespace($this->namespace)
        ->group(base_path('routes/moduleA.php'));
}

dan kemudian memanggil method tersebut didalam map() seperti berikut:

public function map()
{
    $this->mapApiRoutes();

    $this->mapWebRoutes(); 

    $this->mapModuleARoutes(); // panggil function dibuat tadi
}

Selepas itu kita akan dapat menggunakan route fail moduleA.php seperti route file web.php. Perlu ingat jika ada dua route pattern bertindan: contoh ada ‘/users’ di web.php dan juga di moduleA.php, tiada error akan diberitahu Laravel cuma kita akan nampak page lain. Untuk mengurangkan kebarangkalian ini terjadi, boleh tambahkan prefix untuk setiap module. User akan akses sistem melalui /modulea seperti dibawah (contohnya):

http://domainkita/modulea/users

Untuk menggunakan prefix, edit sedikit mapModuleARoutes()

protected function mapModuleARoutes()
{
    Route::middleware('web')
        ->prefix('modulea')
        ->namespace($this->namespace)
        ->group(base_path('routes/moduleA.php'));
}

Itu sahaja dan harap ini membantu. Terima Kasih

comments powered by Disqus