Siler is a set of general purpose high-level abstractions aiming an API for declarative programming in PHP.
This is a fork of leocavalcante/siler
. Please visit https://github.com/leocavalcante/siler to learn more about the package.
The only addition is the fact that this fork supports type config decorator
. It will be taken down once the PR on leocavalcante/siler
is merged.
- 💧 Files and functions as first-class citizens
- 🔋 Zero dependency, everything is on top of PHP built-in functions
- ⚡ Blazing fast, no additional overhead - benchmark
Use with Swoole
Flat files and plain-old PHP functions rocking on a production-grade, high-performance, scalable, concurrent and non-blocking HTTP server.
$ composer require cmdlucas/siler-fork
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.
$ composer create-project siler/project hello-siler
It's a minimal project template, just with Siler and a convenient serve
script:
$ cd hello-siler/
$ composer serve
use Siler\Functional as λ;
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.
As said before, Siler aims to use PHP files and functions as first-class citizens, so no Controllers here. If you want to call something more self-container instead of a Closure, you can simply give a PHP filename then Siler will require it for you.
index.php
use Siler\Route;
Route\get('/', 'pages/home.php');
pages/home.php
echo 'Hello World';
Siler doesn't try to be a fully-featured framework - don't even aim to be a framework - instead it embraces component based architectures and offers helper functions to work with this components under PHP namespaces.
Is one of the libraries that has helpers functions making work with templates quite simple.
$ composer require twig/twig
use Siler\Functional as F;
use Siler\Route;
use Siler\Twig;
Twig\init('path/to/templates');
Route\get('/', F\puts(Twig\render('template.twig')));
Siler also brings helper functions for vlucas/phpdotenv, so you can easily acomplish twelve-factor apps.
$ composer require vlucas/phpdotenv
.env
TWIG_DEBUG=true
index.php
use Siler\Dotenv;
use Siler\Route;
use Siler\Twig;
Dotenv\init('path/to/.env');
Twig\init('path/to/templates', 'path/to/templates/cache', Dotenv\env('TWIG_DEBUG'));
Route\get('/', 'pages/home.php');
Monolog sends your logs to files, sockets, inboxes, databases and various web services. See the complete list of handlers here. Special handlers allow you to build advanced logging strategies.
$ composer require monolog/monolog
use Siler\Monolog as Log;
Log\handler(Log\stream(__DIR__.'/siler.log'));
Log\debug('debug', ['level' => 'debug']);
Log\info('info', ['level' => 'info']);
Log\notice('notice', ['level' => 'notice']);
Log\warning('warning', ['level' => 'warning']);
Log\error('error', ['level' => 'error']);
Log\critical('critical', ['level' => 'critical']);
Log\alert('alert', ['level' => 'alert']);
Log\emergency('emergency', ['level' => 'emergency']);
A query language for your API. Thanks to webonyx/graphql-php you can build you Schema from a type definitions string and thanks to Siler you can tie them to resolvers:
$ composer require webonyx/graphql-php
schema.graphql
type Query {
message: String
}
type Mutation {
sum(a: Int, b: Int): Int
}
index.php
use Siler\Graphql;
use Siler\Http\Response;
// Enable CORS for GraphiQL
Response\header('Access-Control-Allow-Origin', '*');
Response\header('Access-Control-Allow-Headers', 'content-type');
$typeDefs = file_get_contents('path/to/schema.graphql');
$resolvers = [
'Query' => [
'message' => 'foo',
],
'Mutation' => [
'sum' => function ($root, $args) {
return $args['a'] + $args['b'];
},
],
];
Graphql\init(Graphql\schema($typeDefs, $resolvers));
MIT 2019