Models
, Controllers
, Services
, Jobs
, etc.).resources/js
folder.app/
Models/
Http/
Controllers/
Services/
resources/
js/
components/
ui/
layouts/
pages/
utils/
views/
routes/
web.php
api.php
auth.php
// Good (React)
interface LoginProps {
status?: string;
canResetPassword: boolean;
}
export default fanction LoginForm({status, canResetPassword}: LoginProps){
return (
<div>LoginForm</div>
)
}
// Bad
const user_card = (props) => {
return <div>{props.username}</div>;
};
'
over double quotes "
in JavaScript/TypeScript.Auto format using Laravel Pint learn more
./vendor/bin/pint --repair
resources/views/app.blade.php
<!DOCTYPE html>
<html lang="en">
<head>
@viteReactRefresh
@vite(['resources/js/app.tsx'])
</head>
<body>
@inertia
</body>
</html>
fillable
or guarded
attributes to prevent mass assignment vulnerabilities.class User extends Model {
protected $fillable = ['name', 'email'];
public function posts() {
return $this->hasMany(Post::class);
}
}
/**
* Display the user's Account form.
*/
public function edit(Request $request): Response
{
return Inertia::render('account/edit', [
'mustVerifyEmail' => $request->user() instanceof MustVerifyEmail,
'status' => session('status'),
]);
}
routes/web.php
.Route::group
and middleware.// Account
Route::middleware('auth')->group(function () {
Route::get('/account', [AccountController::class, 'edit'])->name('account.edit');
Route::patch('/account', [AccountController::class, 'update'])->name('account.update');
Route::delete('/account', [AccountController::class, 'destroy'])->name('account.destroy');
});
Props
interfaces to define component props.// Custom Hook
import { useState } from 'react';
function useCounter(initialValue: number) {
const [count, setCount] = useState(initialValue);
const increment = () => setCount(count + 1);
return { count, increment };
}
// Component
export default function Counter(){
const { count, increment } = useCounter(0);
return (
<div>
<p>{count}</p>
<button onClick={increment}>Increment</button>
</div>
);
};
for Backend learn more
php artisan make:test AccountTest
// PHPUnit Test
public function test_account_page_is_displayed(): void
{
$user = User::factory()->create();
$response = $this
->actingAs($user)
->get('/account');
$response->assertOk();
}
php artisan test
for Frontend
// Jest Test
import { render, screen } from '@testing-library/react';
import Counter from './Counter';
test('renders counter', () => {
render(<Counter />);
const buttonElement = screen.getByText(/increment/i);
expect(buttonElement).toBeInTheDocument();
});
eslint
, phpcs
) and formatters (prettier
, phpcbf
) to maintain code quality.