How to Execute Laravel Artisan Commands Using an API Endpoint
Tags: laravel, php
Published: 2023-11-30 12:43:42

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
<?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](https://dev.to/yasserelgammal/dive-into-laravel-sanctum-token-abilities-n8f),

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
<?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`,

```php
        'DebugModeOnly' => \App\Http\Middleware\DebugModeOnly::class,
```

Finally, Add Route in `Api.php` and Assign the Middleware for the Endpoint

```php
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.