Controllers group related Laravel request handling logic into single classes stored in the app/Http/Controllers/ directory. Use them to build frontend areas or full custom apps, the Laravel way!


Statamic is a package sitting inside a standard Laravel application, giving you the freedom to create your own routes, map them to controllers, and build your own custom application and business logic outside of Statamic’s feature set.

Anything you can do in Laravel you can do here. Because you’re using Laravel. You just also have access to all of Statamic’s capabilities and features.


Routes are defined in routes/web.php.

These explicitly defined routes will take precedence over Statamic routes and URL patterns.

For example, you can map a GET request to to the index method in the app\Http\Controllers\ExampleController.php file like this:

use App\Http\Controllers\ExampleController;

Route::get('example', [ExampleController::class, 'index']);

Basic Controller

In your controller, render views like you would in a regular Laravel app:


namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

class ExampleController extends Controller
    public function index()
        $data = [
            'title' => 'Example Title'

        return view('myview', $data);  // resources/views/myview.blade.php

Generate a controller with an Artisan command:

php artisan make:controller ExampleController

Antlers Views

Returning view('myview') will render the myview.antlers.html view. To take advantage of Statamic’s standard template-injected-into-a-layout behavior, return a Statamic\View\View instance instead of a regular Laravel one.

public function index()
    return (new \Statamic\View\View)
        ->with(['title' => 'Example Title']);

Now, myview will be injected into mylayout’s template_content variable. Anything provided to with (eg. title) will be available in both views.

Betterify this page on Github!