Menguasai Dasar-Dasar Perintah pada Laravel: Tips dan Trik yang Harus Diketahui
Hi teman-teman kali ini saya akan shering tips perintah dasar pada framework Laravel, dimulai dari membuat controller, model, database migration, seeder, faker factory, middleware dan masih banyak lagi yang perintah dasar pada laravel ini saya dirangkum berdasar pengalaman dalam pengembangan aplikasi dengan menggunakan laravel.
Dengan tips ini semoga menjadi referensi dan bisa menggigatkan dan mempercepat didalam pengembangan aplilkasi dengan menggunakan laravel.
Urutan Pembuatan MVC pada Laravel :
php artisan help (migrate:status) bantuan
Model
php artisan make:model -m Flight (membuat model dan migration)
Migration
php artisan make:migration create_flights_table (membuat file migrasi baru)<br>php artisan migrate (menjalankan migrasi)<br>php artisan migrate:status (status migrasi)<br>php artisan migrate:rollback (mengembalikan migrasi satu tingkat)<br>php artisan migrate:fresh (menghapus migrate dan menjalankan kembali file migrate)
Controller
php artisan make:controller PhotoController (membuat controller)<br>php artisan make:controller -r MotorController (membuat controller dan resource controler)
- Membuat Controller yang terhubung dengan model (Spesifik resource model) agar bisa menggunakan slug tanpa id
php artisan make:controller PhotoController –model=Photo –resource
Seeder
php artisan make:seeder UserSeeder (membuat seeder)
php artisan db:seed (menjalankan seeder)
Contoh :
Motor::create([
‘nama_motor’ => ‘Honda Beat’,
‘merek_id’ => 1,
‘warna’ => ‘Hitam’,
‘harga’ => 1000000,
‘image’ => ‘default.jpg’
]);
Factory
- php artisan make:factory MotorFactory (membuat factory)
- Seting Lokasi Faker Locale Indonesia :
- App/config/app.php
Tambahkan kode berikut
- Faker_locale => env(‘FAKER_LOCALE’, ‘en_US’)
- Tambahkan kode berikut di .env
FAKER_LOCALE=id_ID - Masukan jumlah data Factory ke DatabaseSeeder
Motor::factory(20)->create(); / menambahkan 20 data motor random - Masukan database property Motor yang akan dibuat di MotorFactory return [
‘nama_motor’ => $this->faker->sentence(2),
‘merek_id’ => $this->faker->numberBetween(1, 3),
‘warna’ => $this->faker->colorName(),
‘harga’ => $this->faker->numberBetween(1000, 2000),
‘image’ => $this->faker->image(null, 640, 480)
];
Faker Doc (dokumentasi Faker)
Cara menjalankan Tinker
php artisan tinker
$user = new App\Models\User;
$user = new User;
$user->name = ‘Affanul hakim’
$user->email = ‘affanul@gmail.com’
$user->password = bcrypt(‘coba)
$user->save()
- Menampilkan data di tinker
$user->all()
$user->first()
$user->find(1)
$user->findOrfail(10) (dengan pesan kesalahan)
Paginate
untuk mengaktifkan link paginate tambahkan (laravel 9)
Use bootstrap
App\Providers\AppServiceProvider
public function boot()
{
Paginator::useBootstrapFive();
}
Relationship
- one to one
class Post extends Model
{
/**- Get the category that owns the post.
*/
public function category()
{
return $this->belongsTo(Category::class);
}
}
- Get the category that owns the post.
- one to many
class Post extends Model
{
/**- Get the comments for the blog post.
*/
public function comments()
{
return $this->hasMany(Comment::class);
}
}
- Get the comments for the blog post.
- Menampilkan berdasar kategori
- {{ $post->category->nama }}
Problem N + 1
Install Library : https://github.com/itsgoingd/clockwork
Install extention chome : clockwork
Untuk melihat di browser chorme, klik kanan di halaman + inspect + clockwork
Dokumentasi Larevel
Eager Loading
- Tambahkan fungsi with untuk mengatasi N+1 problem
- masukan nama tabel relasi kedalam fungsi with
- Contoh 1
$books = Book::with(‘author’)->get();
foreach ($books as $book) {
echo $book->author->name;
}
- Contoh 2, menambah nama kategori didalam fungsi (with) disini menambah kategori merek karena Controller motor memili relasi dengan kategori merek : Motor::with([‘merek’])
class MotorController extends Controller
{
public function index()
{
return view(‘motor.index’, [
‘motor’ => Motor::with([‘merek’])->orderByDesc(‘id’)->filter(request([‘search’]))->paginate(10)
]);
}
}
Lazy Eager Loading, tambahkan fungsi load dengan nama tabel relasi : $books->load(‘author’, ‘publisher’)
$books = Book::all();
if ($someCondition) {
$books->load(‘author’, ‘publisher’);
}
View Blade
- Navbar
Operator ternari, apabila variabel title berisi home maka tampilkan active pada navbar :
{{ ($title === “home”) ? ‘active’ : ” }}
Flash data, key Flash Data
- Membuat redirect halaman login, sekaligus menampilkan flash data
return redirect(‘/login_wpu’)->with(‘success_message’, ‘Registration successfull! Pleace login’);
- menampilkan flash data dengan bootstrap @if (session()->has(‘success’))
{{ session(‘success’) }}
@endif
Validasi Data : key Validation, pada form registrasi user
$validatedData = $request->validate([
'name' => 'required|max:255',
'username' => 'required', 'min:3', 'max:255', 'unique:users',
'email' => 'required|email:dns|unique:users',
'password' => 'required|min:5|max:255'
]);
// Cara encript password dengan hash
$validatedData[‘password’] = Hash::make($validatedData[‘password’]);
// Sukses validasi input data ke Database
User::create($validatedData);
# Notifikasi pada form input
Agar user tidak perlu mengetik lagi input pada form maka masukan fungsi old data pada : value=”{{ old(‘name’) }}
Name
@error(‘name’)
{{ $message }}
@enderror
Autentification, Contoh Form Login, key Authentication
- Contoh Fungsi Autentikasi Input Login User : public function autenticate(Request $request)
{
$credentials = $request->validate([
’email’ => ‘required|email:dns’,
‘password’ => ‘required’
]);
// Jika user lolos autentikasi, benar email & password redirect ke Dashboard
if (Auth::attempt($credentials)) {
$request->session()->regenerate();
return redirect()->intended(‘/dashboard’);
}
// jika user tidak lolos autentikasi, redirect ke login dengan pesan login error
return back()->with(‘loginError’, ‘Login failed’);
}
------------------------- ### Midleware Default ### -------------------------
- Secara default midelware otomatis berjalan dalam laravel, seting midelware berada dalam folder : App/Http/Kernel
- user yang sudah autentifikasi dengan fungsi : Auth
- user yang belum autentikasi : guest
Merubah redirect autentikasi di file : App\Providers\RouteServiceProvider
Rubah redirect ke halaman yang diinginkan apabila user berhasil login/autentikasi benar :
public const HOME = ‘/posts’;
- Contoh Tag Menampilkan data auth :
@auth
tampilkan apabila user login/autentikasi
@else
tampilkan apabila user belum login/autentikasi
@endauth - Apabila mengakses halaman/route user yang belum login maka default midleware akan mengarahkan ke halaman (login) App\Http\Middleware\Autenticate Tidak ada Route (Login) halaman tidak bisa diakses/dibatasi login maka dibuatkan name route : name(‘login’)
Route::get(‘/login_wpu’, [LoginWpuController::class, ‘index’])->name(‘login’)->middleware(‘guest’);
---------------------------------------------------
#### Membuat Middleware dan Autorization ####
---------------------------------------------------
- Buat Middleware baru dengan comandpalete VSCode, atau demgan perintah dibawah ini, berikan nama (IsAdmin)
php artisan make:midlleware IsAdmin, atau command palete vscode // Otentikasi User Autorization, Otorisasi akun admin dan akun user biasa
// Jika user belum login atau User selain admin tidak bisa akses kategori
- masukan kode berikut pada Middleware IsAdmin // jika belum login dan bukan admin -> forbiden
if (!auth()->check() || !auth()->user()->is_admin) {
abort(403);
}return $next($request);
- Daftarkan di Kernel Middleware yang kita buat App\Http\Kernel.
‘is_admin’ => \App\Http\Middleware\IsAdmin::class - Tambahkan Middleware is_admin di route kategori/merek yang akan kita autorization, dimana hanya admin yang bisa mengaksesnya bukan user biasa
Route::resource(‘/merek’, MerekController::class)->except(‘show’)->middleware(‘is_admin’);
Gate untuk membatasi user mengakses halaman/kategori controller tertentu khusus admin
- Buat gate baru tambahkan skrip berikut di file App\Providers\AppServiceProvider.php didalam fungsi boot Gate::define(‘admin’, function (User $user) {
return $user->is_admin;
}); - Buat Database Migration (add_is_admin_to_user_table) dengan nama kolom baru is_admin pada tabel users, default false apabila belum ada kolom is_admin pada tabel user. $table->boolean(‘is_admin’)->default(false); $table->dropColumn(‘is_admin’);
- Daftarkan Autorization Gate pada file App\Providers\AppServiceProvider.php menjadi contoh berikut merubah dari koding gate sebelumnya : Gate::define(‘admin’, function (User $user) {
return $user->is_admin;
});
7 Masukan kode ( @can )Autorization Gate pada view Blade, maka halaman kategori akan hilang dan tidak bisa diakses kecuali user admin
@can(‘admin’)
Link halaman kategori admin
@endcan
-----------------------------------------
##### Cara Membuat Slug di Laravel #####
-----------------------------------------
- Slug dibuat dengan library eloquent-sluggable
- Dokumentasi : https://github.com/cviebrock/eloquent-sluggable#eloquent-sluggable
- Instal librari eloquent sluggabel.
Buat Controller resource baru dengan dengan comandpalete VScode
- atau ketikan perintah membuat controller resource :
php artisan make:controller BeritaController –model=Berita –resource –requests
- Tambah Route diatas route berita, untuk mengirim ke fungsi checkSlug ke controller berita :
// Route, Request slug berita
Route::get(‘/dashboard/berita/checkSlug’, [BeritaController::class, ‘checkSlug’])->middleware(‘auth’);
//Route resource berita
Route::resource(‘/dashboard/berita’, DashboardBeritaController::class)->middleware(‘auth’); - Controller Berita, tambahkan namespace :
use \Cviebrock\EloquentSluggable\Services\SlugService;
- Parameter fungsi pada controller penamaannya disesuaikan dengan nama Routelist, contoh :
public function show(Berita $beritum)
{
// parameter Berita disesuaikan dengan parameter route list, maka parameter menjadi ( $beritum )
return view(‘dashboard.berita.show’, [
‘berita’ => $beritum
]);
}
- Masukan fungsi checkslug :
public function checkSlug(Request $request)
{
$slug = SlugService::createSlug(Berita::class, ‘slug’, $request->judul);
return response()->json([‘slug’ => $slug]);
} - Pada Model Berita tambahkan use slugable dan getRoutekeyName dan sluggable
use Cviebrock\EloquentSluggable\Sluggable;
use Sluggable;
public function getRouteKeyName()
{
return ‘slug’;
}
public function sluggable(): array
{
return [
'slug' => [
'source' => 'judul'
]
];
}
- Form View Create Berita, masukan kode Javascript untuk membuat slug di form post, dengan nama id field judul dan slug :
// menggunakan library eloquent-sluggable
const judul = document.querySelector(‘#judul’);
const slug = document.querySelector(‘#slug’);
judul.addEventListener(‘change’, function() {
fetch(‘/dashboard/berita/checkSlug?judul=’ + judul.value)
.then(response => response.json())
.then(data => slug.value = data.slug)
});
Untuk lebih lengkapnya teman-teman bisa membaca dokumentasi resmi laravel.com
Ikuti tulisan menarik lainya di blog ini :
Terima kasih teman-teman telah membaca blog ini sampai selesai, tulisan ini bisa teman-teman dapat di github affanul hakim untuk update terkini, terima kasih.