Description
Siler is a set of general purpose high-level abstractions aiming an API for declarative programming in PHP.
Siler alternatives and similar libraries
Based on the "Micro Frameworks" category.
Alternatively, view Siler alternatives based on common mentions on social networks and blogs.
-
Liten
Liten is a small and simple micro framework which can be used to build restful services and apps.
CodeRabbit: AI Code Reviews for Developers

* Code Quality Rankings and insights are calculated and provided by Lumnify.
They vary from L1 to L5 with "L5" being the highest.
Do you think we are missing an alternative of Siler or a related project?
Popular Comparisons
README
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.
Getting started
Installation
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
).
JSON
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.
Swoole
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();
GraphQL
Install peer-dependency:
composer require webonyx/graphql-php
Schema-first
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));
Code-first
Another peer-dependency:
composer require doctrine/annotations
Then:
/**
* @\Siler\GraphQL\Annotation\ObjectType()
*/
final class Query
{
/**
* @\Siler\GraphQL\Annotation\Field()
*/
public static 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?
License
- MIT license
- Copyright 2020 © LC
*Note that all licence references and agreements mentioned in the Siler README section above
are relevant to that project's source code only.