MMOframework
Pourquoi l'IA Playground Bibliothèques Documentation Rechercher Agence
FR EN
Index

DeveloperController

MMO\admin\controllers · 1 symbole · générée le 27 Oct 2026

class

DeveloperController

DeveloperController.php:40

The developer layer of an application (mmo.client's display mode dev, DeveloperMode): on each page, the tickets of the board and the items of the checklists that are about it; a ticket filed from the page, with what it was showing; the project lead notified.

class MMO\admin\controllers\DeveloperController extends MMO\core\classes\aDataController implements MMO\core\interfaces\iRoutable
Espace de noms
MMO\admin\controllers
Étend
aDataController
Implémente
iRoutable
- `GET api/developer/page.json?route=` the page's tickets (`pages` of a ticket, or an item of a checklist naming it) and checks (the items whose `url` is the page); - `POST api/developer/tickets.json` a ticket filed from a page -- a screenshot with it only for [`SCREENSHOT`](https://mmoframework.fr/fr/documentation/mmo.admin/php/controllers/DeveloperController.md#developercontroller-screenshot); - `POST api/developer/reports.json` a problem a user reports (the bug button): a ticket too, never with a screenshot; - `POST api/developer/tickets/{ticket}/comments.json` a comment on one of them; - `GET api/developer/screenshots/{id}.png`, `GET api/developer/summary.json`. Where it is kept is [`$store`](https://mmoframework.fr/fr/documentation/mmo.admin/php/controllers/DeveloperController.md#developercontroller-store)'s: `board` on a development machine, straight onto [`$board`](https://mmoframework.fr/fr/documentation/mmo.admin/php/controllers/DeveloperController.md#developercontroller-board)'s file; `inbox` on a server, a git repository of its own in [`$folder`](https://mmoframework.fr/fr/documentation/mmo.admin/php/controllers/DeveloperController.md#developercontroller-folder) that `php admin.php developer pull` brings onto the board. The screenshots stay in [`$folder`](https://mmoframework.fr/fr/documentation/mmo.admin/php/controllers/DeveloperController.md#developercontroller-folder), wherever it is: they may show the clients' data. Declared like any controller: "MMO\\admin\\controllers\\DeveloperController": {"board": "my.oviepro-deploy", "boards": "{root}/boards", "checklists": "{root}/checklists", "store": "board", "folder": "{db}/developer", "basePaths": ["/my.oviepro/"]} The scopes (mmo.oauth) it asks: [`VIEW`](https://mmoframework.fr/fr/documentation/mmo.admin/php/controllers/DeveloperController.md#developercontroller-view) for the cues, [`CREATE`](https://mmoframework.fr/fr/documentation/mmo.admin/php/controllers/DeveloperController.md#developercontroller-create), [`SCREENSHOT`](https://mmoframework.fr/fr/documentation/mmo.admin/php/controllers/DeveloperController.md#developercontroller-screenshot), [`COMMENT`](https://mmoframework.fr/fr/documentation/mmo.admin/php/controllers/DeveloperController.md#developercontroller-comment), [`TRIAGE`](https://mmoframework.fr/fr/documentation/mmo.admin/php/controllers/DeveloperController.md#developercontroller-triage) (who is notified). [`$open`](https://mmoframework.fr/fr/documentation/mmo.admin/php/controllers/DeveloperController.md#developercontroller-open): a development machine, everything to whoever calls -- the agents' `curl`.
curl 'http://localhost/my.oviepro/api/developer/page.json?route=settings/utilisateurs'curl -X POST -H 'Content-Type: application/json' -d '{"title": "Save fails", "route": "settings/utilisateurs"}' http://localhost/my.oviepro/api/developer/tickets.json

Index

CHECKchecking an item
CHECKLISTSthe checks of a page
COMMENTcommenting a ticket from a page
CREATEfiling a ticket from a page
RUNrunning an item's command (▶, on the developer's own machine only: ChecklistController::$runScope)
SCREENSHOTa screenshot with it
TOOLSthe developer's tools (logs, database...)
TRIAGEsorting the tickets filed: who is notified of a new one
VIEWthe cues of a page: its tickets (and the board)
author
basePaths
board
boardPage
boards
checklists
checklistsPage
folder
git
instance
labels
notify
open
status
store
storeInstance
abilities()
backfillPages($write)Give the board's tickets that have none their pages: what the checklists' recipes say of them (checks: {ticket: {url}}), the ``` `check `` blocks of their discussion (page | url | what`),…
basePaths()
buildTicket($input, $author, $screenshot, $report)Build the ticket filed from a page, as the board keeps it.
can($scope)
checksOf($routes, $member)The items of the checklists whose url is one of $routes.
ConnectRoutes($routes, $config) static
content($route)
fail($route, $status, $error)
file($input, $report, $png)File a ticket: keep it (getStore), learn the board its labels, notify who triages.
getAuthor()
getBoard()
getStore()
instanceName()
isEnabled()
notifyFiled($ticket, $author, $report)Tell who triages ($notify) of a ticket filed: the notification centre of mmo.client, the author left out.
page($route, $done, $member)What the developer layer shows on a page.
pagesOf($ticket)The pages a ticket is about: its pages, else what its description cites.
png($dataUrl)
routeComment($route)
routeFile($route)
routeOf($url)
routePage($route)
routeReport($route)A problem a user reports (the bug button of the application): a ticket in « to sort », without any screenshot -- a user's screen may show what only they may see.
routeScreenshot($route)
routesOf($route)The names a page goes by: its route, and where its folder's default leads (settings is settings/users).
routeSummary($route)
routeTodo($route)
setStore($store)
sourceOf($route)
ticketCue($id, $t, $status, $labels, $board, $pages, $via, $routes)
todo($checklist, $member)The pages where something is left to check, in the checklists' order: where the « next » button of a walkthrough leads.

Constantes9

CHECK

checking an item

const CHECK = 'dev.checklists#check'

CHECKLISTS

the checks of a page

const CHECKLISTS = 'dev.checklists'

COMMENT

commenting a ticket from a page

const COMMENT = 'dev.tickets#comment'

CREATE

filing a ticket from a page

const CREATE = 'dev.tickets#create'

SCREENSHOT

a screenshot with it

const SCREENSHOT = 'dev.tickets#screenshot'

TOOLS

the developer's tools (logs, database...)

const TOOLS = 'dev.tools'

TRIAGE

sorting the tickets filed: who is notified of a new one

const TRIAGE = 'dev.tickets#triage'

VIEW

the cues of a page: its tickets (and the board)

const VIEW = 'dev.boards'

Propriétés16

basePaths

array $basePaths = []
Type
array

boardPage

string $boardPage = 'developer/boards'
Type
string

boards

string $boards = '{root}/boards'
Type
string

checklists

?string $checklists = '{root}/checklists'
Type
null | string

checklistsPage

string $checklistsPage = 'developer/checklists'
Type
string

folder

string $folder = '{db}/developer'
Type
string

git

bool $git = true
Type
bool

instance

string $instance = ''
Type
string

labels

array $labels = […4 items]
Type
array

notify

?string $notify = 'dev.tickets#triage'
Type
null | string

open

bool $open = false
Type
bool

store

string $store = 'board'
Type
string

storeInstance

protected ?MMO\admin\interfaces\iDeveloperStore $storeInstance = null
Type
null | iDeveloperStore

Méthodes32

abilities()

DeveloperController.php:133
function abilities(): array
retournearraybool> what the page may offer: view, checklists, check, create, screenshot, comment, triage, tools

backfillPages($write)

DeveloperController.php:378

Give the board's tickets that have none their pages: what the checklists' recipes say of them (checks: {ticket: {url}}), the ``` `check `` blocks of their discussion (page | url | what`), the urls of their description.

function backfillPages(bool $write = false): array
$write = falseboolfalse: only say what would be given
retournearraystring, title: string, pages: list<string>}> the tickets given pages

