What is Laravel?
Laravel is a powerful PHP web application framework with elegant syntax. It follows the MVC (Model-View-Controller) architecture and provides robust tools for routing, authentication, caching, and database management.
Why Laravel?
- Elegant Syntax: Clean, readable code
- MVC Architecture: Well-organized structure
- Rich Ecosystem: Forge, Vapor, Nova, Jetstream
- Built-in Features: Authentication, queues, events
- Active Community: Extensive documentation
Installation Steps
Step 1: Install Composer
Download from getcomposer.org
composer --version
Step 2: Create Project
composer create-project laravel/laravel my-project
Step 3: Configure .env
Set database credentials and app settings
Step 4: Run Server
php artisan serve
Project Structure
my-project/
├── app/
│ ├── Http/Controllers/ # Controllers
│ ├── Models/ # Eloquent models
│ └── Providers/ # Service providers
├── routes/
│ ├── web.php # Web routes
│ └── api.php # API routes
├── database/
│ ├── migrations/ # Database migrations
│ └── seeders/ # Database seeders
├── resources/
│ └── views/ # Blade templates
└── .env # Environment config
Routing
// routes/web.php
use Illuminate\Support\Facades\Route;
// Basic route
Route::get('/', function () {
return view('welcome');
});
// Route with parameter
Route::get('/user/{id}', function ($id) {
return "User ID: " . $id;
});
// Route to controller
Route::get('/users', [UserController::class, 'index']);
// Named route
Route::get('/profile', [ProfileController::class, 'show'])
->name('profile');
// Route groups
Route::prefix('admin')->middleware('auth')->group(function () {
Route::get('/dashboard', [AdminController::class, 'dashboard']);
});
Controllers
// Create controller
php artisan make:controller UserController
// app/Http/Controllers/UserController.php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function index()
{
$users = User::all();
return view('users.index', compact('users'));
}
public function store(Request $request)
{
$validated = $request->validate([
'name' => 'required|max:255',
'email' => 'required|email|unique:users'
]);
$user = User::create($validated);
return redirect()->route('users.show', $user->id);
}
}
Eloquent ORM
// Create model
php artisan make:model Post -m
// app/Models/Post.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
protected $fillable = ['title', 'content', 'user_id'];
// Relationships
public function user()
{
return $this->belongsTo(User::class);
}
public function comments()
{
return $this->hasMany(Comment::class);
}
}
// Usage
$posts = Post::all();
$post = Post::find(1);
$posts = Post::with('user')->where('user_id', 1)->get();
// Create
Post::create([
'title' => 'My Post',
'content' => 'Content here'
]);
Migrations
// Create migration
php artisan make:migration create_posts_table
// Migration file
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained();
$table->string('title');
$table->text('content');
$table->timestamps();
});
}
// Run migrations
php artisan migrate
Blade Templates
{{-- resources/views/users/index.blade.php --}}
@extends('layouts.app')
@section('content')
<h1>Users</h1>
@foreach($users as $user)
<p>{{ $user->name }}</p>
@endforeach
@endsection
Essential Artisan Commands
php artisan serve # Start development server
php artisan migrate # Run migrations
php artisan make:model User # Create model
php artisan make:controller UserController
php artisan make:migration create_users_table
php artisan cache:clear # Clear cache
php artisan config:cache # Cache config
php artisan tinker # Interactive shell
Laravel Best Practices 2025
Keep Your Laravel Updated
Always use the latest stable Laravel version for:
- Improved Security: Regular security patches and fixes
- Better Performance: Optimized code and faster load times
- New Features: Access to latest functionality
- Package Compatibility: Better support for community packages
Validation Best Practices
// Form Request Validation (Recommended)
php artisan make:request StoreUserRequest
// app/Http/Requests/StoreUserRequest.php
class StoreUserRequest extends FormRequest
{
public function authorize()
{
return true;
}
public function rules()
{
return [
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users',
'password' => 'required|min:8|confirmed',
'age' => 'required|integer|min:18'
];
}
public function messages()
{
return [
'email.required' => 'Email is required',
'password.min' => 'Password must be at least 8 characters'
];
}
}
// Use in Controller
public function store(StoreUserRequest $request)
{
$user = User::create($request->validated());
return response()->json($user, 201);
}
Single Action Controllers
Keep controllers focused and organized by using single action controllers for complex operations.
// Instead of multiple methods in one controller
class UserController
{
public function store() { }
public function update() { }
public function sendEmail() { }
}
// Use single action controllers
class StoreUserController
{
public function __invoke(Request $request)
{
// Handle user creation
}
}
class SendUserEmailController
{
public function __invoke(User $user)
{
// Handle email sending
}
}
Query Optimization
Avoid N+1 Query Problem
Always use eager loading to prevent performance issues:
// BAD - N+1 Problem (100 users = 101 queries)
$users = User::all();
foreach ($users as $user) {
echo $user->profile->bio;
}
// GOOD - Eager Loading (100 users = 2 queries)
$users = User::with('profile')->get();
foreach ($users as $user) {
echo $user->profile->bio;
}
// Multiple relationships
$posts = Post::with(['user', 'comments', 'tags'])->get();
// Nested relationships
$users = User::with('posts.comments.author')->get();
Caching Strategies
// Cache configuration
php artisan config:cache
// Cache routes
php artisan route:cache
// Query result caching
$users = Cache::remember('users', 3600, function () {
return User::all();
});
// Cache tags (Redis/Memcached)
Cache::tags(['users', 'premium'])->put('key', $value, 3600);
Cache::tags(['users'])->flush();
Security Best Practices
Essential Security Measures:
- Always use HTTPS in production
- Validate all inputs with Form Requests
- Use CSRF protection (@csrf in forms)
- Implement rate limiting on API routes
- Hash passwords with bcrypt/argon2
- Never commit .env file to version control
- Use policies for authorization
- Enable 2FA for admin accounts
Testing in Laravel
// Feature Test
php artisan make:test UserTest
// tests/Feature/UserTest.php
class UserTest extends TestCase
{
use RefreshDatabase;
public function test_user_can_be_created()
{
$response = $this->post('/api/users', [
'name' => 'John Doe',
'email' => 'john@example.com',
'password' => 'password123'
]);
$response->assertStatus(201);
$this->assertDatabaseHas('users', [
'email' => 'john@example.com'
]);
}
}
// Run tests
php artisan test