# Quick Reference Guide - Modern Code Standards

## 🎯 How to Add a New Feature

### 1. Create Form Request Class
```bash
Location: app/Http/Requests/
Filename: [Action][ModelName]Request.php

Example: StoreProductRequest.php
```

```php
<?php
namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Auth;

class StoreProductRequest extends FormRequest
{
    public function authorize(): bool
    {
        return Auth::check() && Auth::user()?->is_admin;
    }

    public function rules(): array
    {
        return [
            'field_name' => 'required|string|max:255',
            // Add your validation rules
        ];
    }

    public function messages(): array
    {
        return [
            'field_name.required' => 'Field name is required.',
        ];
    }
}
```

### 2. Update Controller Method
```php
use App\Http\Requests\StoreProductRequest;

public function store(StoreProductRequest $request): RedirectResponse
{
    try {
        $data = $request->validated();
        
        // Process data
        Model::create($data);
        
        return redirect()->route('route.name')
            ->with('success', 'Item created successfully!');
    } catch (\Exception $e) {
        return back()->withInput()
            ->with('error', 'An error occurred. Please try again.');
    }
}
```

### 3. Update Blade View
```blade
@extends('layouts.admin')

@section('header')
    <h1 class="text-2xl font-semibold">Create Item</h1>
@endsection

@section('content')
<!-- Alert Messages -->
<x-alert-messages />
<x-error-messages />

<div class="bg-white shadow-lg rounded-lg">
    <form action="{{ route('route.store') }}" method="POST">
        @csrf
        
        <!-- Form fields with validation -->
        <div>
            <label for="name">Name <span class="text-red-500">*</span></label>
            <input type="text" name="name" id="name" 
                value="{{ old('name') }}"
                @error('name') class="border-red-500" @enderror>
            @error('name')
                <p class="text-red-600 text-sm">{{ $message }}</p>
            @enderror
        </div>
        
        <!-- More fields... -->
        
        <button type="submit">Create</button>
    </form>
</div>
@endsection
```

---

## 📝 Validation Rules Cheat Sheet

```php
// Text Fields
'name' => 'required|string|max:255|unique:table,column'
'email' => 'required|email|unique:users,email'
'slug' => 'required|string|unique:products,slug'

// Numbers
'price' => 'required|numeric|min:0|max:999999.99'
'quantity' => 'required|integer|min:1'
'discount' => 'nullable|numeric|min:0|max:100'

// Files
'image' => 'nullable|image|mimes:jpeg,png,gif,webp|max:2048'
'document' => 'nullable|file|mimes:pdf,doc,docx|max:5000'

// Arrays
'categories' => 'required|array|min:1'
'categories.*' => 'integer|exists:categories,id'

// Dates
'birth_date' => 'required|date|before:today'
'event_date' => 'required|date|after:now'

// Select Options
'status' => 'required|in:active,inactive,pending'
'role' => 'required|in:admin,user,moderator'

// Password
'password' => 'required|string|min:8|confirmed'
'password_confirmation' => 'required|string|min:8'
```

---

## 🎨 Form Component Examples

### Text Input with Error
```blade
<div>
    <label for="name" class="block text-sm font-medium mb-2">
        Field Name <span class="text-red-500">*</span>
    </label>
    <input type="text" name="name" id="name" 
        value="{{ old('name') }}"
        class="w-full p-2.5 border @error('name') border-red-500 @else border-gray-300 @enderror rounded-md">
    @error('name')
        <p class="text-red-600 text-sm mt-1">{{ $message }}</p>
    @enderror
</div>
```

### Select Dropdown
```blade
<div>
    <label for="status" class="block text-sm font-medium mb-2">
        Status <span class="text-red-500">*</span>
    </label>
    <select name="status" id="status" class="w-full p-2.5 border border-gray-300 rounded-md">
        <option value="">Select Status</option>
        <option value="active" {{ old('status') == 'active' ? 'selected' : '' }}>Active</option>
        <option value="inactive" {{ old('status') == 'inactive' ? 'selected' : '' }}>Inactive</option>
    </select>
</div>
```

### File Input
```blade
<div>
    <label for="image" class="block text-sm font-medium mb-2">
        Image <span class="text-gray-500 text-xs">(Max 2MB)</span>
    </label>
    <input type="file" name="image" id="image" accept="image/*"
        class="w-full text-sm file:py-2 file:px-4 file:rounded-md file:bg-indigo-50 file:text-indigo-700">
    @error('image')
        <p class="text-red-600 text-sm mt-1">{{ $message }}</p>
    @enderror
</div>
```

