User Docs Developer Docs | |

Routes

Plugin routes are defined in Config/Routes.php inside the plugin directory. Pubvana loads this file during PluginManager::boot() at the pre_system event. The $routes object is already in scope — you do not call service('routes').

File Location

plugins/MyPlugin/Config/Routes.php

Basic Structure

<?php
// $routes is already in scope

// Public routes
$routes->get('myplugin',            'PluginsMyPluginControllersMain::index');
$routes->get('myplugin/(:segment)', 'PluginsMyPluginControllersMain::show/$1');

// Admin routes — protected by admin_auth and totp filters
$routes->group('myplugin/admin', ['filter' => ['admin_auth', 'totp']], function ($routes) {
    $routes->get('/',                  'PluginsMyPluginControllersAdminDashboard::index');
    $routes->get('items',              'PluginsMyPluginControllersAdminItems::index');
    $routes->post('items',             'PluginsMyPluginControllersAdminItems::store');
    $routes->get('items/(:num)/edit',  'PluginsMyPluginControllersAdminItems::edit/$1');
    $routes->post('items/(:num)',      'PluginsMyPluginControllersAdminItems::update/$1');
    $routes->post('items/(:num)/delete', 'PluginsMyPluginControllersAdminItems::destroy/$1');
});

// API routes
$routes->group('api/myplugin/v1', function ($routes) {
    $routes->get('items',        'PluginsMyPluginApiV1Controller::index');
    $routes->get('items/(:num)', 'PluginsMyPluginApiV1Controller::show/$1');
});

Route Groups

Public Routes

Use the plugin slug as a URL prefix. Accessible to all visitors (subject to maintenance mode). Use CI4 placeholders: (:num) for integers, (:segment) for a single path segment, (:any) for anything including slashes.

Admin Routes

All admin routes must use the admin_auth and totp filters. Failure to include these leaves your admin pages open to unauthenticated access.

$routes->group('pvdocs/admin', ['filter' => ['admin_auth', 'totp']], function ($routes) {
    $routes->get('/',          'PluginsPvDocsControllersAdminDashboard::index');
    $routes->get('versions',   'PluginsPvDocsControllersAdminVersions::index');
    $routes->post('versions',  'PluginsPvDocsControllersAdminVersions::store');
});

Use POST for all mutating admin actions. HTML forms only support GET and POST.

API Routes

Use the api/{slug}/v1/ prefix. REST API routes may use all HTTP methods.

$routes->group('api/pvdocs/v1', function ($routes) {
    $routes->get(   'versions',           'PluginsPvDocsApiV1Controller::versions');
    $routes->get(   'articles/(:segment)','PluginsPvDocsApiV1Controller::article/$1');
    $routes->post(  'articles',           'PluginsPvDocsApiV1Controller::create');
    $routes->put(   'articles/(:num)',    'PluginsPvDocsApiV1Controller::update/$1');
    $routes->delete('articles/(:num)',    'PluginsPvDocsApiV1Controller::destroy/$1');
});

Locale-Prefixed Routes

Plugin routes are automatically injected into both bare and locale-prefix route groups by PluginManager::boot(). You do not need to duplicate your route definitions for locale prefixes.