Laravel to React
artikel tentang merubah mental model dari laravel ke reactjs
Laravel → React: Mental Model untuk Developer PHP yang Ingin Beralih ke JavaScript
Bagi developer PHP, terutama yang sudah cukup lama menggunakan Laravel, berpindah ke ekosistem JavaScript seperti React sering terasa lebih sulit daripada yang sebenarnya.
Masalah utamanya biasanya bukan syntax.
Developer Laravel sebenarnya sudah mengenal banyak konsep yang juga digunakan dalam pengembangan aplikasi React: routing, component, dependency management, state, request API, middleware, validation, authentication, hingga separation of concerns.
Yang berbeda adalah mental model.
Laravel membuat banyak keputusan untuk kita. Struktur folder, lifecycle request, routing, controller, middleware, ORM, validation, hingga templating sudah memiliki pola yang cukup jelas.
React justru memberikan kebebasan yang jauh lebih besar.
Karena itu, cara terbaik untuk belajar React bagi developer Laravel bukan dengan memulai dari:
"Bagaimana cara menulis JavaScript?"
Tetapi dari pertanyaan:
"Konsep Laravel yang selama ini saya gunakan, padanannya di React apa?"
Artikel ini akan membahas transisi tersebut.
1. Hal Pertama yang Harus Dipahami: Laravel dan React Bukan Kompetitor Langsung
Kesalahan pertama yang cukup umum adalah membandingkan:
Laravel vs React
Padahal keduanya memiliki tanggung jawab yang berbeda.
Laravel adalah backend web framework.
React adalah UI library untuk membangun antarmuka aplikasi.
Secara sederhana:
Laravel
├── Routing
├── Controller
├── Middleware
├── Validation
├── Authentication
├── Database
├── ORM
├── Queue
├── API
└── Blade Rendering
Sementara React lebih fokus pada:
React
├── UI
├── Component
├── State
├── Event
├── Rendering
└── Interaction
Dalam arsitektur modern, Laravel dan React bahkan sering digunakan bersama.
Contohnya:
React
↓
HTTP Request
↓
Laravel API
↓
Service
↓
Eloquent
↓
PostgreSQL / MySQL
React menangani tampilan.
Laravel menangani business logic dan data.
Namun jika ingin menggunakan JavaScript secara full-stack, stack-nya biasanya menjadi seperti:
React / Next.js
↓
Node.js Runtime
↓
Database
Karena itu, developer Laravel sebaiknya jangan melihat React sebagai "Laravel versi JavaScript".
React lebih tepat dipahami sebagai pengganti sebagian tanggung jawab yang sebelumnya kita kerjakan menggunakan Blade.
2. Dari Blade ke React Component
Untuk developer Laravel, konsep React yang paling mudah dipahami adalah component.
Di Blade kita mungkin memiliki:
<x-button>
Simpan
</x-button>
atau:
@include('components.button')
Di React:
<Button>Simpan</Button>
Component React pada dasarnya adalah fungsi.
function Button() {
return <button>Simpan</button>;
}
Atau:
const Button = () => {
return <button>Simpan</button>;
};
Jika di Laravel kita terbiasa memecah Blade menjadi:
views/
├── layouts/
├── components/
├── users/
├── orders/
└── dashboard/
Di React pola yang sama tetap berlaku.
Misalnya:
src/
├── components/
├── pages/
├── features/
├── layouts/
└── hooks/
Mental model-nya:
Blade Component
≈
React Component
Tetapi React Component memiliki kemampuan yang jauh lebih besar karena bukan hanya template.
Component bisa memiliki:
- state
- event
- lifecycle
- logic
- request API
- child component
- reusable behavior
3. Props Mirip Parameter pada Blade Component
Misalnya di Blade:
<x-alert type="success">
Data berhasil disimpan
</x-alert>
Di React:
<Alert type="success">
Data berhasil disimpan
</Alert>
Component-nya:
function Alert({ type, children }) {
return (
<div className={`alert alert-${type}`}>
{children}
</div>
);
}
props bisa kita bayangkan sebagai parameter yang dikirim ke component.
Mental model sederhananya:
Blade Component Attributes
≈
React Props
Jika menggunakan PHP class:
function alert($type, $message)
{
// ...
}
React kurang lebih:
function Alert({ type, message }) {
// ...
}
Props pada React sebaiknya dianggap read-only.
Parent memberikan data kepada child.
Parent Component
↓
Props
↓
Child Component
4. Perubahan Terbesar: Memahami State
Inilah konsep yang biasanya membutuhkan sedikit penyesuaian bagi developer Laravel.
Pada aplikasi Laravel tradisional:
User klik tombol
↓
Browser mengirim request
↓
Laravel Controller
↓
Database
↓
Blade dirender ulang
↓
HTML baru dikirim
Setiap interaksi besar biasanya menghasilkan request baru.
Di React, banyak interaksi terjadi tanpa reload halaman.
Contoh:
function Counter() {
const [count, setCount] = useState(0);
return (
<button onClick={() => setCount(count + 1)}>
{count}
</button>
);
}
count disebut state.
Ketika state berubah:
State berubah
↓
React melakukan render ulang
↓
UI diperbarui
Tidak perlu reload halaman.
Tidak perlu request ke server.
Mental model pentingnya adalah:
UI = function(state)
Artinya tampilan adalah representasi dari state saat ini.
Misalnya:
const [isLoading, setIsLoading] = useState(false);
Kemudian:
return (
<>
{isLoading ? "Loading..." : "Simpan"}
</>
);
Jika:
isLoading = true
UI menampilkan:
Loading...
Jika:
isLoading = false
UI menampilkan:
Simpan
Cara berpikir ini sangat fundamental dalam React.
5. Dari Controller ke Event Handler
Di Laravel:
Route::post('/users', [UserController::class, 'store']);
Controller:
public function store(Request $request)
{
User::create($request->all());
return redirect()->back();
}
Dalam React, interaksi UI biasanya dimulai dari event handler.
function UserForm() {
const handleSubmit = () => {
console.log("form submitted");
};
return (
<button onClick={handleSubmit}>
Simpan
</button>
);
}
Tetapi React tidak menggantikan controller backend.
Biasanya:
React Event Handler
↓
API Request
↓
Laravel Controller
Contohnya:
async function handleSubmit() {
await fetch('/api/users', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: 'Gugun'
})
});
}
Laravel:
public function store(Request $request)
{
$user = User::create(
$request->validated()
);
return response()->json($user);
}
Jadi konsepnya bukan:
Controller Laravel → diganti React
Tetapi:
UI Event
↓
React Handler
↓
HTTP Request
↓
Laravel Controller
6. Dari Form Submit ke Controlled Form
Di Blade:
<form method="POST" action="/users">
<input name="name">
<button type="submit">
Simpan
</button>
</form>
Browser menangani banyak hal secara otomatis.
Di React biasanya kita mengendalikan nilai input menggunakan state.
function UserForm() {
const [name, setName] = useState('');
const handleSubmit = async (event) => {
event.preventDefault();
await fetch('/api/users', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
name
})
});
};
return (
<form onSubmit={handleSubmit}>
<input
value={name}
onChange={(event) =>
setName(event.target.value)
}
/>
<button type="submit">
Simpan
</button>
</form>
);
}
Perhatikan:
value={name}
dan:
onChange={(event) => setName(event.target.value)}
State menjadi single source of truth.
Input
↓
onChange
↓
State
↓
UI
Pola ini akan sering ditemukan dalam aplikasi React.
7. Routing: Laravel Route vs React Router
Laravel developer pasti familiar dengan:
Route::get('/users', ...);
Route::get('/users/{id}', ...);
React SPA juga memiliki konsep routing.
Misalnya menggunakan React Router:
<Route path="/users" element={<UserList />} />
<Route path="/users/:id" element={<UserDetail />} />
Secara konsep:
Laravel Route
≈
React Router
Tetapi lifecycle-nya berbeda.
Laravel:
URL
↓
HTTP Request
↓
Laravel Router
↓
Controller
↓
HTML
React SPA:
URL berubah
↓
React Router
↓
Component berubah
↓
UI dirender
Tidak selalu ada request HTML baru ke server.
8. Dari $request ke State dan API
Laravel developer terbiasa dengan:
$request->name
$request->email
$request->password
Di React data tersebut biasanya berasal dari state:
const [form, setForm] = useState({
name: '',
email: '',
password: ''
});
Kemudian dikirim ke server:
await fetch('/api/users', {
method: 'POST',
body: JSON.stringify(form)
});
Laravel kemudian tetap membaca:
$request->name;
$request->email;
$request->password;
Jadi data flow-nya:
React State
{
name,
email,
password
}
↓ JSON
Laravel Request
$request->name
$request->email
$request->password
Ini adalah jembatan penting antara frontend React dan backend Laravel.
9. Dari Eloquent ke API Data
Developer Laravel sangat terbiasa dengan:
$users = User::all();
Di Blade:
@foreach ($users as $user)
{{ $user->name }}
@endforeach
Jika menggunakan React, Laravel biasanya mengembalikan JSON.
return response()->json(
User::all()
);
React kemudian mengambil datanya.
const [users, setUsers] = useState([]);
useEffect(() => {
fetch('/api/users')
.then(response => response.json())
.then(data => setUsers(data));
}, []);
Render:
return (
<ul>
{users.map(user => (
<li key={user.id}>
{user.name}
</li>
))}
</ul>
);
Mental mapping-nya:
@foreach
↓
array.map()
Blade:
@foreach ($users as $user)
React:
users.map(user => ...)
Conditional Blade:
@if ($user->active)
React:
{user.active && (
<span>Active</span>
)}
10. Blade Directive vs JSX
Developer Laravel biasanya membutuhkan sedikit waktu untuk terbiasa dengan JSX.
Contoh Blade:
<h1>{{ $user->name }}</h1>
React:
<h1>{user.name}</h1>
Blade:
@if ($user->active)
Active
@endif
React:
{user.active && (
<span>Active</span>
)}
Blade:
@foreach ($users as $user)
<div>
{{ $user->name }}
</div>
@endforeach
React:
{users.map(user => (
<div key={user.id}>
{user.name}
</div>
))}
Jika sudah terbiasa dengan Blade, sebenarnya JSX cukup mudah dipahami.
Perbedaannya adalah JSX memungkinkan JavaScript hidup langsung di dalam struktur UI.
11. Composer vs NPM
Laravel developer sangat familiar dengan:
composer install
dan:
composer require laravel/sanctum
Di JavaScript ecosystem, analoginya adalah:
npm install
atau:
pnpm install
Menambahkan package:
npm install axios
atau:
pnpm add axios
Mental mapping:
Composer
≈
NPM / PNPM
composer.json
≈
package.json
vendor/
≈
node_modules/
Contoh package.json:
{
"dependencies": {
"react": "...",
"react-dom": "...",
"axios": "..."
}
}
Mirip dengan:
{
"require": {
"laravel/framework": "...",
"laravel/sanctum": "..."
}
}
12. Artisan vs NPM Scripts
Laravel:
php artisan serve
React/Vite:
npm run dev
Laravel:
php artisan test
JavaScript project:
npm run test
Konfigurasi command biasanya berada pada:
{
"scripts": {
"dev": "vite",
"build": "vite build",
"test": "vitest"
}
}
Jadi:
Artisan Command
≈
NPM Script
Walaupun secara arsitektur keduanya tidak sepenuhnya sama.
13. Service Container vs Module Import
Laravel memiliki dependency injection:
public function __construct(
UserService $userService
) {
$this->userService = $userService;
}
JavaScript banyak menggunakan module import:
import { userService } from './services/userService';
Kemudian:
userService.getUsers();
JavaScript modern sangat bergantung pada:
import
dan:
export
Contohnya:
export function getUsers() {
// ...
}
Di file lain:
import { getUsers } from './users';
Bagi developer PHP, konsep ini tidak asing jika sudah terbiasa menggunakan:
use App\Services\UserService;
14. Namespace PHP vs JavaScript Modules
PHP:
namespace App\Services;
class UserService
{
}
Kemudian:
use App\Services\UserService;
JavaScript:
export class UserService {
}
Kemudian:
import { UserService }
from './services/UserService';
Mental model:
PHP Namespace
≈
JavaScript Module
Walaupun implementasi dan mekanismenya berbeda.
15. Middleware Tetap Berada di Backend
Developer Laravel jangan terburu-buru mencoba memindahkan seluruh konsep middleware ke React.
Laravel:
Route::middleware('auth')->group(function () {
});
Middleware merupakan bagian dari keamanan backend.
React bisa melakukan:
if (!user) {
return <Navigate to="/login" />;
}
Tetapi ini hanya UX protection.
Bukan security.
User tetap bisa memanggil API menggunakan:
curl
atau Postman.
Karena itu authorization tetap harus dilakukan di server.
React
│
├── Hide menu
├── Redirect user
└── Disable button
Laravel
│
├── Authentication
├── Authorization
├── Policy
└── Permission enforcement
Prinsip penting:
Frontend boleh menentukan apa yang terlihat oleh pengguna, tetapi backend harus menentukan apa yang boleh dilakukan pengguna.
16. Dari Session-Based App ke API-Based Application
Laravel tradisional sering menggunakan:
Browser
↓
Laravel Session
↓
Blade
Saat menggunakan React, arsitektur sering berubah menjadi:
React
↓
API
↓
Laravel
↓
Database
Authentication bisa menggunakan:
Session Cookie
Sanctum
OAuth
OIDC
JWT
Untuk aplikasi React + Laravel dalam first-party application, cookie-based authentication seperti Laravel Sanctum sering menjadi pilihan yang nyaman.
Yang berubah bukan hanya teknologi.
Boundary aplikasi menjadi lebih jelas.
Frontend
Presentation
Interaction
State UI
────────────── API ──────────────
Backend
Authentication
Authorization
Business Logic
Database
Validation
17. Validation: Jangan Memilih Frontend atau Backend
Laravel:
$request->validate([
'name' => ['required'],
'email' => ['required', 'email']
]);
React juga bisa melakukan validation.
Misalnya:
if (!name) {
setError('Nama wajib diisi');
}
Tetapi frontend validation tidak menggantikan backend validation.
Gunakan keduanya.
Frontend Validation
↓
Better User Experience
Backend Validation
↓
Data Integrity + Security
React:
"Email tidak valid"
Laravel:
"Request ini memang tidak boleh masuk"
18. Konsep yang Paling Penting: Data Flow
Developer Laravel biasanya berpikir dalam request lifecycle.
Request
↓
Route
↓
Middleware
↓
Controller
↓
Service
↓
Model
↓
Response
Developer React harus terbiasa berpikir dalam data flow.
State
↓
Component
↓
UI
↓
User Action
↓
Event
↓
State berubah
↓
UI berubah
Contohnya:
products = []
React menampilkan:
Loading...
API selesai:
products = [
Product A,
Product B
]
React kemudian menampilkan:
Product A
Product B
Tidak ada command khusus:
refreshUI();
Kita cukup mengubah state.
React yang melakukan sinkronisasi UI.
19. useEffect: Konsep yang Sering Membingungkan Developer Backend
Misalnya component pertama kali tampil dan kita ingin mengambil data.
useEffect(() => {
fetchUsers();
}, []);
Secara sederhana bisa dibaca:
Setelah component tampil, jalankan
fetchUsers().
Tetapi jangan berpikir bahwa useEffect adalah:
Controller
atau:
Middleware
useEffect digunakan untuk melakukan sinkronisasi dengan sesuatu di luar proses render React.
Misalnya:
- request API
- browser event
- timer
- third-party library
- external subscription
Contoh:
useEffect(() => {
document.title = `Users: ${users.length}`;
}, [users]);
Setiap users berubah:
users berubah
↓
effect dijalankan
Namun developer React modern sebaiknya tidak menggunakan useEffect untuk semua logic.
Gunakan hanya ketika memang berhubungan dengan external system atau synchronization.
20. Salah Satu Perubahan Besar: Server State vs Client State
Pada awal belajar React, developer sering memasukkan semua data ke:
useState()
Padahal ada dua jenis state yang perlu dibedakan.
Client State
State yang hanya berkaitan dengan UI.
Contoh:
Sidebar open?
Modal open?
Selected tab?
Dark mode?
Gunakan:
useState()
atau state manager jika kompleks.
Server State
Data yang berasal dari backend.
Contohnya:
users
orders
products
invoices
customers
Untuk data seperti ini, aplikasi modern biasanya menggunakan tools seperti TanStack Query.
Contoh:
const { data, isLoading } = useQuery({
queryKey: ['users'],
queryFn: getUsers
});
TanStack Query mengurus:
- loading
- cache
- refetch
- retry
- stale data
- synchronization
Ini mirip memiliki layer yang khusus mengatur hubungan frontend dengan API.
21. React Bukan Tentang Redux
Beberapa developer yang pertama kali belajar React menemukan tutorial seperti:
React
+
Redux
+
Redux Saga
+
Reselect
+
Axios
Kemudian menganggap React sangat kompleks.
Padahal aplikasi modern tidak harus dimulai dari Redux.
Mulailah dari:
React
↓
useState
↓
Props
↓
TanStack Query
Baru tambahkan global state jika memang dibutuhkan.
Misalnya:
Zustand
Redux Toolkit
Jotai
Untuk banyak aplikasi bisnis, kombinasi:
React
+
TanStack Query
+
Zustand
sudah sangat nyaman.
22. Struktur Project React untuk Developer Laravel
Developer Laravel biasanya menyukai struktur project yang predictable.
Struktur feature-based cukup mudah dipahami:
src/
│
├── components/
│ ├── Button.jsx
│ ├── Modal.jsx
│ └── Input.jsx
│
├── features/
│ │
│ ├── users/
│ │ ├── api/
│ │ ├── components/
│ │ ├── hooks/
│ │ └── pages/
│ │
│ └── orders/
│ ├── api/
│ ├── components/
│ ├── hooks/
│ └── pages/
│
├── layouts/
│
├── lib/
│
├── routes/
│
└── app.jsx
Jika dibandingkan Laravel:
Laravel
app/
├── Http/
├── Models/
├── Services/
└── Policies/
resources/
└── views/
routes/
React lebih bebas.
Namun semakin besar aplikasi, semakin penting kita membuat convention sendiri.
23. Contoh Arsitektur Laravel + React
Misalnya kita membangun aplikasi laundry.
Backend:
Laravel
POST /api/orders
GET /api/orders
GET /api/orders/{id}
PUT /api/orders/{id}
React:
pages/
├── OrderList.jsx
├── OrderDetail.jsx
└── OrderCreate.jsx
Request API:
export async function getOrders() {
const response =
await fetch('/api/orders');
return response.json();
}
Query:
function OrderList() {
const {
data: orders,
isLoading
} = useQuery({
queryKey: ['orders'],
queryFn: getOrders
});
if (isLoading) {
return <div>Loading...</div>;
}
return (
<div>
{orders.map(order => (
<OrderCard
key={order.id}
order={order}
/>
))}
</div>
);
}
Laravel tetap menangani:
OrderController
OrderService
OrderPolicy
Order Model
Database Transaction
React menangani:
Order List
Order Form
Order Detail
Modal
Loading
Notification
Interaction
Boundary-nya menjadi sangat jelas.
24. Mapping Laravel ke React Ecosystem
Untuk mempermudah transisi, berikut mental mapping yang bisa digunakan:
| Laravel / PHP | React / JavaScript |
|---|---|
| Blade | JSX |
| Blade Component | React Component |
| Component Attribute | Props |
| PHP Variable | let / const |
| Array | Array / Object |
@foreach |
.map() |
@if |
conditional expression |
| Composer | NPM / PNPM |
composer.json |
package.json |
vendor |
node_modules |
| PHP Namespace | ES Module |
use App\... |
import ... |
| Blade Form | React Form |
| Session UI State | React State |
| Laravel Route | React Router, untuk client-side routing |
| HTTP Client | fetch / Axios |
| Backend Collection | JavaScript Array |
| Controller response JSON | API data |
| Queue/Event backend | Tetap backend |
| Eloquent | Tetap backend / ORM JavaScript jika pindah full-stack |
| Laravel Validation | Backend validation |
| React Form Validation | Frontend validation |
| Redis Cache | Tetap server infrastructure |
Tabel tersebut bukan mapping satu-ke-satu secara teknis.
Tujuannya adalah membantu membangun mental model.
25. JavaScript yang Harus Dikuasai Sebelum React
Developer PHP tidak perlu menguasai seluruh JavaScript sebelum mulai React.
Tetapi ada beberapa konsep yang wajib nyaman digunakan.
const dan let
const name = 'Gugun';
let count = 0;
count++;
Biasanya gunakan const sebagai default.
Gunakan let ketika nilainya memang perlu direassign.
Object
PHP:
$user = [
'name' => 'Gugun',
'email' => 'gugun@example.com'
];
JavaScript:
const user = {
name: 'Gugun',
email: 'gugun@example.com'
};
Mengaksesnya:
user.name
Array
PHP:
$users = [
'Andi',
'Budi',
'Citra'
];
JavaScript:
const users = [
'Andi',
'Budi',
'Citra'
];
map
const users = [
{ id: 1, name: 'Andi' },
{ id: 2, name: 'Budi' }
];
const names = users.map(
user => user.name
);
React sangat sering menggunakan map().
Destructuring
const user = {
name: 'Gugun',
email: 'gugun@example.com'
};
const {
name,
email
} = user;
Daripada:
const name = user.name;
const email = user.email;
React menggunakan destructuring hampir di mana-mana.
Spread Operator
const user = {
name: 'Gugun',
email: 'gugun@example.com'
};
Update:
const updatedUser = {
...user,
name: 'Gugun M'
};
Hasilnya:
{
name: 'Gugun M',
email: 'gugun@example.com'
}
Konsep ini sangat penting untuk state React.
Arrow Function
PHP:
function ($user) {
return $user['name'];
}
JavaScript:
(user) => {
return user.name;
}
Bisa dipersingkat:
user => user.name
Async/Await
PHP:
$response = $client->get('/users');
JavaScript:
const response =
await fetch('/api/users');
const users =
await response.json();
Frontend hampir selalu melakukan operasi asynchronous.
Karena itu Promise, async, dan await wajib dipahami.
26. Jangan Membawa Semua Kebiasaan Laravel ke React
Kesalahan umum saat berpindah teknologi adalah mencoba membuat teknologi baru terlihat persis seperti teknologi lama.
Contohnya membuat struktur:
controllers/
models/
services/
views/
di React hanya karena Laravel memiliki struktur tersebut.
React memiliki mental model berbeda.
React lebih cocok berpikir berdasarkan:
Feature
↓
Component
↓
State
↓
Data
↓
Interaction
Misalnya:
features/
└── orders/
├── OrderList.jsx
├── OrderForm.jsx
├── OrderDetail.jsx
├── order.api.js
└── order.hooks.js
Daripada memaksakan MVC frontend.
27. React Mengubah Cara Kita Melihat UI
Di jQuery atau Blade tradisional, kita sering berpikir:
$("#loading").show();
$("#button").hide();
$("#result").html(data);
Artinya kita memberi perintah kepada DOM:
tampilkan ini
sembunyikan itu
ubah text ini
React berbeda.
Kita tidak mengatakan:
sembunyikan loading
Kita mengatakan:
isLoading = false
Kemudian React menghitung bagaimana UI seharusnya terlihat.
Contoh:
return (
<>
{isLoading && (
<Loading />
)}
{!isLoading && (
<UserList />
)}
</>
);
Ini disebut declarative UI.
Bukan:
Bagaimana cara mengubah UI?
Tetapi:
Dengan state saat ini, UI seharusnya terlihat seperti apa?
Perubahan mental model ini adalah salah satu hal paling penting ketika belajar React.
28. Laravel Developer Justru Memiliki Banyak Keuntungan
Developer Laravel sebenarnya memiliki fondasi yang sangat kuat untuk masuk ke React.
Anda sudah mengerti:
- routing
- HTTP
- REST API
- authentication
- authorization
- database
- validation
- separation of concerns
- design pattern
- dependency management
- testing
- application architecture
Sehingga yang perlu dipelajari bukan lagi:
"Bagaimana aplikasi web bekerja?"
Tetapi:
"Bagaimana browser-side application bekerja?"
Ini jauh lebih mudah daripada belajar web development dari nol.
29. Learning Path yang Disarankan
Tidak perlu belajar seluruh JavaScript ecosystem sekaligus.
Gunakan urutan berikut.
Tahap 1 — JavaScript Fundamental
Kuasai:
const / let
array
object
function
arrow function
map
filter
find
destructuring
spread operator
module import/export
Promise
async/await
Jangan langsung masuk Redux.
Tahap 2 — React Fundamental
Pelajari:
Component
JSX
Props
State
Event
Conditional rendering
List rendering
Form
useState
useEffect
Targetnya adalah bisa membuat:
CRUD sederhana
Tahap 3 — React + Laravel API
Buat project:
Laravel REST API
+
React Frontend
Contohnya:
Employee Management
Inventory
Todo App
Expense Tracker
Order Management
Implementasikan:
Login
CRUD
Pagination
Search
Validation
Authorization
Tahap 4 — Server State
Pelajari:
TanStack Query
Pahami:
query
mutation
cache
invalidate
loading
error
refetch
Ini akan mengubah cara kita mengelola data API.
Tahap 5 — Routing
Gunakan:
React Router
Pelajari:
nested route
layout
route parameter
protected route
Tahap 6 — State Management
Baru setelah benar-benar dibutuhkan, pelajari:
Zustand
atau:
Redux Toolkit
Jangan memasukkan semua state ke global state.
Tahap 7 — TypeScript
Setelah cukup nyaman dengan JavaScript dan React, masuk ke TypeScript.
Contoh:
type User = {
id: number;
name: string;
email: string;
};
Kemudian:
function UserCard({
user
}: {
user: User
}) {
return (
<div>
{user.name}
</div>
);
}
Untuk aplikasi skala besar, TypeScript sangat membantu.
Developer PHP yang pernah menggunakan strict typing biasanya relatif cepat beradaptasi.
30. Bagaimana Jika Ingin Pindah Full JavaScript?
Jika tujuan akhirnya bukan sekadar React, tetapi ingin berpindah dari Laravel menuju JavaScript full-stack, learning path-nya sebaiknya:
JavaScript
↓
React
↓
TypeScript
↓
Node.js
↓
Next.js / Backend Framework
↓
ORM
↓
Database
Beberapa pilihan backend JavaScript:
Express
Fastify
NestJS
Hono
Next.js
Untuk developer Laravel, NestJS sering terasa familiar karena memiliki konsep seperti:
Controller
Service
Module
Guard
Interceptor
Dependency Injection
Sedangkan jika menginginkan framework ringan:
Hono
atau:
Fastify
bisa sangat menarik.
31. Laravel Developer Mungkin Lebih Nyaman Memulai dari Next.js
Ada satu hal menarik.
Bagi developer Laravel, terkadang Next.js lebih mudah dipahami daripada React SPA murni.
Karena Next.js memberikan struktur yang lebih opinionated.
React murni:
React
+
Router
+
Data fetching
+
Build tool
+
Architecture decision
Next.js menyediakan lebih banyak konvensi.
Contohnya:
app/
├── users/
│ ├── page.tsx
│ └── [id]/
│ └── page.tsx
│
└── layout.tsx
Developer Laravel bisa melihat kemiripannya dengan:
Route
+
Controller
+
View
Walaupun konsep implementasinya tetap berbeda.
Jika targetnya membangun aplikasi full-stack JavaScript modern, jalur:
Laravel
↓
JavaScript
↓
React
↓
Next.js
cukup natural.
32. Hal yang Tidak Perlu Ditinggalkan dari Laravel
Belajar React bukan berarti Laravel harus ditinggalkan.
Bahkan stack:
Laravel API
+
React
adalah kombinasi yang sangat solid.
Laravel sangat kuat pada:
Authentication
Authorization
Queue
Scheduling
Eloquent
Database migration
Validation
Email
Notification
Business Logic
API
React sangat kuat pada:
Interactive UI
Complex form
Dashboard
SPA
Dynamic interface
Reusable components
Frontend state
Tidak ada kewajiban memilih salah satu.
Gunakan teknologi berdasarkan problem yang ingin diselesaikan.
33. Cara Berpikir Sebelum dan Sesudah React
Developer Laravel tradisional mungkin berpikir:
Route apa?
Controller mana?
Data apa yang dikirim ke Blade?
View mana?
Setelah masuk React, tambahkan pertanyaan:
Apa component-nya?
Siapa pemilik state?
Data berasal dari mana?
Apakah data ini client state atau server state?
Apa yang menyebabkan component berubah?
Apa yang terjadi ketika user berinteraksi?
Inilah perubahan terbesar.
Bukan syntax.
Bukan PHP menjadi JavaScript.
Tetapi perubahan dari:
Request-oriented thinking
menjadi kombinasi:
Request-oriented thinking
+
State-oriented thinking
+
Component-oriented thinking
34. Kesimpulan
Bagi developer Laravel, pindah ke React sebenarnya tidak berarti memulai lagi dari nol.
Sebagian besar konsep fundamental software engineering tetap sama.
Yang berubah adalah layer tempat kita bekerja dan cara kita memandang UI.
Jika Laravel mengajarkan kita berpikir:
Request
↓
Controller
↓
Business Logic
↓
Database
↓
Response
React mengajarkan kita berpikir:
State
↓
Component
↓
UI
↓
Interaction
↓
State berubah
Ketika kedua mental model tersebut sudah dipahami, kita bisa melihat web application secara jauh lebih lengkap:
USER
│
↓
React Component
│
State
│
API Call
│
↓
Laravel Route
│
Middleware
│
Controller
│
Service
│
Eloquent
│
↓
Database
Developer Laravel sebenarnya sudah menguasai setengah dari diagram tersebut.
Yang perlu dilakukan hanyalah mempelajari bagian di atas HTTP request: bagaimana browser mengelola state, component, event, dan rendering.
Karena itu, jangan memulai perjalanan belajar React dengan pertanyaan:
"Bagaimana caranya meninggalkan PHP?"
Mulailah dengan:
"Bagaimana cara melengkapi kemampuan backend saya dengan pemahaman frontend modern?"
Ketika pola pikir tersebut sudah terbentuk, perpindahan dari Laravel ke React tidak lagi terasa seperti berpindah dunia.
Kita hanya sedang melihat aplikasi web yang sama dari sisi yang berbeda.