buildTicket($input, $author, $screenshot, $report)

DeveloperController.php:449

Build the ticket filed from a page, as the board keeps it.

function buildTicket( array $input, array $author, ?string $screenshot = null, bool $report = false ): array
$inputarray{title, description, type, urgency, route, url, target, context}
$authorarray
$screenshot = nullnull | stringits id (iDeveloperStore::saveScreenshot)
$report = falseboola user's report (the bug button), rather than a developer's ticket
retournearray

checksOf($routes, $member)

DeveloperController.php:321

The items of the checklists whose url is one of $routes.

function checksOf(array $routes, ?string $member = null): array
$routesarray
$member = nullnull | stringwhose box is said checked, on a checklist with members (else: anyone's)
retournearraystring, checklistTitle: string, id: string, ref: string, group: string, section: string, kind: string, title: string, detail: string, tickets: list<string>, checked: bool, members: list<string>, boxes: array<string, bool>}>

getBoard()

DeveloperController.php:144
function getBoard(): ?string
retournenull | stringthe board the tickets are filed on and shown from: the one the user picked in Développeur > Boards (BoardSelection, a development machine's board store only), else $board; null for no developer layer
\MMO\admin\helpers\DeveloperMode::Controller()?->getBoard(); // 'my.oviepro-billing'

notifyFiled($ticket, $author, $report)

DeveloperController.php:533

Tell who triages ($notify) of a ticket filed: the notification centre of mmo.client, the author left out.

protected function notifyFiled(array $ticket, array $author, bool $report): void
$ticketarray
$authorarray
$reportbool
retournevoid

page($route, $done, $member)

DeveloperController.php:237

What the developer layer shows on a page.

function page(string $route, bool $done = false, ?string $member = null): array
$routestring
$done = falseboolwith the tickets that are done
$member = nullnull | stringwhose box a check is, on a checklist with members
retournearraystring, routes: list<string>, tickets: list<array>, checks: list<array>, counts: array}

