Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
109 changes: 109 additions & 0 deletions .docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
# Documentation

## Setup

Create `api/index.php`:

```php
<?php declare(strict_types=1);

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/<id>', fn(Request $r) => ['updated' => true]);
$router->delete('/api/users/<id>', fn(Request $r) => ['deleted' => true]);
$router->any('/api/any', fn(Request $r) => ['method' => $r->getMethod()]);

// Parameters
$router->get('/api/users/<id>', fn(Request $r) => ['id' => $r->getParam('id')]);
$router->get('/api/users/<id \\d+>', fn(Request $r) => ['id' => (int) $r->getParam('id')]);
$router->get('/api/page[/<page=1>]', 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('<h1>Hello</h1>');
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()));
```
13 changes: 13 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = tab
indent_size = 4

[*.{json,yaml,yml,md}]
indent_style = space
indent_size = 2
9 changes: 9 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
.docs export-ignore
.editorconfig export-ignore
.gitattributes export-ignore
.gitignore export-ignore
.github export-ignore
Makefile export-ignore
phpstan.neon export-ignore
ruleset.xml export-ignore
tests export-ignore
17 changes: 17 additions & 0 deletions .github/workflows/codesniffer.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
name: Codesniffer

on:
pull_request:
workflow_dispatch:
push:
branches:
- "**"
schedule:
- cron: "0 8 * * 1"

jobs:
codesniffer:
name: Codesniffer
uses: contributte/.github/.github/workflows/codesniffer.yml@master
with:
php: 8.2
17 changes: 17 additions & 0 deletions .github/workflows/coverage.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
name: Coverage

on:
pull_request:
workflow_dispatch:
push:
branches:
- "**"
schedule:
- cron: "0 9 * * 1"

jobs:
coverage:
name: Nette Tester
uses: contributte/.github/.github/workflows/nette-tester-coverage-v2.yml@master
with:
php: 8.2
17 changes: 17 additions & 0 deletions .github/workflows/phpstan.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
name: Phpstan

on:
pull_request:
workflow_dispatch:
push:
branches:
- "**"
schedule:
- cron: "0 10 * * 1"

jobs:
phpstan:
name: Phpstan
uses: contributte/.github/.github/workflows/phpstan.yml@master
with:
php: 8.2
42 changes: 42 additions & 0 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
name: Tests

on:
pull_request:
workflow_dispatch:
push:
branches:
- "**"
schedule:
- cron: "0 10 * * 1"

jobs:
test85:
name: Tests (PHP 8.5)
uses: contributte/.github/.github/workflows/nette-tester.yml@master
with:
php: 8.5

test84:
name: Tests (PHP 8.4)
uses: contributte/.github/.github/workflows/nette-tester.yml@master
with:
php: 8.4

test83:
name: Tests (PHP 8.3)
uses: contributte/.github/.github/workflows/nette-tester.yml@master
with:
php: 8.3

test82:
name: Tests (PHP 8.2)
uses: contributte/.github/.github/workflows/nette-tester.yml@master
with:
php: 8.2

testlowest:
name: Tests (PHP 8.2, lowest)
uses: contributte/.github/.github/workflows/nette-tester.yml@master
with:
php: 8.2
composer: composer update --no-interaction --no-progress --prefer-dist --prefer-lowest --prefer-stable
11 changes: 11 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
/.idea

/vendor
/composer.lock

/tests/tmp
/coverage.*
*.log
*.html
*.expected
*.actual
34 changes: 34 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
.PHONY: install
install:
composer update

.PHONY: qa
qa: phpstan cs

.PHONY: cs
cs:
ifdef GITHUB_ACTION
vendor/bin/phpcs --standard=ruleset.xml --extensions="php,phpt" --encoding=utf-8 --colors -nsp -q --report=checkstyle src tests | cs2pr
else
vendor/bin/phpcs --standard=ruleset.xml --extensions="php,phpt" --encoding=utf-8 --colors -nsp src tests
endif

.PHONY: csf
csf:
vendor/bin/phpcbf --standard=ruleset.xml --extensions="php,phpt" --encoding=utf-8 --colors -nsp src tests

.PHONY: phpstan
phpstan:
vendor/bin/phpstan analyse -c phpstan.neon

.PHONY: tests
tests:
vendor/bin/tester -s -p php --colors 1 -C tests/Cases

.PHONY: coverage
coverage:
ifdef GITHUB_ACTION
vendor/bin/tester -s -p phpdbg --colors 1 -C --coverage ./coverage.xml --coverage-src ./src tests/Cases
else
vendor/bin/tester -s -p phpdbg --colors 1 -C --coverage ./coverage.html --coverage-src ./src tests/Cases
endif
41 changes: 41 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# 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)

## Usage

To install the latest version of `contributte/vercel` use [Composer](https://getcomposer.com).

```bash
composer require contributte/vercel
```

## Documentation

For details, check out https://contributte.org/packages/contributte/vercel

## Versions

| State | Version | Branch | Nette | PHP |
|-------|---------|----------|--------|---------|
| dev | `^0.1` | `master` | `3.2+` | `>=8.2` |

## Development

See [how to contribute](https://contributte.org/contributing.html) to this package.

This package is currently maintaining by these authors.

<a href="https://github.com/f3l1x">
<img width="80" height="80" src="https://avatars.githubusercontent.com/f3l1x">
</a>

---

Consider to [support](https://github.com/sponsors/f3l1x) **contributte** development team. Also thank you for using this package.
55 changes: 52 additions & 3 deletions composer.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,53 @@
{
"name": "juicyfx/now",
"description": "ZEIT Now PHP client"
}
"name": "contributte/vercel",
"description": "Simple PHP framework for Vercel with routing based on nette/routing",
"license": "MIT",
"keywords": [
"vercel",
"php",
"framework",
"routing",
"serverless",
"nette"
],
"authors": [
{
"name": "Milan Felix Sulc",
"homepage": "https://f3l1x.io"
}
],
"require": {
"php": ">=8.2",
"nette/http": "^3.3.0",
"nette/routing": "^3.1.0"
},
"require-dev": {
"contributte/phpstan": "~0.1.0",
"contributte/qa": "~0.4.0",
"contributte/tester": "~0.3.0",
"nette/tester": "^2.5.0"
},
"autoload": {
"psr-4": {
"Contributte\\Vercel\\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/"
}
},
"minimum-stability": "dev",
"prefer-stable": true,
"extra": {
"branch-alias": {
"dev-master": "0.1.x-dev"
}
},
"config": {
"sort-packages": true,
"allow-plugins": {
"dealerdirect/phpcodesniffer-composer-installer": true
}
}
}
16 changes: 16 additions & 0 deletions phpstan.neon
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
includes:
- vendor/contributte/phpstan/phpstan.neon

parameters:
level: 9
phpVersion: 80200

scanDirectories:
- src

fileExtensions:
- php

paths:
- src
- tests
Loading