Integrating Swagger with Laravel for API documentation involves a few steps to set up Swagger UI and configure your endpoints for documentation. Swagger is popular for RESTful API documentation as it generates interactive, easily navigable documentation. Here’s a step-by-step guide on how to integrate Swagger with a Laravel application:
Prerequisites
Ensure you have the following:
- Laravel project installed (
composer create-project --prefer-dist laravel/laravel your_project_name
) - PHP version >= 7.4
- Composer
Step 1: Install Swagger Package
Install darkaonline/l5-swagger
, a popular package for integrating Swagger with Laravel.
Run the following command in your terminal:
composer require "darkaonline/l5-swagger"
Step 2: Publish Swagger Configuration
Once the package is installed, publish the configuration file to allow customization.
php artisan vendor:publish --provider "L5Swagger\L5SwaggerServiceProvider"
This command will generate a l5-swagger.php
config file in the config
directory and a swagger
folder in the public
directory, which is where Swagger UI assets will be stored.
Step 3: Configure Swagger in Laravel
Open the config/l5-swagger.php
file and update a few settings for your API. Some key settings to check:
-
default
: Set todefault
if you plan on using a single Swagger configuration. -
documentations
: Adjust any API information and set thepaths
andbasePath
for the routes. -
info
: Customize the API documentation information:
'info' => [
'title' => 'My API Documentation',
'description' => 'This is the API documentation for my Laravel application.',
'version' => '1.0.0',
'termsOfService' => 'http://swagger.io/terms/',
'contact' => [
'email' => 'contact@example.com',
],
'license' => [
'name' => 'Apache 2.0',
'url' => 'https://www.apache.org/licenses/LICENSE-2.0.html',
],
],
Step 4: Create Swagger Annotations
Swagger uses annotations to document each API endpoint. Install swagger-php
to enable annotations support.
composer require "zircote/swagger-php"
Now, in your controller methods, add Swagger annotations for documentation. Here’s an example for a UserController
:
use App\Models\User;
use Illuminate\Http\Request;
/**
* @OA\Get(
* path="/api/users",
* tags={"Users"},
* summary="Get list of users",
* description="Returns list of users",
* @OA\Response(
* response=200,
* description="successful operation"
* ),
* @OA\Response(
* response=400,
* description="Bad request"
* ),
* @OA\Response(
* response=404,
* description="Resource Not Found"
* )
* )
*/
public function index() {
return User::all();
}
This annotation describes an endpoint /api/users
, its response codes, and what each response represents.
Step 5: Generate Swagger Documentation
To generate the Swagger JSON documentation, run the following Artisan command:
php artisan l5-swagger:generate
This command generates a swagger.json
file in the storage/api-docs
folder. This file contains your documented endpoints in a JSON format readable by Swagger UI.
Step 6: View Swagger UI
To view your generated API documentation, navigate to:
http://your-domain.com/api/documentation
Here, you should see Swagger UI displaying your API endpoints, methods, and descriptions in an interactive format.
Step 7: Customize Swagger UI (Optional)
In the config/l5-swagger.php
file, you can make additional customizations, such as enabling/disable Swagger UI, updating theme colors, and setting custom paths.
Example of a Complete Controller with Annotations
Here's a complete UserController
example to demonstrate how multiple endpoints can be documented with Swagger annotations:
use App\Models\User;
use Illuminate\Http\Request;
class UserController extends Controller
{
/**
* @OA\Get(
* path="/api/users",
* tags={"Users"},
* summary="Get list of users",
* description="Returns list of users",
* @OA\Response(
* response=200,
* description="successful operation"
* ),
* @OA\Response(
* response=400,
* description="Bad request"
* )
* )
*/
public function index() {
return User::all();
}
/**
* @OA\Post(
* path="/api/users",
* tags={"Users"},
* summary="Create a new user",
* description="Create a new user in the system",
* @OA\RequestBody(
* required=true,
* @OA\JsonContent(
* required={"name","email"},
* @OA\Property(property="name", type="string", example="John Doe"),
* @OA\Property(property="email", type="string", example="john@example.com")
* ),
* ),
* @OA\Response(
* response=201,
* description="User created successfully"
* ),
* @OA\Response(
* response=400,
* description="Bad request"
* )
* )
*/
public function store(Request $request) {
$validated = $request->validate([
'name' => 'required|string',
'email' => 'required|string|email|unique:users',
]);
$user = User::create($validated);
return response()->json($user, 201);
}
}
Step 8: Update Routes to Match Documentation
Ensure your routes in routes/api.php
match the documented endpoints in your Swagger annotations:
Route::get('users', [UserController::class, 'index']);
Route::post('users', [UserController::class, 'store']);
Summary
-
Install Swagger via
composer
. - Publish and configure the Swagger package.
- Annotate endpoints in your controllers.
- Generate Swagger JSON using the Artisan command.
- Access Swagger UI to view interactive API documentation.
This setup will give you a fully functional Swagger integration with Laravel. You can customize and add more complex annotations as needed.
Connect with me:@ LinkedIn and checkout my Portfolio.
Please give my GitHub Projects a star ⭐️