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.
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.
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
}
}
Libovolný PHP callback.
{"callback": "some_function"} {"callback": "SomeClass::some_method"} {"callback": ["SomeClass", "some_method"]}
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:
$next
- funkce, která zavolá další middleware; pokud další middleware neexistuje, zavolá hlavní callbackKaždý middleware tedy efektivně "obalí" následující vrstvu a může provádět následující:
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)); };