FleetbaseFleetbase

Routes & Controllers

Define API routes with Fleetbase route macros, choose the right middleware group, and build resource controllers backed by HasApiControllerBehavior.

Routes & Controllers

Routes for an extension live in server/src/routes.php (loaded by your service provider via loadRoutesFrom). Route definitions follow Laravel conventions — Fleetbase adds three macros that take care of the boilerplate.

The Routes File

<?php

use Illuminate\Support\Facades\Route;

Route::prefix(config('my-extension.api.routing.prefix', 'my-extension'))
    ->namespace('MyOrg\MyExtension\Http\Controllers')
    ->group(function ($router) {
        // Public webhook callbacks — no auth
        $router->post('webhooks/inbound', 'WebhookController@inbound');

        // Internal console — session-authenticated
        $router->group(['middleware' => ['fleetbase.protected']], function ($router) {
            $router->fleetbaseRoutes('widgets');
            $router->fleetbaseRoutes('reports', function ($router, $controller) {
                $router->get('summary', $controller('summary'));
                $router->post('export', $controller('export'));
            });
        });

        // Public API — API-key authenticated
        $router->group(['prefix' => 'v1', 'middleware' => ['fleetbase.api']], function ($router) {
            $router->fleetbaseRestRoutes('widgets');
        });
    });

Real example: pallet/server/src/routes.php.

Route Macros

fleetbase/core-api defines three route macros via Route expansion:

fleetbaseRestRoutes($name, $controller = null, $options = [], $callback = null)

Registers the seven REST routes for a resource:

VerbPathAction
GET/widgetsindex
POST/widgetsstore
GET/widgets/{id}show
PUT/PATCH/widgets/{id}update
DELETE/widgets/{id}destroy
POST/widgets/bulk-deletebulkDelete (Fleetbase extra)
GET/widgets/exportexport (Fleetbase extra)

The controller defaults to WidgetController (singular-studly + Controller) when omitted.

$router->fleetbaseRestRoutes('widgets'); // → WidgetController
$router->fleetbaseRestRoutes('widgets', 'CustomWidgetController');

fleetbaseRoutes($name, $registerFn = null, $options = [], $controller = null)

Same as fleetbaseRestRoutes but lets you nest extra routes under the same prefix and controller:

$router->fleetbaseRoutes('widgets', function ($router, $controller) {
    $router->get('archived', $controller('archived'));
    $router->post('{id}/duplicate', $controller('duplicate'));
});
// Registers: /widgets/archived, /widgets/{id}/duplicate, plus the standard REST routes

The $controller callback returns 'WidgetController@actionName' strings.

fleetbaseAuthRoutes($authControllerClass = null, $registerFn = null, $registerProtectedFn = null)

Registers the canonical auth route bundle (/auth/login, /auth/sign-up, /auth/reset-password, etc.). Use it when your extension provides an alternative authentication surface (e.g. customer portal, partner API).

Middleware Groups

Pick a group based on who calls the route:

GroupAuthWhen to use
fleetbase.protectedSanctum + sessionInternal console — your engine UI calling its own backend
fleetbase.apiAPI key (basic auth)Public REST API consumed by external integrations
(none)PublicWebhooks, magic-link callbacks, anonymous endpoints

Both groups include throttling, request logging, and route binding. fleetbase.protected additionally runs SetupFleetbaseSession, the AuthorizationGuard, and presence tracking — defined in CoreServiceProvider::$middleware.

Controllers

Three base classes ship with core-api:

Fleetbase\Http\Controllers\Controller

Plain Laravel controller with AuthorizesRequests, DispatchesJobs, ValidatesRequests. Use this for ad-hoc endpoints that don't follow the REST resource pattern.

Fleetbase\Http\Controllers\FleetbaseController

Abstract base that adds HasApiControllerBehavior — wires up the model and the JSON resource transformer:

namespace MyOrg\MyExtension\Http\Controllers;

use Fleetbase\Http\Controllers\FleetbaseController;

class WidgetController extends FleetbaseController
{
    public string $namespace = '\\MyOrg\\MyExtension';
}

The $namespace property tells the trait where to find your Models/Widget and Http/Resources/Widget classes — set it once and index/show/store/update/destroy work automatically.

Extending FleetbaseController directly

For a fully wired resource controller you usually don't write any actions yourself. Override hooks for custom behavior:

namespace MyOrg\MyExtension\Http\Controllers;

use Fleetbase\Http\Controllers\FleetbaseController;
use Illuminate\Http\Request;

class WidgetController extends FleetbaseController
{
    public string $namespace = '\\MyOrg\\MyExtension';

    public $resource = 'widget';
    public $createRequest = \MyOrg\MyExtension\Http\Requests\WidgetRequest::class;
    public $updateRequest = \MyOrg\MyExtension\Http\Requests\WidgetRequest::class;

    public function onBeforeCreate(Request $request, array &$input)
    {
        $input['company_uuid'] = session('company');
    }

    public function onAfterUpdate($model, Request $request)
    {
        // dispatch a sync job, send a notification, etc.
    }
}

Real example: ledger/server/src/Http/Controllers/Internal/v1/InvoiceController.php.

Form Requests

For validation, use Laravel form-request classes. Fleetbase ships a Fleetbase\Http\Requests\FleetbaseRequest base that adds session-aware authorization:

namespace MyOrg\MyExtension\Http\Requests;

use Fleetbase\Http\Requests\FleetbaseRequest;

class WidgetRequest extends FleetbaseRequest
{
    public function authorize(): bool
    {
        return $this->session()->has('user');
    }

    public function rules(): array
    {
        return [
            'name'        => 'required|string|max:120',
            'description' => 'nullable|string',
            'metadata'    => 'array',
        ];
    }
}

Reference these from your controller's $createRequest / $updateRequest properties.

Accessing the Authenticated User

Inside a fleetbase.protected route, $request->user() returns the authenticated Fleetbase\Models\User. The active company is on the session:

$user      = $request->user();
$companyId = session('company'); // string UUID

For API-key-authenticated routes (fleetbase.api), the auth context is the API credential — $request->user() resolves through Sanctum to the credential's owner user, and the company is set from the credential.

Route Resource Helpers — REST Registrar

fleetbaseRestRoutes uses a custom Fleetbase\Routing\RESTRegistrar rather than Laravel's built-in ResourceRegistrar. The registrar normalizes ID parameters (always {id}), ensures dasherized URI segments, and wires the bulk operations.

If you need a non-standard verb shape, drop down to plain Route::get / Route::post and skip the macro.

Source

FileDescription
src/Expansions/Route.phpfleetbaseRoutes, fleetbaseRestRoutes, fleetbaseAuthRoutes
src/Routing/RESTRegistrar.phpREST route generator
src/Http/Controllers/FleetbaseController.phpAbstract resource controller base
src/Traits/HasApiControllerBehavior.phpTrait that wires up the action methods
ledger/server/src/Http/Controllers/Internal/v1/InvoiceController.phpReference resource controller
pallet/server/src/routes.phpReference routes file
Routes & Controllers | Fleetbase