Laravel Architecture¶
Laravel 11 is a PHP framework following the MVC pattern with a service container (IoC), service providers, facades, and Artisan CLI. Understanding the architecture is essential for working with laravel routing, laravel eloquent orm, laravel middleware, and all other framework components.
Key Facts¶
- Laravel uses the service container (IoC container) for dependency injection and class resolution
- Service providers bootstrap framework components; registered in
bootstrap/providers.php(Laravel 11) - Facades provide static-like access to container bindings (
Auth::check(),Route::get()) - Artisan is the CLI for scaffolding, migrations, cache clearing, and custom commands
.envfile stores environment-specific configuration (DB credentials, app key, debug mode)config/directory holds configuration files that read from.envviaenv()helper- Laravel 11 simplified the skeleton: fewer default files,
bootstrap/app.phpas the central config point - Request lifecycle: HTTP request ->
public/index.php-> service container -> middleware -> router -> controller -> response
Patterns¶
Directory structure (Laravel 11)¶
project/
app/
Http/
Controllers/ # request handlers
Middleware/ # custom middleware
Models/ # Eloquent models
Providers/ # service providers
bootstrap/
app.php # application bootstrap (middleware, routes, exceptions)
providers.php # registered service providers
config/ # configuration files
database/
migrations/ # database schema changes
seeders/ # test data seeders
public/
index.php # entry point (all requests route here)
resources/
views/ # Blade templates
routes/
web.php # web routes (session, CSRF)
api.php # API routes (stateless)
storage/ # logs, cache, compiled views
.env # environment variables
composer.json # dependencies
artisan # CLI entry point
Environment configuration¶
# .env file
APP_NAME=MyApp
APP_ENV=local
APP_DEBUG=true
APP_URL=http://myapp.test
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_practice
DB_USERNAME=root
DB_PASSWORD=
<?php
// Accessing config values
$debug = config('app.debug'); // reads config/app.php
$dbHost = config('database.connections.mysql.host');
$appName = env('APP_NAME', 'Laravel'); // with default fallback
// NEVER use env() outside config files - values are cached in production
Artisan CLI¶
# Scaffolding
php artisan make:controller PostController
php artisan make:controller Admin/MainController # subdirectory
php artisan make:model Post -m # model + migration
php artisan make:middleware AdminMiddleware
php artisan make:request StorePostRequest
# Database
php artisan migrate # run pending migrations
php artisan migrate:rollback # undo last batch
php artisan migrate:fresh # drop all tables + re-migrate
php artisan db:seed # run seeders
# Cache
php artisan config:cache # cache config (production)
php artisan route:cache # cache routes (production)
php artisan cache:clear # clear application cache
php artisan view:clear # clear compiled views
# Maintenance
php artisan down # maintenance mode
php artisan up # exit maintenance mode
# Custom commands
php artisan make:command SendEmails
Service container basics¶
<?php
// Binding
app()->bind(PaymentGateway::class, StripeGateway::class);
app()->singleton(Logger::class, fn() => new FileLogger('/var/log'));
// Resolution
$gateway = app(PaymentGateway::class);
$gateway = resolve(PaymentGateway::class);
// Automatic injection in controllers
class OrderController extends Controller {
public function store(Request $request, PaymentGateway $gateway) {
// $gateway is automatically resolved from container
}
}
Facades vs helper functions¶
<?php
// Facade
use Illuminate\Support\Facades\Auth;
Auth::check(); // is user authenticated?
Auth::user(); // get current user object
Auth::attempt($creds); // try to log in
// Equivalent helper function
auth()->check();
auth()->user();
auth()->attempt($creds);
// Both resolve the same underlying class from the container
Gotchas¶
| Symptom | Cause | Fix |
|---|---|---|
| Config changes not reflected | Config is cached | Run php artisan config:clear |
env() returns null in production | Config cache active, env() only works in config files | Use config() helper everywhere except config/*.php |
| Class not found after creating | Composer autoload not refreshed | Run composer dump-autoload |
Route [name] not defined | Route name misspelled or route not registered | Check php artisan route:list |
.env changes not applied | .env is not auto-reloaded | Restart server / clear config cache |
| CSRF token mismatch | Missing @csrf in form or session expired | Add @csrf blade directive to all POST forms |
See Also¶
- laravel routing - URL to controller mapping
- laravel middleware - request/response pipeline
- [[composer-and-autoloading]] - dependency management
- https://laravel.com/docs/11.x/structure
- https://laravel.com/docs/11.x/container
- https://laravel.com/docs/11.x/artisan