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