Awesome Open Source
Awesome Open Source

Build codecov Psalm coverage Latest Stable Version Total Downloads License

Siler is a set of general purpose high-level abstractions aiming an API for declarative programming in PHP.

  • Files and functions as first-class citizens
  • Zero dependency, everything is on top of PHP built-in functions
  • Blazing fast, no additional overhead - benchmark 1, benchmark 2 and benchmark 3

Use with Swoole

Flat files and plain-old PHP functions rocking on a production-grade, high-performance, scalable, concurrent and non-blocking HTTP server.

Read the tutorial.

Getting started


$ composer require leocavalcante/siler

That is it. Actually, Siler is a library, not a framework (maybe a micro-framework), the overall program flow of control is dictated by you. So, no hidden configs or predefined directory structures.

Hello, World!

use Siler\Functional as ; // Just to be cool, don't use non-ASCII identifiers ;)
use Siler\Route;

Route\get('/', \puts('Hello, World!'));

Nothing more, nothing less. You don't need even tell Siler to run or something like that (puts works like a lazily evaluated echo).


use Siler\Route;
use Siler\Http\Response;

Route\get('/', fn() => Response\json(['message' => 'Hello, World!']));

The Response\json function will automatically add Content-type: application/json in the response headers.


Siler provides first-class support for Swoole. You can regularly use Route, Request and Response modules for a Swoole HTTP server.

use Siler\Http\Response;
use Siler\Route;
use Siler\Swoole;

$handler = function () {
    Route\get('/', fn() => Response\json('Hello, World!'));

$port = 8000;
echo "Listening on port $port\n";
Swoole\http($handler, $port)->start();


Install peer-dependency:

composer require webonyx/graphql-php


type Query {
    hello: String
use Siler\Route;
use Siler\GraphQL;

$type_defs = file_get_contents(__DIR__ . '/schema.graphql');
$resolvers = [
    'Query' => [
        'hello' => fn ($root, $args, $context, $info) => 'Hello, World!'

$schema = GraphQL\schema($type_defs, $resolvers);

Route\post('/graphql', fn() => GraphQL\init($schema));


Another peer-dependency:

composer require doctrine/annotations


 * @\Siler\GraphQL\Annotation\ObjectType()
final class Query
     * @\Siler\GraphQL\Annotation\Field()
    static public function hello($root, $args, $context, $info): string
        return 'Hello, World!';
use Siler\GraphQL;
use Siler\Route;

$schema = GraphQL\annotated([Query::class]);

Route\post('/graphql', fn() => GraphQL\init($schema));

Object type name will be guessed from class name, same for field name, and it's return type (i.e.: PHP string scalar === GraphQL String scalar).

What is next?



Get A Weekly Email With Trending Projects For These Topics
No Spam. Unsubscribe easily at any time.
Php (402,870
Hacktoberfest (22,722
Library (11,179
Graphql (8,118
Http (5,530
Websocket (5,264
Routing (1,035
Functional (939
Swoole (538
Http2 (473
Psr 7 (373
Micro Framework (362
Psr 15 (253
Psr 11 (186
Related Projects