Formát callbacků

V plugin.json je možné definovat callback několika možnými způsoby.

(Argumenty předané callbacku závisí na konkrétním způsobu jeho použití. Viz dokumentace plugin.json daného typu pluginu.

Skript

Nejjednodušší způsob definice callbacku. Cesta k PHP skriptu, který vrátí funkci, kterou je možné zavolat.

{"script": "example_script.php"}

Příklad example_script.php:

<?php

return function () {
    
// do something
};

Tip: Uvnitř funkce (closure) je dostupná proměnná $this, která obsahuje instanci pluginu, který tento skript definoval.

Metoda

Definice metody, která se má zavolat na instanci pluginu. Hodí se zejména pokud plugin definuje vlastní třídu v plugin.json pomocí klíče "class".

{"method": "fooBar"}

Příklad metody ve třídě pluginu:

<?php

namespace SunlightExtend\Example;

use 
Sunlight\Plugin\ExtendPlugin;

class 
ExamplePlugin extends ExtendPlugin
{
    function 
fooBar()
    {
        
// do something
    
}
}

Callback

Libovolný PHP callback.

{"callback": "some_function"}
{"callback": "SomeClass::some_method"}
{"callback": ["SomeClass", "some_method"]}

Middlewares

U každého typu callbacku je navíc možné definovat seznam middlewares. Každý middleware je další definice callbacku (tedy skript, metoda nebo callback).

{
    "script": "example_script.php",
    "middlewares": [
        {"callback": "FirstMiddleware::doSomething"},
        {"callback": "SecondMiddleware::doSomething"}
    ]
}

Middleware je zavolán před hlavním callbackem. Dostane následující argumenty:

Každý middleware tedy efektivně "obalí" následující vrstvu a může provádět následující:

Příklady middlewares

Middleware, které přeskočí volání callbacku, když uživatel není přihlášený:

<?php

use Sunlight\User;

return function ($next, ...$args) {
    if (!User::isLoggedIn()) {
        return;
    }

    $next(...$args);
};

Middleware (použitelný s extend plugin routes), které automaticky zformátuje a pošle návratovou hodnotu callbacku jako JSON:

<?php

use Sunlight\Plugin\PluginRouterMatch;
use Sunlight\Util\Response;
use Sunlight\WebState;

return function ($next, WebState $index, PluginRouterMatch $match) {
    Response::json($next($index, $match));
};