Skip to main content

Command

php artisan make:controller {name} --module={module}
Create a new controller class in your module’s src/Http/Controllers directory.

Parameters

name
string
required
The name of the controller classExamples:
  • UserController
  • Admin/PostController
  • Api/V1/CommentController

Options

--module
string
required
The name of the module where the controller should be createdExample: --module=blog
--api
boolean
Generate an API controller (excludes create and edit methods)
php artisan make:controller PostController --api --module=blog
--invokable
boolean
Generate a single action controller with an __invoke method
php artisan make:controller ShowDashboard --invokable --module=admin
--model
string
Generate a resource controller for the given model
php artisan make:controller PostController --model=Post --module=blog
--resource
boolean
default:"false"
Generate a resource controller with CRUD methods
php artisan make:controller PostController --resource --module=blog
--requests
boolean
Generate form request classes for store and update methods (use with --resource)
php artisan make:controller PostController --resource --requests --module=blog
--singleton
boolean
Generate a singleton resource controller
php artisan make:controller ProfileController --singleton --module=user
--test
boolean
Generate an accompanying test for the controller
--pest
boolean
Generate an accompanying Pest test

Examples

Basic Controller

php artisan make:controller UserController --module=user-management
Creates a basic controller:
namespace Modules\UserManagement\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class UserController extends Controller
{
    //
}
Location: app-modules/user-management/src/Http/Controllers/UserController.php

Resource Controller

php artisan make:controller PostController --resource --module=blog
Generates a controller with all CRUD methods:
namespace Modules\Blog\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class PostController extends Controller
{
    public function index() {}
    public function create() {}
    public function store(Request $request) {}
    public function show(string $id) {}
    public function edit(string $id) {}
    public function update(Request $request, string $id) {}
    public function destroy(string $id) {}
}

API Resource Controller

php artisan make:controller Api/PostController --api --module=blog
Creates an API controller without create and edit methods:
namespace Modules\Blog\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class PostController extends Controller
{
    public function index() {}
    public function store(Request $request) {}
    public function show(string $id) {}
    public function update(Request $request, string $id) {}
    public function destroy(string $id) {}
}
Location: app-modules/blog/src/Http/Controllers/Api/PostController.php

Controller with Model Binding

php artisan make:controller PostController --model=Post --module=blog
Generates a resource controller with type-hinted model parameters:
namespace Modules\Blog\Http\Controllers;

use App\Http\Controllers\Controller;
use Modules\Blog\Models\Post;
use Illuminate\Http\Request;

class PostController extends Controller
{
    public function index() {}
    public function create() {}
    public function store(Request $request) {}
    public function show(Post $post) {}
    public function edit(Post $post) {}
    public function update(Request $request, Post $post) {}
    public function destroy(Post $post) {}
}
The --model option automatically resolves the model namespace to your module when the model exists in the module.

Controller with Form Requests

php artisan make:controller PostController --resource --requests --module=blog
Generates:
  1. A resource controller with form request type hints
  2. StorePostRequest class
  3. UpdatePostRequest class
namespace Modules\Blog\Http\Controllers;

use App\Http\Controllers\Controller;
use Modules\Blog\Http\Requests\StorePostRequest;
use Modules\Blog\Http\Requests\UpdatePostRequest;

class PostController extends Controller
{
    public function store(StorePostRequest $request) {}
    public function update(UpdatePostRequest $request, string $id) {}
}

Invokable Controller

php artisan make:controller ShowDashboard --invokable --module=admin
Creates a single-action controller:
namespace Modules\Admin\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class ShowDashboard extends Controller
{
    public function __invoke(Request $request)
    {
        //
    }
}
Invokable controllers are perfect for single-purpose actions and keep your routing clean.

Nested Controllers

php artisan make:controller Admin/PostController --resource --module=blog
Creates a controller in a subdirectory: Location: app-modules/blog/src/Http/Controllers/Admin/PostController.php Namespace: Modules\Blog\Http\Controllers\Admin

Module-Specific Behavior

When using the --module option with --model, the controller generator:
  1. Parses model namespaces to ensure they reference module models
  2. Validates model names to prevent invalid characters
  3. Auto-prefixes namespaces if you provide a simple model name
php artisan make:controller PostController --model=Post --module=blog
# Resolves to: Modules\Blog\Models\Post

Usage with Routes

After creating a controller, register routes in your module’s route file:
app-modules/blog/routes/blog-routes.php
use Modules\Blog\Http\Controllers\PostController;

Route::resource('posts', PostController::class);

Best Practices

Group related controllers in subdirectories:
  • Admin/PostController - Admin functionality
  • Api/V1/PostController - API endpoints
  • Guest/PostController - Public-facing controllers
Always use --requests with resource controllers to separate validation logic:
php artisan make:controller PostController --resource --requests --module=blog
Use --api for API endpoints (no create/edit views) and regular --resource for web routes with views.
For single-action controllers, use --invokable to keep code focused and routes cleaner.

See Also

Build docs developers (and LLMs) love