PHPackages                             rxthunder/skeleton - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Framework](/categories/framework)
4. /
5. rxthunder/skeleton

ActiveProject[Framework](/categories/framework)

rxthunder/skeleton
==================

Fork &amp; Play repository, production grade, of event driven CLI micro framework with Reactive Programming flavors

1.0.0(6y ago)1102MITPHP

Since Dec 19Pushed 6y ago2 watchersCompare

[ Source](https://github.com/RxThunder/Skeleton)[ Packagist](https://packagist.org/packages/rxthunder/skeleton)[ RSS](/packages/rxthunder-skeleton/feed)WikiDiscussions master Synced 3d ago

READMEChangelogDependencies (1)Versions (7)Used By (0)

[![](https://github.com/RxThunder/Core/raw/master/resources/thunder-logo.svg?sanitize=true)](https://github.com/RxThunder/Core/raw/master/resources/thunder-logo.svg?sanitize=true)

[![License](https://camo.githubusercontent.com/a3f9252f7dae316b0d20767226d327ef1b7d70676d91cffadfdd5d1771529217/68747470733a2f2f706f7365722e707567782e6f72672f72787468756e6465722f636f72652f6c6963656e7365)](https://packagist.org/packages/RxThunder/core)[![License](https://camo.githubusercontent.com/df9b35fb0f3e2ff47499b22844d2a754c5336ca59f22e51719dc5cb32e200e33/68747470733a2f2f706f7365722e707567782e6f72672f72787468756e6465722f636f72652f762f737461626c65)](https://packagist.org/packages/RxThunder/core)

About Thunder CLI μFramework
----------------------------

[](#about-thunder-cli-μframework)

This repository is the scaffold of the Thunder CLI micro-framework.

You can use it and modify the structure to adapt on your needs.

Philosophy
----------

[](#philosophy)

Sometimes you just need a very simple deamon, eventloop based, when you're event programming. A small repository for your boundary, with few dependencies, and don't want to be force to use a library or an other.

All you need is a reaction to an event that has been occurred in your system, externally or internally (pub/sub or saga f.e.).

However, this project is born inside a repository using Reactive Programming by default, RabbitMQ consumers, a router, EventStore projections and events, mysql, Redis connectors, and many more.

Simple but powerful.

What built in
-------------

[](#what-built-in)

### Console Component

[](#console-component)

The whole concept is based on consoles. Instead of reinvent the wheel, Thunder use [Silly](https://github.com/mnapoli/silly)micro-framework. A `Console` class being provided by the framework, allowing classes that extend it to be automatically loaded and usable.

### Dependency Injection

[](#dependency-injection)

Usage of the dependency injection pattern, ease decoupling your code and quality test writing. [Symfony DI](https://symfony.com/doc/current/components/dependency_injection.html)component has been chosen for it many features [](https://symfony.com/doc/current/components/dependency_injection.html#learn-more)improving developer experience.

### Configuration Component

[](#configuration-component)

This component allows you to use XML, YAML &amp; PHP files. You can access and use them directly into constructors through DI.

### Router

[](#router)

This component is central in the project, Command Bus and Event Dispatcher pattern aren't adapted to non acknowledge (`nack`) messages.

It's pretty straight forward, a `Route` can be associated to a `Controller` in a MVC schema. The core provide a base class called `Route` that allow to automatically load all classes extending it in the `Router`.

Each route have to define it's constant called `PATH`. It's used to determine which `Route` of your application must be invoked.

As we are in an event driven framework, all `Route` must return an `Observable`. The different plugins that you will use in your application, are subscribing to your `Observable` using `Observers` to determine actions to execute at the end of your event chain.

Installation
------------

[](#installation)

`composer create-project rxthunder/skeleton name-of-your-project`

Usage
-----

[](#usage)

### Console

[](#console)

At the begining, there is a console. CLI for Command Line Interface.

To start the project you need to execute a PHP file available in the vendors, `vendor/bin/thunder`.

All commands available will be prompted.

### Create a new Route

[](#create-a-new-route)

Create a class extending `Th3Mouk\Thunder\Router\Route` into `/src` and it will be automatically added to the router.

You can modify the `config/services.php` and `composer.json` autoload if you don't want to use `src` folder.

Your `Route` will now be invoked with the corresponding `DataModel` through the PATH constant.

#### Extra: Handler concept

[](#extra-handler-concept)

I personally use `src/route` and `src/handler` structure. The term `handler` coming from the Command Bus pattern.

An handler here, is a small invokable unit that can be reused in multiple contexts, sagas of events, or here again routes. The main advantage of this, is you can decouple your code and test it correctly, because yes, this handler will be automatically injected in the container, and you can use DI in its constructor 🎉.

An example can be:

```
// src/Handler/PromptHello.php
namespace App\Handler;

use Rx\Observable;
use RxThunder\Core\Model\DataModel;

class PromptHello
{
    public function __invoke(DataModel $data_model)
    {
        return Observable::of($data_model)
            ->do(function() {
                echo "hello there". PHP_EOL;
            });
    }
}
```

And finally you can use this unit in your route:

```
// src/Route/Test.php
namespace App\Route;

use App\Handler\PromptHello;
use Rx\Observable;
use RxThunder\Core\Model\DataModel;
use RxThunder\Core\Router\Route;

class Test extends Route
{
    public const PATH = '/test';

    private $prompt;

    public function __construct(
        PromptHello $prompt
    ) {
        $this->prompt = $prompt;
    }

    public function __invoke(DataModel $data_model): Observable
    {
        return Observable::of($data_model)
            ->do(function () {
                echo "i'm in /test".PHP_EOL;
            })
            ->flatMap($this->prompt)
            ->do(function () {
                echo "passed in /test".PHP_EOL;
            });
    }
}
```

### Start consuming

[](#start-consuming)

If you use the RabbitMQ plugin you can start consuming a queue with `php console rabbit:listen:broker test`(`test` is the name of the queue to consume)

Each message received by the queue will be transformed into a `DataModel`and the **routing key** correspond to the `type()` of it.

For example a message with `/test` routing key in RabbitMQ will be consumed by the route with `public const PATH = '/test';`

###  Health Score

28

—

LowBetter than 54% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity8

Limited adoption so far

Community9

Small or concentrated contributor base

Maturity65

Established project with proven stability

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~77 days

Recently: every ~92 days

Total

6

Last Release

2317d ago

Major Versions

0.6.0 → 1.0.02020-01-10

### Community

Maintainers

![](https://www.gravatar.com/avatar/5f31e3a808a4f015ebad005caa64866fc90e39475151fc95ef1e11f774d35505?d=identicon)[Th3Mouk](/maintainers/Th3Mouk)

---

Top Contributors

[![Th3Mouk](https://avatars.githubusercontent.com/u/5006899?v=4)](https://github.com/Th3Mouk "Th3Mouk (14 commits)")

---

Tags

rxphp

### Embed Badge

![Health badge](/badges/rxthunder-skeleton/health.svg)

```
[![Health](https://phpackages.com/badges/rxthunder-skeleton/health.svg)](https://phpackages.com/packages/rxthunder-skeleton)
```

###  Alternatives

[laravel/telescope

An elegant debug assistant for the Laravel framework.

5.2k67.8M192](/packages/laravel-telescope)[spiral/roadrunner

RoadRunner: High-performance PHP application server and process manager written in Go and powered with plugins

8.4k12.2M84](/packages/spiral-roadrunner)[nolimits4web/swiper

Most modern mobile touch slider and framework with hardware accelerated transitions

41.8k177.2k1](/packages/nolimits4web-swiper)[laravel/dusk

Laravel Dusk provides simple end-to-end testing and browser automation.

1.9k36.7M259](/packages/laravel-dusk)[laravel/prompts

Add beautiful and user-friendly forms to your command-line applications.

708181.8M596](/packages/laravel-prompts)[cakephp/chronos

A simple API extension for DateTime.

1.4k47.7M121](/packages/cakephp-chronos)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