pagesOf($ticket)

DeveloperController.php:283

The pages a ticket is about: its pages, else what its description cites.

function pagesOf(array $ticket): array
$ticketarray
retournearraystring, target?: string}>

routeComment($route)

DeveloperController.php:629
#[MMO\core\attributes\APIRoute('POST|api/developer/tickets/{ticket}/comments.json', 'Comment on a ticket from a page: {body}', mediaTypes: ['json'])] function routeComment(MMO\core\server\Route $route): array
$routeRoutea JSON body {body}
retournearray{comment}

routeFile($route)

DeveloperController.php:586
#[MMO\core\attributes\APIRoute('POST|api/developer/tickets.json', 'File a ticket from a page: {title, description, type, urgency, route, url, target, context, screenshot}', mediaTypes: ['json'])] function routeFile(MMO\core\server\Route $route): array
$routeRoutea JSON body {title, description, type, urgency, route, url, target, context, screenshot}: screenshot a png's data url, kept only for SCREENSHOT
retournearray{ticket}

routePage($route)

DeveloperController.php:561
#[MMO\core\attributes\APIRoute('GET|api/developer/page.json', 'The tickets and checks of a page: ?route=settings/users&member=Marc', mediaTypes: ['json'])] function routePage(MMO\core\server\Route $route): array
$routeRoute?route= the page (or ?url=), &done=1 with the tickets done, &member= whose checks
retournearrayas page

routeReport($route)

DeveloperController.php:610

A problem a user reports (the bug button of the application): a ticket in « to sort », without any screenshot -- a user's screen may show what only they may see.

#[MMO\core\attributes\APIRoute('POST|api/developer/reports.json', 'Report a problem from a page, as a user: {title, description, url, context}', mediaTypes: ['json'])] function routeReport(MMO\core\server\Route $route): array
$routeRoutea JSON body {title, description, url, context}
retournearray{ticket: {id}}

routeScreenshot($route)

DeveloperController.php:644
#[MMO\core\attributes\APIRoute('GET|api/developer/screenshots/{id}.png', 'A ticket\'s screenshot', mediaTypes: ['json'])] function routeScreenshot(MMO\core\server\Route $route): array
$routeRoute
retournearrayan error, or nothing: the image is the response

routesOf($route)

DeveloperController.php:200

The names a page goes by: its route, and where its folder's default leads (settings is settings/users).

function routesOf(string $route): array
$routestring
retournearray

routeSummary($route)

DeveloperController.php:657
#[MMO\core\attributes\APIRoute('GET|api/developer/summary.json', 'The developer\'s home: the board\'s counts, what is to sort, what is pending, the checklists', mediaTypes: ['json'])] function routeSummary(MMO\core\server\Route $route): array
$routeRoute
retournearray{board, tickets: {status: count}, toSort: [ticket], pending: [entry], checklists: [{name, title, progress}]}: the Developer home page

routeTodo($route)

DeveloperController.php:573
#[MMO\core\attributes\APIRoute('GET|api/developer/todo.json', 'The pages where something is left to check: ?checklist=&member=', mediaTypes: ['json'])] function routeTodo(MMO\core\server\Route $route): array
$routeRoute?checklist=, &member=
retournearray{pages: [{route, url, todo}]}: where something is left to check

todo($checklist, $member)

DeveloperController.php:350

The pages where something is left to check, in the checklists' order: where the « next » button of a walkthrough leads.

