Jak implementovat a napojit Middleware s Presentery?

matronator
Člen | 38
+
0
-

Zdravím! Dělám jednoduchou stránku, která bude sloužit vlastně pouze jako API. Mám RouterFactory která vypadá takto:

declare(strict_types=1);

namespace App\Services;

use Nette\Application\Routers\RouteList;

class RouterFactory
{
	public static function createRouter(): RouteList
	{
		$router = new RouteList;
		$router->addRoute('api', 'Api:default');

		return $router;
	}
}

Jak mohu do Routeru přidat možnost přidávání vlastního Middlewaru? Abych to mohl dělat například takto:

$router->addRoute('api', 'Api:default', ['middleware' => 'auth']);

Nebo pokud vás napadá jak jinak implementovat s presentery middleware, tak prosím poraďte.

PS: Nechci používat žádnou knihovnu na API jako Apitte atd. Chci se obejít pouze s “defaultními” Nette balíčky.

Infanticide0
Člen | 96
+
+1
-

Tohle Nette, pokud vím, neumí. Nejblíž k tomu budou asi presenter Traity nebo Moduly a jejich BasePresentery (různý sekce API, různý MW pravidla).
Další cestou je si vytvořit vlastní Application po vzoru Apitte (vzít si jen tu podporu Middlewares)

Marek Bartoš
Nette Blogger | 1230
+
+3
-

Nejjednodušší bude nejspíš použít událost Nette\Application\Application::$onRequest, případně $onPresenter. V těch už si získáš request/presenter a rozhodneš zda middlewares spustit.
Volil bych spíš událost onPresenter ve které je dostupná instance presenteru – pro kontrolu, že se jedná o api presenter.
A předává se do ní i Application. Z Application si můžeš získat seznam requestů – ten aktuální bude v poli poslední. Ty předchozí jsou pro forward. Včetně forward na error presenter v případě, že routovaný presenter neexistuje.
Samotné middlewares už jen zavoláš v řadě za sebou a můžeš v nich vyhodit BadRequestException nebo přenastavit parametry requestu.

Editoval Marek Bartoš (24. 5. 20:51)

mystik
Člen | 298
+
0
-

Doporucil bych na API pouzit Apitte. Tyhle veci se s presentery delaji celkem slozite.