Tutorial Laravel 11
Tutorial Laravel 11
Halo teman-teman semuanya, pada artikel kali ini kita semua akan membahas apa saja fitur-fitur baru dan
perubahan yang terjadi di Laravel 11.
Jika kita lihat pada kebijakan dukungan Laravel, maka Laravel 11 akan dirilis pada Q1 tahun 2024, yaitu
tepatnya di bulan Maret 2024.
Version PHP (*) Release Bug Fixes Until Security Fixes Until
9 8.0 - 8.2 February 8th, 2022 August 8th, 2023 February 6th, 2024
10 8.1 - 8.3 February 14th, 2023 August 6th, 2024 February 4th, 2025
11 8.2 - 8.3 March 12th, 2024 September 3rd, 2025 March 12th, 2026
12 8.2 - 8.3 Q1 2025 Q3, 2026 Q1, 2027
Kemudian apa saja fitur-fitur dan perubahan yang terjadi di Laravel 11 ? mari kita akan membahasnya
satu-persatu.
Pengenalan Laravel 11
Laravel 11 melanjutkan perbaikan yang dilakukan di Laravel 10.x dengan memperkenalkan struktur aplikasi
yang disederhanakan, per-second rate limiting, health routing, graceful encryption key rotation, queue
testing improvements, Resend mail transport, Prompt validator integration, new Artisan commands, dan
masih banyak lagi.
Selain itu, Laravel juga merilis sebuah library yang bernama Laravel Reverb. Library ini merupakan server
WebSocket yang memberikan kemampuan real-time yang baik pada aplikasi yang kita buat.
PHP 8.2
Untuk PHP dengan versi 8.1 kini sudah tidak akan bisa digunakan lagi di Laravel 11. Untuk teman-teman
yang akan memulai membuat project baru di Laravel 11, maka harus menggunakan PHP versi 8.2 atau 8.3.
Berikut ini informasi terkait dukungan PHP 8.1 yang dihentikan di Laravel 11.
[11.x] Drop PHP 8.1 support
Struktur aplikasi baru ini dimaksudkan untuk memberikan pengalaman yang lebih ramping dan modern,
dengan tetap mempertahankan banyak konsep yang sudah familiar bagi pengembang Laravel sebelumnya.
INFORMASI : jika sebelumnya teman-teman menggunakan Laravel versi 10 ke bawah dan ingin upgrade ke
Laravel 11, maka kita tidak harus mengadopsi struktur project baru ini. Artinya, struktur project Laravel
lama masih tetap bisa digunakan.
Perubahan Route
Sekarang di Laravel 11 untuk default Route-nya hanya akan terdapat 2 file saja, yaitu console.php dan
web.php. Terus bagaimana jika kita ingin membuat route untuk Rest API ? cukup mudah kok, kita tinggal
jalankan saja perintah berikut ini.
php artisan install:api
Dengan begitu, maka file api.php akan digenerate di dalam folder routes. Begitu juga dengan route
broadcasting, teman-teman bisa menjalankan perintah berikut ini.
php artisan install:broadcasting
Default Database
Secara default, aplikasi Laravel baru menggunakan database SQLite untuk penyimpanan database, serta
driver database untuk session, cache, dan queue, namun kita tetap dapat menggunakan database lain
seperti mysql.
Laravel Reverb
Laravel Reverb menghadirkan komunikasi WebSocket real-time yang sangat cepat dan terukur langsung ke
aplikasi Laravel kita, dan menyediakan integrasi dengan event broadcasting Laravel yang sudah ada,
seperti Laravel Echo.
Untuk informasi lebih lanjut tentang Laravel Reverb : https://laravel.com/docs/11.x/reverb
Trait Dumpable
Saat itu, di Laravel 11 semua kelas telah ditambahkan method dd atau dump. Tujuannya untuk
menyerdehanakan inti dari framework itu sendiri. Contohnya seperti berikut ini.
class Stringable implements JsonSerializable, ArrayAccess
{
use Conditionable, Dumpable, Macroable, Tappable;
str('foo')->dd();
str('foo')->dump();
Untuk informasi lebih lanjut tentang rate limiting di Laravel, lihat dokumentasinya.
Sekarang ini kita akan belajar cara installasi Laravel 11, membuat model dan migration, operasi CRUD
(create, read, update dan delete) dan juga upload gambar.
Langkah 1 - Installasi Composer
Berikut ini beberapa cara untuk melakukan installasi Composer sesuai dengan sistem operasi yang
digunakan.
Installation - Linux / Unix / macOS : https://getcomposer.org/doc/00-intro.md#installation-linux-
unix-macos
Installation - Windows : https://getcomposer.org/doc/00-intro.md#installation-windows
Untuk memastikan apakah Composer berhasil diinstall di dalam komputer, maka kita bisa menjalankan
perintah berikut ini di dalam terminal/CMD.
Composer
Langkah 2 - Membuat Project Laravel 11
INFORMASI : minimal versi PHP yang digunakan adalah 8.2.
Sekarang silahkan teman-teman masuk ke dalam folder dimana akan menyimpan project-nya, jika
menggunakan XAMPP, maka berada di dalam folder htdocs.
Setelah itu, silahkan teman-teman jalankan perintah berikut ini di dalam terminal/CMD.
composer create-project --prefer-dist laravel/laravel:^11.0 laravel-11
Perintah di atas, digunakan untuk membuat project Laravel 11 dengan nama laravel-11. Silahkan tunggu
proses installasinya sampai selesai dan pastikan terhubung dengan internet.
Langkah 3 - Menjalankan Laravel 11
Setelah proses installasi Laravel 11 selesai, maka langkah berikutnya adalah melakukan uji coba
menjalankan project Laravel.
Silahkan teman-teman jalankan perintah berikut ini di dalam terminal/CMD.
cd laravel-11
Perintah di atas digunakan untuk masuk ke dalam folder project kita yang bernama laravel-11.
Setelah berhasil masuk di dalam project-nya, sekarang jalankan perintah berikut ini di dalam terminal/CMD
untuk menjalankan server-nya.
php artisan serve
Jika berhasil, project Laravel kita akan dijalankan di dalam localhost dengan port 8000. Teman-teman bisa
membukanya di dalam browser dengan mengetikkan http://localhost:8000.
Jika berhasil, maka hasilnya akan seperti berikut ini.
Di atas, pertama kita ubah konfigurasi DB_CONNECTION yang semula menggunakan sqlite menjadi mysql.
Kemudian kita hapus semua tanda # pada konfigurasi key, tujuaanya agar variable-nya diaktifkan.
Kemudian untuk DB_DATABASE kita atur menggunakan db_laravel_11.
Untuk DB_USERNAME secara default adalah root dan untuk DB_PASSWORD jika teman-teman menggunakan
XAMPP, maka dikosongkan saja.
Di atas, kita menambahkan properti $fillable dengan jenis array dan di dalamnya terdapat field/kolom yang
sudah kita buat sebelumnya di dalam file migration.
Langkah 5 - Menjalankan Proses Migrate
Sekarang kita akan belajar bagaimana menjalankan proses migrate di dalam Laravel, proses ini akan men-
generate database dan table beserta field/kolom di dalamnya.
Silahkan teman-teman jalankan perintah berikut ini di dalam terminal/CMD dan pastikan sudah berada di
dalam project Laravel-nya.
php artisan migrate
Jika keluar pertanyaan seperti berikut ini. Itu artinya kita belum memiliki database di dalam MySQL dengan
nama db_laravel11 dan apakah kita ingin membuatnya ? Silahkan pilih Yes dan ENTER.
WARN The database 'db_laravel11' does not exist on the 'mysql' connection.
┌ Would you like to create it? ────────────────────────────────┐
│ ● Yes / ○ No │
└──────────────────────────────────────────────────────────────┘
Dan jika teman-teman cek pada PhpMyAdmin di http://localhost/phpmyadmin, maka table-table akan
berhasil digenerate berserta field-field di dalamnya.
Kesimpulan
Sampai disini pembahasan kita terkait bagaimana cara membuat Model dan Migration di dalam Laravel 11
dan kita juga belajar menambahkan field dan mass assignment beserta menjalankan proses migrate.
Pada artikel berikutnya, kita semua akan belajar bagaimana cara menampilkan data dari database di dalam
Laravel 11.
Terima Kasih
santrikoding.com
Jika perintah di atas berhasil dijalankan, maka kita akan mendapatkan 1 file controller baru yang berada di
dalam folder app/Http/Controllers/ProductController.php.
Silahkan teman-teman buka file tersebut, kemudian ubah semua kode-nya menjadi seperti berikut ini.
app/Http/Controllers/ProductController.php
<?php
namespace App\Http\Controllers;
//import model product
use App\Models\Product;
//import return type View
use Illuminate\View\View;
class ProductController extends Controller
{
/**
* index
*
* @return void
*/
public function index() : View
{
//get all products
$products = Product::latest()->paginate(10);
//render view with products
return view('products.index', compact('products'));
}
}
Dari perubahan kode di atas, pertama kita harus melakukan import Model Product.
//import model product
use App\Models\Product;
Setelah itu, di dalam class ProductController kita menambahkan sebuah method baru dengan nama index.
public function index() : View
{
//...
Di dalam method tersebut, hal pertama yang kita lakukan adalah memanggil data products dari database
melalui Model Product.
//get all products
$products = Product::latest()->paginate(10);
Setelah data berhasil di dapatkan dan ditampung di dalam variable $products, maka langkah berikutnya
adalah melakukan render view beserta mengirim data product yang ada di dalam variable $products.
//render view with products
return view('products.index', compact('products'));
Di atas, kita gunakan compact untuk mengirim data dari controller ke dalam view.
Langkah 2 - Membuat Route Resource Product
Setelah controller berhasil dibuat, maka langkah berikutnya adalah membuat route-nya. Route ini akan
bertugas sebagai penghubung antara pengguna / user dengan aplikasi. Kurang lebih ilustrasinya seperti
berikut ini.
Silahkan teman-teman buka file routes/web.php, kemudian ubah kode-nya menjadi seperti berikut ini.
routes/web.php
<?php
use Illuminate\Support\Facades\Route;
Route::get('/', function () {
return view('welcome');
});
//route resource for products
Route::resource('/products', \App\Http\Controllers\ProductController::class);
Di atas, kita membuat sebuah route baru dengan path /products dan kita arahkan ke dalam class
ProductController. Untuk route yang kita buat adalah jenis resource, artinya Laravel akan secara otomatis
menghasilkan route-route untuk berbagai operasi CRUD, seperti:
METHOD PATH KETERANGAN
GET /products Menampilkan semua products.
GET /products/create Menampilkan form untuk membuat product baru.
POST /products Menyimpan product baru.
GET /products/{id} Menampilkan detail dari sebuah product.
GET /products/{id}/edit Menampilkan form untuk mengedit product.
PUT/PATCH /products/{id} Memperbarui product yang ada.
DELETE /products/{id} Menghapus product.
Untuk memastikan apakah route-route tersebut sudah digenerate oleh Laravel, teman-teman bisa
menjalankan perintah berikut ini di dalam terminal/CMD.
php artisan route:list
Langkah 3 - Membuat View untuk Menampilkan Data
Sekarang kita akan lanjutkan membuat view, yang nanti digunakan untuk menampilkan list data products
dari database.
Silahkan teman-teman buat folder baru dengan nama products di dalam folder resources/views, kemudian di
dalam folder products tersebut silahkan buat file baru dengan nama index.blade.php, kemudian masukkan
kode berikut ini di dalamnya.
resources/views/products/index.blade.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Data Products - SantriKoding.com</title>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body style="background: lightgray">
<div class="container mt-5">
<div class="row">
<div class="col-md-12">
<div>
<h3 class="text-center my-4">Tutorial Laravel 11 untuk Pemula</h3>
<h5 class="text-center"><a href="https://santrikoding.com">www.santrikoding.com</a></h5>
<hr>
</div>
<div class="card border-0 shadow-sm rounded">
<div class="card-body">
<a href="{{ route('products.create') }}" class="btn btn-md btn-success mb-3">ADD PRODUCT</a>
<table class="table table-bordered">
<thead>
<tr>
<th scope="col">IMAGE</th>
<th scope="col">TITLE</th>
<th scope="col">PRICE</th>
<th scope="col">STOCK</th>
<th scope="col" style="width: 20%">ACTIONS</th>
</tr>
</thead>
<tbody>
@forelse ($products as $product)
<tr>
<td class="text-center">
<img src="{{ asset('/storage/products/'.$product->image) }}" class="rounded" style="width: 150px">
</td>
<td>{{ $product->title }}</td>
<td>{{ "Rp " . number_format($product->price,2,',','.') }}</td>
<td>{{ $product->stock }}</td>
<td class="text-center">
<form onsubmit="return confirm('Apakah Anda Yakin ?');" action="{{ route('products.destroy', $product->id) }}"
method="POST">
<a href="{{ route('products.show', $product->id) }}" class="btn btn-sm btn-dark">SHOW</a>
<a href="{{ route('products.edit', $product->id) }}" class="btn btn-sm btn-primary">EDIT</a>
@csrf
@method('DELETE')
<button type="submit" class="btn btn-sm btn-danger">HAPUS</button>
</form>
</td>
</tr>
@empty
<div class="alert alert-danger">
Data Products belum Tersedia.
</div>
@endforelse
</tbody>
</table>
{{ $products->links() }}
</div>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script>
//message with sweetalert
@if(session('success'))
Swal.fire({
icon: "success",
title: "BERHASIL",
text: "{{ session('success') }}",
showConfirmButton: false,
timer: 2000
});
@elseif(session('error'))
Swal.fire({
icon: "error",
title: "GAGAL!",
text: "{{ session('error') }}",
showConfirmButton: false,
timer: 2000
});
@endif
</script>
</body>
</html>
Dari penambahan kode di atas, untuk menampilkan data kita akan gunakan direktif @forelse.
@forelse ($products as $product)
//tampilkan data
@empty
@endforelse
Dari perubahan kode di atas, pertama kita import return type RedirectResponse.
//import return type redirectResponse
use Illuminate\Http\RedirectResponse;
Function Store
Method ini akan kita gunakan untuk melakukan proses insert data ke dalam database dan juga upload
gambar.
public function store(Request $request): RedirectResponse
{
//...
Di dalam method tersebut, hal pertama yang kita lakukan adalah membuat validasi, yaitu untuk memeriksa
apakah data yang dikirimkan sudah sesuai atau belum.
//validate form
$request->validate([
'image' => 'required|image|mimes:jpeg,jpg,png|max:2048',
'title' => 'required|min:5',
'description' => 'required|min:10',
'price' => 'required|numeric',
'stock' => 'required|numeric'
]);
Setelah data berhasil diupload, maka langkah selanjutnya adalah melakukan proses insert data ke dalam
database menggunakan Model Product.
//create product
Product::create([
'image' => $image->hashName(),
'title' => $request->title,
'description' => $request->description,
'price' => $request->price,
'stock' => $request->stock
]);
Jika proses insert data berhasil dilakukan, maka kita akan redirect ke dalam route yang bernama
products.index dengan mengirimkan sebuah session flash data.
//redirect to index
return redirect()->route('products.index')->with(['success' => 'Data Berhasil Disimpan!']);
Dari penambahan kode di atas, jika teman-teman perhatikan pada bagian form action, kita arahkan ke
dalam route yang bernama products.store. Artinya itu akan memanggil method yang bernama store yang
berada di dalam controller.
<form action="{{ route('products.store') }}" method="POST" enctype="multipart/form-data">
//...
</form>
Pada bagian form kita tambahkan attribute enctype="multipart/form-data". Ini ditambahkan jika ada sebuah
upload file di dalam form-nya.
Kemudian di dalam JavaScript, teman-teman bisa perhatikan kita melakukan inisialisasi Rich Text Editor
menggunakan CKEdtor. Dan kita akan terapkan ke dalam textarea yang memiliki name description.
<script>
CKEDITOR.replace('description');
</script>
Silahkan klik button SAVE tanpa mengisi data apapun, jika berhasil maka akan menampilkan validasi yang
kurang lebih serti berikut ini.
Sekarang, silahkan masukkan data di dalam form dan klik button SAVE, jika berhasil maka akan
menampilkan hasil seperti berikut ini.
Kesimpulan
Pada artikel ini kita telah belajar banyak hal, seperti membuat method create dan store untuk proses insert
data, membuat fungsi upload gambar, membuat halaman view untuk form tambah data product.
Pada artikel berikutnya, kita semua akan belajar bagaimana cara menampilkan detail data product
berdasarkan ID.
Terima Kasih
santrikoding.com
Dari perubahan kode di atas, kita menambahkan method baru dengan nama show dan di dalam
parameternya kita berikan variable $id.
public function show(string $id): View
{
//...
Di dalam method di atas, kita akan melakukan get data dari database melalui Model Product dengan
method findOrFail.
//get product by ID
$product = Product::findOrFail($id);
1. Menampilkan Gambar
2. <img src="{{ asset('/storage/products/'.$product->image) }}" class="rounded" style="width: 100%">
3. Menampilkan Title
4. {{ $product->title }}
5. Menampilkan Harga
6. {{ "Rp " . number_format($product->price,2,',','.') }}
Di atas, kita gunakan function number_format dari PHP untuk memformat harga product.
7. Menampilkan Description
8. {!! $product->description !!}
Karena di dalam description terdapat sintaks HTML, maka kita harus me-rendernya menggunakan {!!
!!}
9. Menampilkan Stock
10. {{ $product->stock }}
Kesimpulan
Pada artikel ini, kita semua telah belajar bagaimana cara menampilkan detail data berdasarkan ID, dimana
data ID tersebut akan diambil dari parameter di dalam URL browser.
Pada artikel berikutnya, kita semua akan belajar bagaimana cara membuat proses edit dan update data ke
dalam database di Laravel 11.
Terima Kasih
santrikoding.com
//...
Di dalam method tersebut, kita melakukan get data ke dalam database menggunakan Model berdasarkan
ID.
//get product by ID
$product = Product::findOrFail($id);
Setelah data didapatkan, kita tinggal kirimkan data tersebut ke dalam view menggunakan compact.
//render view with product
return view('products.edit', compact('product'));
Function Update
Method ini akan kita gunakan untuk proses update data product ke dalam database. Di dalam method ini
terdapat 2 parameter, yaitu $request dan $id.
1. $request - digunakan untuk menerima request data yang dikirimkan oleh pengguna melalui form.
2. $id - merupakan ID data product yang akan akan dijadikan acuan update data.
public function update(Request $request, $id): RedirectResponse
{
//...
Di dalam method di atas, pertama-tama kita membuat sebuah validasi terlebih dahulu.
//validate form
$request->validate([
'image' => 'image|mimes:jpeg,jpg,png|max:2048',
'title' => 'required|min:5',
'description' => 'required|min:10',
'price' => 'required|numeric',
'stock' => 'required|numeric'
]);
kemudian kita membuat kondisi untuk gambar, jika terdapat request gambar
//check if image is uploaded
if ($request->hasFile('image')) {
} else {
Di atas, jika ada sebuah request dengan nama image, maka kita akan melakukan beberapa aksi, yaitu:
1. Upload gambar baru
2. //upload new image
3. $image = $request->file('image');
4. $image->storeAs('public/products', $image->hashName());
Tapi jika request image tidak ada, maka kita cukup update data product tanpa gambar.
//update product without image
$product->update([
'title' => $request->title,
'description' => $request->description,
'price' => $request->price,
'stock' => $request->stock
]);
Setelah itu, kita tinggal redirect ke dalam sebuah route dengan nama products.index dengan menambahkan
flash data.
//redirect to index
return redirect()->route('products.index')->with(['success' => 'Data Berhasil Diubah!']);
Pada penambahan kode di atas, untuk mengisi value kita panggil object dari data product di dalam helper
old. Contohnya seperti berikut.
{{ old('title', $product->title) }}
Dan jangan lupa, untuk halaman form edit, pastikan teman-teman menambahakn method PUT di dalamnya.
Ini menandakan bahwa form tersebut adalah form edit data.
@method('PUT')
Silahkan teman-teman sesuaikan isinya, kemudian klik button UPDATE, jika berhasil maka akan
menampilkan halaman seperti berikut ini.
Kesimpulan
Pada artikel ini kita telah belajar bagaimana cara membuat proses edit dan update data di Laravel 11,
dengan cara menambahkan 2 method di dalam controller, yaitu edit dan update dan membuat halaman view
untuk form edit-nya.
Pada artikel berikutnya, kita semua akan belajar bagaimana cara membuat proses delete data di Laravel
11.
Terima Kasih
santrikoding.com
Dari perubahan kode di atas, kita menambahkan method baru dengan nama destroy dan pada
parameternya ita berikan $id, yang nanti nilainya akn diambil dari URL browser.
public function destroy($id): RedirectResponse
{
//...
Di dalam method tersebut, pertama, kita akan mendari data product berdasarkan ID.
//get product by ID
$product = Product::findOrFail($id);
Setelah gambar berhasil dihapus, langkah berikutnya adalah menghapus data dari database.
//delete product
$product->delete();
kemudian kita redirect ke dalam route yang bernama products.index dengan memberikan session flash data.
//redirect to index
return redirect()->route('products.index')->with(['success' => 'Data Berhasil Dihapus!']);
Kesimpulan
Pada artikel iin kita telah belajar menambahkan method untuk proses delete data dari database dan
menghapus gambar.
Jika teman-teman mengalami kendala atau kesalahan saat belajar, jangan sungkan-sungkan untuk
bertanya melalui kolom komentar atau juga bisa melaui group Telegram dari SantriKoding.
SOURCE CODE : https://github.com/SantriKoding-com/CRUD-Laravel-11
Terima Kasih