diff --git a/.docs/README.md b/.docs/README.md deleted file mode 100644 index 9c49819..0000000 --- a/.docs/README.md +++ /dev/null @@ -1,109 +0,0 @@ -# Documentation - -## Setup - -Create `api/index.php`: - -```php -use(Middlewares::cors()); - -$app->getRouter()->get('/api/hello', fn(Request $r) => ['message' => 'Hello']); - -$app->run(); -``` - -Create `vercel.json`: - -```json -{ - "functions": { - "api/*.php": { - "runtime": "vercel-php@0.7.2" - } - }, - "rewrites": [ - { "source": "/api/(.*)", "destination": "/api/index.php" } - ] -} -``` - -## Routing - -```php -$router = $app->getRouter(); - -$router->get('/api/users', fn(Request $r) => ['users' => []]); -$router->post('/api/users', fn(Request $r) => ['created' => true]); -$router->put('/api/users/', fn(Request $r) => ['updated' => true]); -$router->delete('/api/users/', fn(Request $r) => ['deleted' => true]); -$router->any('/api/any', fn(Request $r) => ['method' => $r->getMethod()]); - -// Parameters -$router->get('/api/users/', fn(Request $r) => ['id' => $r->getParam('id')]); -$router->get('/api/users/', fn(Request $r) => ['id' => (int) $r->getParam('id')]); -$router->get('/api/page[/]', fn(Request $r) => ['page' => $r->getParam('page')]); -``` - -## Request - -```php -$request->getMethod(); // GET, POST, ... -$request->getPath(); // /api/users -$request->getParam('id'); // Route parameter -$request->getQueryParam('page'); // Query string -$request->getBodyParam('name'); // JSON/form body -$request->getHeader('Authorization'); -``` - -## Response - -```php -use Contributte\Vercel\Response; - -Response::json(['data' => 'value']); -Response::json(['created' => true], 201); -Response::html('

Hello

'); -Response::text('Hello'); -Response::redirect('/other'); -Response::notFound(); -Response::badRequest(); -Response::error('Server error', 500); -``` - -## Middleware - -```php -use Contributte\Vercel\Middlewares; - -$app->use(Middlewares::cors()); -$app->use(Middlewares::cors( - allowOrigin: 'https://example.com', - allowMethods: 'GET, POST', - allowHeaders: 'Content-Type', - maxAge: 3600 -)); - -// Custom middleware -$app->use(function (Request $request, callable $next) { - // before - $response = $next($request); - // after - return $response; -}); -``` - -## Error Handling - -```php -$app->onNotFound(fn(Request $r) => Response::json(['error' => 'Not found'], 404)); -$app->onError(fn(Throwable $e, Request $r) => Response::error($e->getMessage())); -``` diff --git a/README.md b/README.md index 3bdbef0..24c1194 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,33 @@ -# Contributte / Vercel +![](https://heatbadger.now.sh/github/readme/contributte/vercel/) -Simple PHP framework for Vercel serverless functions. +

+ + + + + +

+

+ + + + + +

-[![Build Status](https://badgen.net/github/checks/contributte/vercel/master)](https://github.com/contributte/vercel/actions) -[![Coverage Status](https://badgen.net/coveralls/c/github/contributte/vercel)](https://coveralls.io/github/contributte/vercel) -[![Downloads](https://badgen.net/packagist/dt/contributte/vercel)](https://packagist.org/packages/contributte/vercel) -[![Latest version](https://badgen.net/packagist/v/contributte/vercel)](https://packagist.org/packages/contributte/vercel) -[![PHPStan](https://badgen.net/badge/PHPStan/level%209/green)](https://github.com/phpstan/phpstan) +

+Website contributte.org | Contact f3l1x.io | Twitter @contributte +

-## Usage +Simple PHP framework for routing Vercel serverless functions with requests, responses and middleware. + +## Versions + +| State | Version | Branch | Nette | PHP | +|-------|---------|----------|--------|---------| +| dev | `^0.1` | `master` | `3.2+` | `>=8.2` | + +## Installation To install the latest version of `contributte/vercel` use [Composer](https://getcomposer.com). @@ -16,21 +35,119 @@ To install the latest version of `contributte/vercel` use [Composer](https://get composer require contributte/vercel ``` -## Documentation +## Setup -For details, check out https://contributte.org/packages/contributte/vercel +Create `api/index.php`: -## Versions +```php +=8.2` | +require_once __DIR__ . '/../vendor/autoload.php'; + +use Contributte\Vercel\Application; +use Contributte\Vercel\Middlewares; +use Contributte\Vercel\Request; + +$app = new Application(); +$app->use(Middlewares::cors()); + +$app->getRouter()->get('/api/hello', fn(Request $r) => ['message' => 'Hello']); + +$app->run(); +``` + +Create `vercel.json`: + +```json +{ + "functions": { + "api/*.php": { + "runtime": "vercel-php@0.7.2" + } + }, + "rewrites": [ + { "source": "/api/(.*)", "destination": "/api/index.php" } + ] +} +``` + +## Routing + +```php +$router = $app->getRouter(); + +$router->get('/api/users', fn(Request $r) => ['users' => []]); +$router->post('/api/users', fn(Request $r) => ['created' => true]); +$router->put('/api/users/', fn(Request $r) => ['updated' => true]); +$router->delete('/api/users/', fn(Request $r) => ['deleted' => true]); +$router->any('/api/any', fn(Request $r) => ['method' => $r->getMethod()]); + +// Parameters +$router->get('/api/users/', fn(Request $r) => ['id' => $r->getParam('id')]); +$router->get('/api/users/', fn(Request $r) => ['id' => (int) $r->getParam('id')]); +$router->get('/api/page[/]', fn(Request $r) => ['page' => $r->getParam('page')]); +``` + +## Request + +```php +$request->getMethod(); // GET, POST, ... +$request->getPath(); // /api/users +$request->getParam('id'); // Route parameter +$request->getQueryParam('page'); // Query string +$request->getBodyParam('name'); // JSON/form body +$request->getHeader('Authorization'); +``` + +## Response + +```php +use Contributte\Vercel\Response; + +Response::json(['data' => 'value']); +Response::json(['created' => true], 201); +Response::html('

Hello

'); +Response::text('Hello'); +Response::redirect('/other'); +Response::notFound(); +Response::badRequest(); +Response::error('Server error', 500); +``` + +## Middleware + +```php +use Contributte\Vercel\Middlewares; + +$app->use(Middlewares::cors()); +$app->use(Middlewares::cors( + allowOrigin: 'https://example.com', + allowMethods: 'GET, POST', + allowHeaders: 'Content-Type', + maxAge: 3600 +)); + +// Custom middleware +$app->use(function (Request $request, callable $next) { + // before + $response = $next($request); + // after + return $response; +}); +``` + +## Error Handling + +```php +$app->onNotFound(fn(Request $r) => Response::json(['error' => 'Not found'], 404)); +$app->onError(fn(Throwable $e, Request $r) => Response::error($e->getMessage())); +``` ## Development See [how to contribute](https://contributte.org/contributing.html) to this package. -This package is currently maintaining by these authors. +This package is currently maintained by these authors.