|
1 | 1 | # Api
|
| 2 | + |
| 3 | +Über `rex_api_function` können AddOns eine zentrale API zur Verfügung stellen. Die Funktionen dieser API lassen sich jeweils über eine URL aufrufen. Sie dienen dazu, bestimmte Vorgaben, wie z.B. Nutzerrechte oder System-Einstellungen zu prüfen und den Aufruf bei Bedarf an einen dahinterliegenden Service (PHP-Klasse zur Verarbeitung) weiterzureichen. Rückmeldungen der Services können geprüft und als ausführliche Fehler- oder Erfolgsmedlung zurückgegeben werden, die dann von der aufrufenden Stelle ausgegeben werden können. |
| 4 | + |
| 5 | +Da API-Funktionen über einen URL-Request aufgerufen werden, ist es möglich, sie über AJAX-Requests anzusprechen. Mit jedem Request kann nur eine API-Funktion aufgerufen werden. |
| 6 | + |
| 7 | +## Aufruf |
| 8 | +Der Aufruf einer API-Funktion kann auf jeder beliebigen Seite erfolgen. Um den Aufruf zu kennzeichnen ist der Parameter `rex-api-function` nötig, über den der Name der auzurufenden API-Funktion übergeben wird: `index.php?...&rex-api-call=function_name`. Der übergebene Name enstpricht dabei dem Klassennamen ohne das vorangestellte `rex_api_`. Mit dem Aufruf können beliebige weitere Parameter zur Verabrietung übergeben werden. |
| 9 | + |
| 10 | +## Implementierung |
| 11 | +- Jede API-Funktion wird durch eine PHP-Klasse repräsentiert. Der Klassenname muss mit `rex_api_` beginnen und die abstrakte Basisklasse `rex_api_function` erweitern. Es muss mindestens die Methode execute() definiert sein. |
| 12 | +- Für die Fehlerausgabe gibt es die Exception-Klasse `rex_api_exception`. |
| 13 | +- Für Rückmeldungen dient die Klasse `rex_api_result`. |
| 14 | + |
| 15 | +``` |
| 16 | +/** |
| 17 | + * Beispiel einer einfachen rex_api_function Implementierung |
| 18 | + * |
| 19 | + * Über diese API-Funktion kann der Name einer Kategorie ausgegeben werden, deren ID mit übergeben wird. |
| 20 | + * Falls die Kategorie nicht existiert, wird eine Fehlermeldung erzeugt. |
| 21 | + * Aufruf: index.php?rex-api-call=demo&category_id=XX |
| 22 | + */ |
| 23 | +class rex_api_demo extends rex_api_function |
| 24 | +{ |
| 25 | + public function execute() |
| 26 | + { |
| 27 | + // Hier wird die Kategorie anhand einer übergebenen ID ausgelesen |
| 28 | + $category_id = rex_request('category_id', 'int'); |
| 29 | + $category = rex_category::get($category_id); |
| 30 | + |
| 31 | + // Falls die Kategorie nicht existiert, wird eine Fehlermeldung ausgelöst |
| 32 | + if (!$category instanceof rex_category) { |
| 33 | + throw new rex_api_exception('Kategorie existiert nicht!'); |
| 34 | + } |
| 35 | + |
| 36 | + // Existiert die Kategorie, wird eine Meldung mit dem Namen der Kategorie zurückgegeben |
| 37 | + return new rex_api_result(true, 'Der Kategorie-Name lautet: '.$category->getName()); |
| 38 | + } |
| 39 | +} |
| 40 | +``` |
| 41 | + |
| 42 | +## Die Methoden der Klassen |
| 43 | +### rex_api_function |
| 44 | + |
| 45 | +#### Methoden zur Verwendung innerhalb von rex_api_function |
| 46 | +``` |
| 47 | +// Funktioniert nur innerhalb von rex_api_function |
| 48 | +// Gibt Namen der Funktion und ein CSRF Token zurück |
| 49 | +$url_params = rex_api_function::getUrlParams(); |
| 50 | +
|
| 51 | +// Funktioniert nur innerhalb von rex_api_function |
| 52 | +// Gibt den Namen der Funktion und ein CSRF-Token als verstecktes <input> feld zurück |
| 53 | +echo rex_api_function::getHiddenFields(); |
| 54 | +``` |
| 55 | + |
| 56 | +### rex_api_result |
| 57 | +Diese Klasse repräsentiert das Ergebnis einer API-Funktion. Sie stellt mehrere Methoden zur Definition des Ergebnisses bereit. |
| 58 | +Das Ergebnis kann von der API-Funktion per `return` Statement zurückgegeben werden. Ein Ergebnis kann positiv (Ausführung erfolgreich) oder negativ (Ausführung fehlgeschlagen) sein. |
| 59 | + |
| 60 | +#### Ergebnis erzeugen |
| 61 | +``` |
| 62 | +$result = new rex_api_result($status, $message); |
| 63 | +``` |
| 64 | + |
| 65 | +Parameter | Beschreibung |
| 66 | +$status | Status des Ergebnisses. `true` = Ausführung erfolgreich, `false` = Ausführung fehlgeschlagen. |
| 67 | +$message | _optional:_ Ausführlicher Nachricht. Z.B. zur Ausgabe für den Nutzer. |
| 68 | + |
| 69 | +#### Status des Ergebnisses abfragen |
| 70 | +``` |
| 71 | +// Der Status ist bei Erfolg 'true' |
| 72 | +$status = $result->isSuccessfull() |
| 73 | +``` |
| 74 | + |
| 75 | +#### Nachricht ausgeben |
| 76 | +``` |
| 77 | +// Gibt die Nachricht ohne zusätzliche Formatierung aus |
| 78 | +echo $result->getMessage(); |
| 79 | +
|
| 80 | +// Gibt die Nachricht anhand des Parameters $status formatiert aus |
| 81 | +// Erfolgsmeldungen werden mit rex_view::success() formatiert, |
| 82 | +// Fehlschläge werden mit rex_view::error() formatiert |
| 83 | +echo $result->getFormattedMessage(); |
| 84 | +``` |
| 85 | + |
| 86 | +#### Vor der Rückmeldung einen erneuten Request ausführen |
| 87 | +``` |
| 88 | +// Falls die Rückmeldung einen zusätzlichen Request erfordert, um z.B. Low-Level-Änderungen zu übernehmen, kann ein |
| 89 | +// Flag gesetzt werden: |
| 90 | +$result->setRequiresReboot($requires_reboot); |
| 91 | +
|
| 92 | +// Der Flag kann so abgefragt werden: |
| 93 | +$result->requiresReboot(); |
| 94 | +``` |
| 95 | + |
| 96 | +Parameter | Beschreibung |
| 97 | +$requires_reboot | `false` = keinen neuen Request vor Rückgabe ausführen (Standard). `true` = einen neuen Request vor Rückgabe ausführen. Der zusätzliche Request wird automatisch von rex_api_function ausgeführt. |
| 98 | + |
| 99 | +#### Ergebnis JSON kodieren |
| 100 | +``` |
| 101 | +// Ergebnis kodieren |
| 102 | +// Wandelt die Daten eines rex_api_result Objektes in einen JSON-String |
| 103 | +$json = $result->toJSON(); |
| 104 | +
|
| 105 | +// Ergebnis dekodieren |
| 106 | +// Wandelt ein JSON kodiertes Ergebnis zurück in ein rex_api_result Objekt. |
| 107 | +$result = rex_api_result::fromJSON($json); |
| 108 | +``` |
| 109 | + |
| 110 | +### rex_api_exception |
| 111 | +Diese Exception kann abgefangen werden. Im Normalfall wird sie von REDAXO als Whoops-Meldung ausgeben. |
| 112 | + |
0 commit comments