# Action-Lebenszyklus, Ergebnisverlängerung und Administrator Guards

> Üben Sie Oninput, Onoutput, Extend, Sa und Su mit gültigen, invalid und fehlenden Aktionen.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: de
Content-SHA256: 0b34b09c0916d6890a45279dae90b704ee0ed5e180821d4de7a9089ab2b45721
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

`oninput($)` läuft nach der Eingabevalidierung und der deklarierten Middleware, unmittelbar vor der Aktionsfunktion. `onoutput(error,response,$)` läuft auf dem Pfad des erfolgreichen Abschlusses, nach der Ausgabefilterung und der optionalen Erweiterung. In 0.0.19 ruft eine ungültige Eingabe oder `$.invalid()` diesen Hook nicht auf; behandle ihn nicht als universellen Fehler- oder Finally-Hook.

`extend:'result'` fügt das Ergebnis der Aktion unter diesem Schlüssel zu ihrer validierten Eingabe hinzu und gibt die erweiterte Eingabe zurück. Ein Pfad mit Punkten verwendet verschachtelte Zuweisung. Es ist nützlich für die bewusste Komposition von Aktionen; es ändert den öffentlichen Vertrag der Antwort.

Egal ob `sa:true` oder `su:true` erfordert einen Benutzer mit einer Administrator-Flagge. Sie definieren keine zwei verschiedene Privileg-Tier. Normale Genehmigungsprüfungen bleiben getrennt.

```js definitions/hooks.js
MAIN.hooks = [];
AUTH(function($) {
	var role = $.headers['x-demo-role'];
	if (role === 'sa' || role === 'su') $.success({ id:'admin', [role]:true });
	else if (role === 'member') $.success({id:'member'});
	else $.invalid();
});
NEWACTION('Hooks|extend', {
	input: '*name:String',
	extend: 'result',
	oninput: function($) { MAIN.hooks.push('input:' + $.payload.name); },
	onoutput: function(err, response) { MAIN.hooks.push('output:' + response.result.greeting); },
	action: function($, model) { $.callback({greeting:'Hello ' + model.name}); }
});
NEWACTION('Hooks|fail', {
	onoutput: function() { MAIN.hooks.push('unexpected'); },
	action: function($) { $.invalid('failed'); }
});
for (var flag of ['sa','su']) {
	var action = { action:function($) { $.success(); } };
	action[flag] = true;
	NEWACTION('Hooks|' + flag, action);
}
```

```js controllers/hooks.js
exports.install = function() {
	ROUTE('POST /extend/ @json --> Hooks|extend');
	ROUTE('GET /fail/ --> Hooks|fail');
	ROUTE('GET /sa/ --> Hooks|sa');
	ROUTE('GET /su/ --> Hooks|su');
	ROUTE('GET /hook-events/', $ => $.json(MAIN.hooks));
};
```
