Laravel provides a family of path helper functions, each resolving to a specific directory relative to the actual project's real location on disk — using these instead of a hardcoded absolute path is what keeps the code portable across different servers and deployment environments.
The application's root path
base_path(); // e.g. /var/www/myapp
base_path('composer.json'); // /var/www/myapp/composer.json
The public directory
public_path(); // /var/www/myapp/public
public_path('images/logo.png'); // /var/www/myapp/public/images/logo.png
public_path() is specifically the directory that's actually web-accessible — following the Apache virtual host pattern covered elsewhere on this site, this is exactly the directory a production web server's DocumentRoot should point to, never the application's base_path() root.
The storage directory
storage_path(); // /var/www/myapp/storage
storage_path('app/uploads'); // /var/www/myapp/storage/app/uploads
storage_path('logs/laravel.log');
The app directory (application source code)
app_path(); // /var/www/myapp/app
app_path('Models/Product.php');
The config, database, and resource directories
config_path(); // /var/www/myapp/config
database_path(); // /var/www/myapp/database
resource_path(); // /var/www/myapp/resources
Why these should always be used instead of a hardcoded absolute path
// WRONG — breaks the moment this code runs on a different server or path
$path = '/var/www/myapp/storage/app/uploads/photo.jpg';
// CORRECT — resolves correctly regardless of the actual deployment path
$path = storage_path('app/uploads/photo.jpg');
A hardcoded absolute path only works on the exact machine and directory structure it was written for — the moment the app is deployed to a different server, a different directory name, or run inside a container with a different filesystem layout, a hardcoded path silently breaks, while the path helpers above always resolve correctly relative to wherever the application actually lives.
Combining path helpers with the Storage facade
Storage::disk('local')->path('uploads/photo.jpg');
// equivalent to storage_path('app/uploads/photo.jpg')
Storage::disk()->path() resolves a Storage-relative path to its actual absolute filesystem path — useful when a lower-level function (like PHP's native file_exists()) needs a genuine absolute path rather than the disk-relative path Storage:: methods normally take.
Getting the current environment's base URL, as a related concept
url('/'); // the application's full base URL, e.g. https://example.com
config('app.url'); // the raw configured APP_URL value
This is a genuinely separate concept from the filesystem path helpers above — url() and config('app.url') deal with the application's web-facing URL, while base_path() and its relatives deal with where the application's files actually live on the server's disk, and the two are not necessarily related at all.