function todo(?string $checklist = null, ?string $member = null): array
$checklist = nullnull | stringone of them, null for all
$member = nullnull | string
retournearraystring, url: string, todo: int}>
Membres hérités (62)
ConstantesDéclaré parDescription
ALERTiLogLevelAlert: Action must be taken immediately.
ALLiLogLevelMask for all
ALL_PLUSiLogLeveldebug everything
BACKTRACEiLogLevel
COLORSaDataControllerNamed color palettes for chart/report endpoints, e.g.
CRITICALiLogLevelCritical: Critical conditions.
DEBUGiLogLevelDebug: Detailed debug information.
DEEPiLogLeveldebug everything with arguments
EMERGENCYiLogLevelEmergency: System is unusable.
ERRORiLogLevelError: Runtime errors that do not require immediate action but should typically be logged and monitored.
ERROR_PLUSiLogLevelMask for all error
FATALiLogLevelMask for all fatal error
INFOiLogLevelInfo: Interesting events.
INFO_PLUSiLogLevelMask for all errors/warning/notices/info
MEMORYiLogLevelinclude backtrace object
NOTICEiLogLevelNotice: Normal but significant events.
NOTICE_PLUSiLogLevelMask for all errors/warning/notices/info
TRACEiLogLevelinclude backtrace as origins
WARNINGiLogLevelWarning: Exceptional occurrences that are not errors.
WARNING_PLUSiLogLevelMask for all errors and warnings
PropriétésDéclaré parDescription
repositoriesaDataController
verbosityaModule
MéthodesDéclaré parDescription
alert($message, $context)aModuleAction must be taken immediately.
backtraces($message, $context)aModuleForce-log a message at INFO level together with a full stack trace/memory snapshot (iLogLevel::BACKTRACE), bypassing the verbosity mask entirely (any non-zero verbosity is enough to trigger it).
Configure($config)aModuleMerge $config into this module's configuration in the shared Configuration.
critical($message, $context)aModuleCritical conditions. No-op if CRITICAL is currently filtered out by the verbosity mask.
debug($message, $context)aModuleDetailed debug information.
debugName()aModuleHuman-readable identifier used as the default {origin} in this instance's log messages.
DefaultConfig()aModuleThe config a module starts from before anything loaded via Configuration is merged in.
emergency($message, $context)aModuleSystem is unusable. No-op if EMERGENCY is currently filtered out by the verbosity mask.
error($message, $context)aModuleRuntime errors that do not require immediate action but should typically be logged and monitored.
ExtractRoutes($config)aControllerExtract all the APIRoute from this class, regardless of the fact they are registered in the application
getMainRepository()aDataController
getRepositories()aDataController
getRepository($repo)aDataController
getVerbosity()aModule
HasRoutes()aControllerTells if any APIRoute are registered in the application
info($message, $context)aModuleInteresting events. No-op if INFO is currently filtered out by the verbosity mask.
Instantiate($config)aModule(Re)create the shared instance immediately, configured with $config merged into the class's existing config.
IsShared()aModule
Link($method, $data)aControllerBuild a Link (URL + label/icon/description/title, taken from the route's APIRoute metadata) for a registered route.
log($level, $message, $context)aModuleLogs with an arbitrary level.
notice($message, $context)aModuleNormal but significant events.
offsetExists($key)aModule\ArrayAccess::offsetExists -- tells whether $key is a declared property at all, regardless of whether it is currently readable/writable through array access.
offsetGet($key)aModule\ArrayAccess::offsetGet -- reads a property directly, unless it has a #[Serialize(serialize: 'methodName')] attribute, in which case that zero-argument method is called instead (e.g.
offsetSet($key, $value)aModule\ArrayAccess::offsetSet -- sets a property directly, unless it has a #[Serialize(unserialize: 'methodName')] attribute, in which case that method is called with $value instead (e.g.
offsetUnset($key)aModule\ArrayAccess::offsetUnset -- equivalent to $module[$key] = null.
onRoute($route)aDataControllerSame as aController::onRoute, plus forcing the response to JSON (Response::Json) for every route this controller claims.
Route($method)aControllerGet a registered APIRoute WARNING: if this class was not registered in the application, it will return null.
Routes()aControllerGet a list of registered APIRoutes (from this class) in the application WARNING: if this class was not registered in the application, it will return an empty array.
serialize($path, $serializer)aModule\MMO\core\interfaces\iSerializable::serialize -- exports every property (via
setRepositories($repositories)aDataControllerRegister the repositories this controller can query, keyed by name (e.g.
setVerbosity($verb)aModuleSet the current verbosity mask, replacing whatever it was before.
Shared()aModuleGet the shared instance, creating (and configuring) it on first call.
testVerbosity($level)aModuleTest whether a given level (or set of levels) is currently enabled by this instance's verbosity mask.
traitUnshare($serialize)aModuleRemove the shared instance, so the next Shared() call creates a fresh one.
unserialize($data, $path, $instances)aModule\MMO\core\interfaces\iSerializable::unserialize -- merges $data onto DefaultConfig, runs it through the (possibly overridden) constructor, then applies each resulting value to its property (via
Unshare($serialize)aModuleLike tSingleton::Unshare, but also disconnects this module's instance from every event it was listening to (via Event::DisconnectListeners) before dropping it.
Url($method, $data)aControllerBuild the URL for a registered route, filling in any {placeholder} from $data.
warning($message, $context)aModuleExceptional occurrences that are not errors.
__construct($config)aModuleprotected constructor, so it is not possible to do new Module(...) called by the serialization process just before being injected with data.
__wakeup()aControllerCalled automatically right after the controller's shared instance is built (aModule::unserialize): registers onRoute as a Route listener with a low priority (-10), so it…