### Multi-Select (with Select2)
```blade
<div>
    <label for="categories" class="block text-sm font-medium mb-2">
        Categories <span class="text-red-500">*</span>
    </label>
    <select id="categories" name="categories[]" multiple class="w-full">
        @foreach($categories as $category)
            <option value="{{ $category->id }}" 
                {{ collect(old('categories'))->contains($category->id) ? 'selected' : '' }}>
                {{ $category->name }}
            </option>
        @endforeach
    </select>
</div>

@section('scripts')
<script>
    $(document).ready(function() {
        $('#categories').select2({
            placeholder: 'Select categories',
            allowClear: true,
            width: '100%'
        });
    });
</script>
@endsection
```

---

## 🔐 Authorization in Form Requests

```php
public function authorize(): bool
{
    // Only authenticated admin users
    return Auth::check() && Auth::user()?->is_admin;
    
    // Only own resources
    return $this->route('product')->user_id === Auth::id();
    
    // Using policies
    return Auth::user()?->can('update', $this->route('product'));
}
```

---

## 🚨 Error Handling Pattern

```php
public function store(StoreProductRequest $request): RedirectResponse
{
    try {
        // Get validated data
        $data = $request->validated();
        
        // Process
        $model = Model::create($data);
        
        // Handle relationships
        if (isset($data['items'])) {
            $model->items()->sync($data['items']);
        }
        
        // Success response
        return redirect()->route('index')
            ->with('success', 'Item created successfully!');
            
    } catch (\Exception $e) {
        // Log error (optional)
        \Log::error('Create failed: ' . $e->getMessage());
        
        // Error response
        return back()->withInput()
            ->with('error', 'An error occurred. Please try again.');
    }
}
```

---

## 📱 Responsive Grid Examples

```blade
<!-- Two columns on desktop, one on mobile -->
<div class="grid grid-cols-12 gap-6">
    <div class="col-span-12 sm:col-span-6">
        <!-- Left column -->
    </div>
    <div class="col-span-12 sm:col-span-6">
        <!-- Right column -->
    </div>
</div>

<!-- Three columns on desktop -->
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6">
    <!-- Cards here -->
</div>
```

---

## 🎯 Type Hints Cheat Sheet

```php
// Return types
public function index(): View
public function store(Request $request): RedirectResponse
public function getData(): array
public function getName(): string
public function getCount(): int
public function isActive(): bool

// Parameter types
public function process(Product $product): void
public function save(Request $request, Category $category): void
public function filter(?string $search = null): Collection
```

---

## 🔍 Debugging Tips

### Check Validation Errors
```blade
@if($errors->any())
    @foreach($errors->all() as $error)
        <p>{{ $error }}</p>
    @endforeach
@endif
```

### Check Old Input
```blade
{{ old('field_name') }}
{{ old('field_name', 'default_value') }}
```

### Check Session Data
```php
// In controller
dd(session()->all());

// In blade
{{ var_dump(session()->all()) }}
```

### Check Validation Rules
```php
// In Form Request
public function rules(): array
{
    return [
        // Add your rules here
    ];
}
```

---

## 📚 File Structure for New Features

```
For a new "Review" feature, create:

app/Http/Requests/
├── StoreReviewRequest.php
└── UpdateReviewRequest.php

app/Http/Controllers/
├── ReviewController.php
└── Admin/ReviewController.php

app/Models/
└── Review.php

resources/views/
├── reviews/
│   ├── index.blade.php
│   └── show.blade.php
└── admin/reviews/
    ├── index.blade.php
    ├── create.blade.php
    └── edit.blade.php

database/migrations/
└── create_reviews_table.php
```

---

## ✅ Pre-Submission Checklist

Before submitting code:
- [ ] Form Request created with validation rules
- [ ] Controller uses Form Request
- [ ] All methods have return type hints
- [ ] All methods documented with PHPDoc
- [ ] Try-catch around database operations
- [ ] Error messages are user-friendly
- [ ] Form displays error messages
- [ ] Form preserves old input
- [ ] Mobile responsive
- [ ] No console errors
- [ ] Tested with valid/invalid input

---

## 🔗 Useful Commands

```bash
# Create Form Request
php artisan make:request StoreProductRequest

# Create Controller
php artisan make:controller ProductController --model=Product

# Create Model
php artisan make:model Product -m

# Run migrations
php artisan migrate

# Clear cache
php artisan cache:clear

# Serve application
php artisan serve
```

---

**Remember:** Keep code clean, commented, and user-friendly! 🚀
