When Blade templates have repeating HTML, choose from @include, Component, or ob_start. ob_start is the only option that requires no additional template files.
Build an Alpine.js errors plugin that mirrors the Laravel MessageBag API, so 422 AJAX validation errors display just as easily as the @error directive.
Laravel Vite defaults to localhost, breaking assets on custom domains. Set server.host and server.hmr.host in vite.config.js, or use valetTls for Valet HTTPS.
Use Composer 2's InstalledVersions::getVersion() to check package versions at runtime for feature flags or compatibility — no lock file parsing required.
MySQL's IF() fails on SQLite. Laravel 10's Expression interface generates Grammar-specific SQL, encapsulating cross-database differences into a reusable class.
SQLite throws "no such function" for MySQL-specific functions like FIELD. Use PDO sqliteCreateFunction in TestCase setUp to register them and make tests pass.
Save a model silently with saveQuietly, then selectively dispatch created or other Eloquent model events via a custom Builder macro fire method in Laravel.
Without s3:ListBucket in the IAM policy, S3 returns 403 for missing files, making [Flysystem](https://flysystem.thephpleague.com) throw UnableToCheckFileExistence. Adding the permission resolves it.
PHPUnit prints "Waiting for thread pool to idle before forking" when the gRPC extension is too new. Downgrade grpc to 1.49.0 to eliminate the warning.
Install Docker CE in WSL2 without Docker Desktop: add your user to the docker group to run without sudo and enable systemd for automatic Docker startup on boot.