Tempest – ett nytt lite annorlunda PHP-ramverk

Marcus Olsson,

Brendt Roose (stitcher.io) har precis presenterat vad han har jobbat på de senaste månaderna, ett nytt PHP-ramverk med namnet "Tempest".

I hans egna ord är ramverket inte byggt för att ersätta eller konkurrera med Laravel eller Symphony, utan mer vara ett komplement för mindre PHP-applikationer.

Det som gör Tempest intressant är att det är extremt flexibelt. Istället för att bygga på en förutbestämd struktur så läser ramverket av ens kod för därifrån "förstå" vilka delar som är t.ex. en controller, en modell eller något helt annat.

T.ex. så skulle ens applikations struktur kunna vara:

1app
2├── Http
3│ └── UserController.php
4├–– Models
5│ └── User.php
1app
2├── Http
3│ └── UserController.php
4├–– Models
5│ └── User.php

Eller likväl:

1app
2├── User
3│ ├── User.php
4│ └── UserController.php
1app
2├── User
3│ ├── User.php
4│ └── UserController.php

Tempest löser det automatiskt. Men hurdå? Jo, främst via PHP Attributes. T.ex:

1final readonly class UserController
2{
3 #[Get('/')]
4 public function index()
5 {
6 //
7 }
8 
9 #[Get('/user/{user}')]
10 public function show(User $user)
11 {
12 //
13 }
14}
1final readonly class UserController
2{
3 #[Get('/')]
4 public function index()
5 {
6 //
7 }
8 
9 #[Get('/user/{user}')]
10 public function show(User $user)
11 {
12 //
13 }
14}

Där Get helt enkelt är ett attribute (källkod):

1use Attribute;
2 
3#[Attribute]
4final class Get extends Route
5{
6 public function __construct(string $uri)
7 {
8 parent::__construct(
9 uri: $uri,
10 method: Method::GET,
11 );
12 }
13}
1use Attribute;
2 
3#[Attribute]
4final class Get extends Route
5{
6 public function __construct(string $uri)
7 {
8 parent::__construct(
9 uri: $uri,
10 method: Method::GET,
11 );
12 }
13}

Vid runtime så går Tempest igenom all ens kod hanterar den "verkliga" strukturen internt. I produktion i cache:as detta så det ska inte påverka laddningstider eller övrig prestanda jämfört med ett mer traditionellt ramverk.

Det hela är väldigt smart, och jag kan definitivt se användning för detta när en mindre enklare app ska byggas (jag ser på dig elchock.se – eller för all dell denna sajten, marcusolsson.me, som båda bygger på Laravel). Vidare utlovar Brendt "zero config" och "minimal setup", precis som man vill ha det.

Spana in repot på Github, än så länge är det i ett tidigt stadie – men ska bli väldigt kul att följa och testa på riktigt när tillfälle ges. Tips: grundläggande dokumentation finns i ett eget repo, tempestphp/tempest-docs