In Laravel application deployment, sometimes we need to execute server-side commands for tasks like database migrations, cache clearance, or other essential processes.
In the traditional way:
- Open cPanel or any Control Panel then go to the terminal or go into SSH directly if you have root access,
- Then you have to navigate to the application folder and run the command you need.
But, These steps may take a little time.
Here's the solution:
In our Laravel Project, We will create an API Endpoint to handle this for us, So let's begin:
1- Create a Controller with any name, I will name it CommandController
php artisan make:controller Api/CommandController
2- Then we go to Api routes and add the route to handle and reach our Endpoint:
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Artisan;
class CommandController extends Controller
{
public function runCommand(Request $request)
{
$validated = $request->validate(['command' => ['required', 'string']]);
// Run the Artisan command
Artisan::call($validated['command']);
// Get the output of the command
$output = Artisan::output();
return response()->json(['message' => 'Command executed successfully', 'output' => $output]);
}
}
- Still an important step for securing this Endpoint, So how can we secure it?
Securing might be different depending on your situation.
For Example, you can use [Sanctum Token Abilities], For more information review my previous article about it Dive into Laravel Sanctum Token Abilities,
But Now, We will go through securing it using Middleware:
3- Create a Middleware, this Middleware will run this Endpoint if our App is in debug mode only...
php artisan make:middleware DebugModeOnly
4- Here's DebugModeOnly
Middleware Code,
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class DebugModeOnly
{
public function handle(Request $request, Closure $next): Response
{
if (config('app.debug')) {
return $next($request);
}
return response()->json(['message' => 'Command execution is only allowed in debug mode']);
}
}
5- Register the Middleware inside the Kernel in $routeMiddleware
,
'DebugModeOnly' => \App\Http\Middleware\DebugModeOnly::class,
Finally, Add Route in Api.php
and Assign the Middleware for the Endpoint
Route::get('run-command', [CommandController::class, 'runCommand'])->middleware('DebugModeOnly');
Now, Go and run the Endpoint through Postman
For example, if you want to run php artisan migrate
,
You will pass just migrate
into the command
attribute inside our API Endpoint.
That's All, Happy Coding ^_^
Summary:
Laravel's Artisan is a powerful command-line interface (CLI) that comes bundled with the Laravel framework, We have created a secure API endpoint in debug mode to facilitate command execution further.
Top comments (0)