# API Generator

![](https://3430351544-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M7hdtfDr4t_C1ptQgyo%2F-M7qNwV7k-tQZt6G2fe3%2F-M7qOVRi0ofXEvDw_qqm%2FScreen%20Shot%202020-05-21%20at%2011.42.10%20AM.png?alt=media\&token=dfb7c1e4-6242-4068-966c-fedd83d1d994)

For every CRUD, by default, QuickAdminPanel creates **API Routes** and **Controllers** for your CRUD menu item, so you can use it from your mobile app or front-end.

Whenever you create or edit a CRUD, there's a checkbox whether to generate the API functionality (see above).

If checked, there's a separate Controller created in **app/Http/Controllers/Api/V1/Admin** folder.

```
namespace App\Http\Controllers\Api\V1\Admin;

use App\Http\Controllers\Controller;
use App\Http\Requests\StoreUserRequest;
use App\Http\Requests\UpdateUserRequest;
use App\Http\Resources\Admin\UserResource;
use App\User;
use Gate;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class UsersApiController extends Controller
{
    public function index()
    {
        abort_if(Gate::denies('user_access'), Response::HTTP_FORBIDDEN, '403 Forbidden');

        return new UserResource(User::with(['roles'])->get());
    }

    public function store(StoreUserRequest $request)
    {
        $user = User::create($request->all());
        $user->roles()->sync($request->input('roles', []));

        return (new UserResource($user))
            ->response()
            ->setStatusCode(Response::HTTP_CREATED);
    }

    public function show(User $user)
    {
        abort_if(Gate::denies('user_show'), Response::HTTP_FORBIDDEN, '403 Forbidden');

        return new UserResource($user->load(['roles']));
    }

    public function update(UpdateUserRequest $request, User $user)
    {
        $user->update($request->all());
        $user->roles()->sync($request->input('roles', []));

        return (new UserResource($user))
            ->response()
            ->setStatusCode(Response::HTTP_ACCEPTED);
    }

    public function destroy(User $user)
    {
        abort_if(Gate::denies('user_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden');

        $user->delete();

        return response(null, Response::HTTP_NO_CONTENT);
    }
}
```

&#x20;Also it's added to **routes/api.php** file, like this:

```
Route::group(['prefix' => 'admin', 'as' => 'admin.', 'namespace' => 'Api\V1\Admin'], function () {
    Route::apiResource('users', 'UsersApiController');
});
```

You can turn this function on/off for every CRUD separately.

## How to Use Generated API

Default URL endpoints for all CRUDs are **/api/v1/\[crud\_name]**. We generate all API Resourceful Controller methods, so these URLs apply - [see official Laravel docs](https://laravel.com/docs/master/controllers#resource-controllers):

* GET /api/v1/users - get the list of users
* POST /api/v1/users - create new user
* GET /api/v1/users/1 - get the user with users.id = 1
* PUT /api/v1/users/1 - update the user with users.id = 1
* DELETE /api/v1/users/1 - delete the user with users.id = 1

Detailed visual example is in this blog article: [QuickAdminPanel API Generator with Laravel Sanctum](https://blog.quickadminpanel.com/quickadminpanel-api-generator-with-laravel-sanctum/)&#x20;

## How to Customize What API Returns

We also generate [Eloquent API Resources](https://laravel.com/docs/master/eloquent-resources) with their default functionality. See, for example, **app/Http/Resources/Admin/UserResource.php**:

```
namespace App\Http\Resources\Admin;

use Illuminate\Http\Resources\Json\JsonResource;

class UserResource extends JsonResource
{
    public function toArray($request)
    {
        return parent::toArray($request);
    }
}
```

## Authentication with Laravel Sanctum

**Notice**: our tool is generating API routes that are protected by middleware **auth:sanctum** that comes from [Laravel Sanctum](https://laravel.com/docs/8.x/sanctum).

More information in this article: [QuickAdminPanel API Generator with Laravel Sanctum](https://blog.quickadminpanel.com/quickadminpanel-api-generator-with-laravel-sanctum/)&#x20;

## Uploading Files to API

Separate question from the customers was about uploading files to the API. For that, we have a separate article on our blog, which can be applied with or without QuickAdminPanel: [Laravel API: How to Upload File from Vue.js](https://quickadminpanel.com/blog/laravel-api-how-to-upload-file-from-vue-js/)

## Generating API Documentation

QuickAdminPanel doesn't generate API docs by default, but here's another article on our blog about the tool that we recommend: [Laravel API Documentation with OpenAPI/Swagger](https://quickadminpanel.com/blog/laravel-api-documentation-with-openapiswagger/)

![](https://3430351544-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M7hdtfDr4t_C1ptQgyo%2F-M840uxVTexk9nbWOmqa%2F-M84zm_oc1aOBgLzFOjW%2FScreen-Shot-2020-01-31-at-8.19.38-PM-1200x675.png?alt=media\&token=8a9c7029-7a81-4b26-b1f6-18adf22b5927)
