# Service API

> Nutzung des Cronjob-Dienstes aus anderen Modulen

---

Benachbarte Module fragen den Status des Moduls über eine stabile, schreibgeschützte Schnittstelle (`CronjobService`) ab, anstatt auf dessen interne Dienste zurückzugreifen. Überprüfen Sie zunächst die Verfügbarkeit –
das Modul ist möglicherweise nicht installiert, und die Klasse kann nur automatisch geladen werden, wenn die Datei
<a href="https://github.com/bschwede/wt-cronjob/tree/main/module.php" target="_blank" rel="noopener"><code>module.php</code></a>
 geladen wurde:

<div class="highlight"><pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-php" data-lang="php"><span style="display:flex;"><span><span style="color:#91d7e3;font-weight:bold">&lt;?</span>php
</span></span><span style="display:flex;"><span><span style="color:#c6a0f6">use</span> Schwendinger\Webtrees\Module\Cronjob\Services\CronjobService;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#c6a0f6">if</span> (class_exists(CronjobService<span style="color:#91d7e3;font-weight:bold">::</span><span style="color:#8aadf4">class</span>) <span style="color:#91d7e3;font-weight:bold">&amp;&amp;</span> CronjobService<span style="color:#91d7e3;font-weight:bold">::</span><span style="color:#8aadf4">isFunctional</span>()) {
</span></span><span style="display:flex;"><span>    <span style="color:#f4dbd6">$status</span> <span style="color:#91d7e3;font-weight:bold">=</span> CronjobService<span style="color:#91d7e3;font-weight:bold">::</span><span style="color:#8aadf4">jobStatus</span>(<span style="color:#a6da95">&#39;mymodule:backup&#39;</span>); <span style="color:#6e738d;font-style:italic">// null = unknown job
</span></span></span><span style="display:flex;"><span>    <span style="color:#f4dbd6">$age</span> <span style="color:#91d7e3;font-weight:bold">=</span> CronjobService<span style="color:#91d7e3;font-weight:bold">::</span><span style="color:#8aadf4">lastTickAge</span>();                <span style="color:#6e738d;font-style:italic">// seconds since last tick
</span></span></span><span style="display:flex;"><span>    <span style="color:#f4dbd6">$listened</span> <span style="color:#91d7e3;font-weight:bold">=</span> CronjobService<span style="color:#91d7e3;font-weight:bold">::</span><span style="color:#8aadf4">listenedEvents</span>();             <span style="color:#6e738d;font-style:italic">// event name =&gt; job names
</span></span></span><span style="display:flex;"><span>}</span></span></code></pre></div>

| Frage | Methode(n) |
| --- | --- |
| Ist der Dienst funktionsfähig? | `isFunctional()`, `problems()` (Codes: `module_disabled`, `not_migrated`, `cron_library_missing`, `tick_stale`) |
| Welche Funktionen sind aktiviert? | `features()` (`watch`, `pseudo_events`, `route_events`), `watchStatus()` |
| Wann wurde der letzte Tick ausgeführt? | `lastTick()` / `lastTickAge()` – beide Trigger-Typen (Marker-Datei `data/cronjob/tick.last`) |
| Ist ein Job aktiviert / wann wurde er zuletzt ausgeführt? | `isJobEnabled($name)`, `jobStatus($name)`, `lastRun($name)` – Jobnamen sind mit einem Namespace versehen (`<Modul>:<Name>`) |
| Auf welche Ereignisse wird gewartet? | `listenedEvents()`, `listenersFor($event)`; Kataloge: `eventCatalog()`, `pseudoEvents()`, `routeEvents()` |
| Aktionen (die einzigen beiden) | `runJobNow($name)` (wird beim nächsten Tick in die Warteschlange gestellt), `pushEvent($name, $payload)` (Ereigniswarteschlange) |

Vertrag: Schreibgeschützte Methoden lösen niemals einen Fehler aus, wenn das Schema fehlt (sichere Standardwerte),
Beschreibungen sind Quelltext-Strings (werden niemals vorab übersetzt), und `lastRun()` schließt bewusst
die Job-Ausgabe aus, da diese personenbezogene Daten enthalten kann.
