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.