# Create a Controller

After running the artisan command to create the module, it has only a single route that is implemented as a closure. A better way is to use a controller to manage all the HTTP methods that we might see in an API.

To create a controller, go to the top level of the API and make the artisan command

```
# log in to Docker
docker exec -it elentra-developer bash
# navigate to the API root
cd /var/www/vhosts/elentra-1x-me/www-root/core/library/vendor/elentrapackages/elentra-1x-api
# create a widget controller
php artisan make:module:controller widgets WidgetController --resource
```

The argument --resource tells artisan to create all the route endpoints for the standard set of Http types (GET, POST, PUT, DELETE). Without the argument artisan will create an empty controller for you to fill in your own details.

Now let's change the route to use the controller. Edit the file `Widgets/Routes/api.php` and replace the closure from previous test with `'WidgetController@index'`.&#x20;

The route will then be simply&#x20;

```
Route::get('/widgets', 'WidgetController@index');
```

�Checking the routes with artisan: `php artisan route:list --path=widgets` you will see the controller now referenced.

```
+--------+----------+---------+------+----------------------------------------------------------------+--------------+
| Domain | Method   | URI     | Name | Action                                                         | Middleware   |
+--------+----------+---------+------+----------------------------------------------------------------+--------------+
|        | GET|HEAD | widgets |      | Entrada\Modules\Widget\Http\Controllers\WidgetController@index | api,api_auth |
+--------+----------+---------+------+----------------------------------------------------------------+--------------+
```

At this point you can edit the controller `Widgets/Http/Controllers/WidgetController.php` and add an echo to the `index()` method.

```
    public function index()
    {
        echo "Hello, Widgets";
    }
```

Try the route in Postman to verify that the output works.

![](/files/-LMxleHXAVrrtxmlDZqo)

Next, lets support the standard Http methods

* GET - for fetching an entry
* POST - for sending data for a new entry
* PUT - make an update to an existing entry
* DELETE - delete an existing entry

Change the route in `Widgets/Routes/api.php` so that instead of `Route::get` it says `Route::apiResource` and remove `@index` from the controller specification. So the line will look like:

```
Route::apiResource('/widgets', 'WidgetController');
```

Now check the routes again with artisan (`php artisan route:list --path=widgets`)

```
+--------+-----------+------------------+-----------------+------------------------------------------------------------------+--------------+
| Domain | Method    | URI              | Name            | Action                                                           | Middleware   |
+--------+-----------+------------------+-----------------+------------------------------------------------------------------+--------------+
|        | GET|HEAD  | widgets          | widgets.index   | Entrada\Modules\Widgets\Http\Controllers\WidgetController@index   | api,api_auth |
|        | POST      | widgets          | widgets.store   | Entrada\Modules\Widgets\Http\Controllers\WidgetController@store   | api,api_auth |
|        | GET|HEAD  | widgets/{widget} | widgets.show    | Entrada\Modules\Widgets\Http\Controllers\WidgetController@show    | api,api_auth |
|        | PUT|PATCH | widgets/{widget} | widgets.update  | Entrada\Modules\Widgets\Http\Controllers\WidgetController@update  | api,api_auth |
|        | DELETE    | widgets/{widget} | widgets.destroy | Entrada\Modules\Widgets\Http\Controllers\WidgetController@destroy | api,api_auth |
+--------+-----------+------------------+-----------------+------------------------------------------------------------------+--------------+
```

This has now created a set of routes related to the widgets endpoint. In the Action column you can see the methods that these routes will map to in the controller.

If you perform a GET on /widgets with no trailing identifier, it will go to the index() method in the controller. This is for fetching a list of widgets. If you perform a GET on /widgets/something, then it will use the show() method in the controller to try to find the widget identified by 'something'.

Similarly the POST, PUT and DELETE methods are directed to their unique methods of the controller. The apiResource way of specifying routes is a nice shorthand when you want to create a standard set of routes for some resource.

Some additional cleanup can be done in the controller. Open the file `Widgets/Http/Controllers/WidgetController` and remove the methods called `create()` and `edit()`. These functions are created automatically when you create the controller with Artisan, but they are intended for a Laravel application that includes a front end, where the `create()` method would display a form to create a new widget, and the `edit()` function would display a form to edit a widget. Since we are using Laravel only for API functions, these will not be needed in the controller. You can also see that none of the routes use these methods as well.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.elentra.org/api/developers/quickstart-guide/create-a-controller.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
