L'autre micro-framework PHP.
Syme est un petit framework PHP aidant à la réalisation d'applications Web. Simple et rapide, ce framework a été conçu pour accélérer le développement tout en restant modulaire et efficace. Applications Web, API Rest, Syme est l'outil incontournable de vos projets.
Documentation (en cours...):
https://pantaflex44.gitbook.io/documentation-de-syme/
Installation des dépendances:
bash $ composer install
Edition des configurations:
bash $ sudo nano config.php
Exemple d'utilisation:
<?php
declare(strict_types=1);
require_once './core.php';
use components\Data;
use components\Request;
use components\Response;
use components\Route;
Route::get('home', '/', function (Response $response): Response {
$response
->write("Bonjour le monde");
return $response;
});
Route::get('article', '/article/{id:[0-9]+}/author/{name}', function (int $id, string $name, Response $response, Data $data): Response {
$obj = ['article id' => $id, 'author name' => $name];
$obj = array_merge($obj, $data->all());
$response
->writeObject($obj)
->withStatus(200);
return $response;
});
Route::before('article', function(Request $request, Response $response, Data $data): void {
$data->set('who am i ?', "I'm a midlleware ;-)");
});
Route : Représente le moteur de routage
Sources: https://github.com/pantaflex44/Syme/blob/v1/components/core/Route.php
Schéma:
::extendWith(string $class): void
: Ajoute un composant au système de routage pour le rendre accessible dans chaque routes, middlewares, ou autres composants::isAsset(Request $request): string|false
: Indique si l'url correspond à un fichier à télécharger (fichier dans le dossier '/public')::sendAsset(string $filepath): void
: Envoie au visiteur le fichier correspondant à l'url (fichier dans le dossier '/public')::exists(string $routeName): bool
: Indique si une route existe par son nom::match(string $routeName): array|false
: Retourne les informations d'une route par son nom::isLinked(string $uri, array $methods = ['GET', 'POST', 'OPTIONS', 'PUT', 'PATCH', 'DELETE']): bool
: Indique si une route est bien attachée à un chemin et à une ou plusieurs méthodes HTTP::getUri(string $routeName, array $params = []): string|false
: Retourne le chemin associé à une route et spécifiant les attributs::getPath(string $routeName, array $params = []): string|false
: Retourne le chemin complet associé à une route et spécifiant les attributs::getUrl(string $routeName, array $params = []): string|false
: Retourne l'url complète associée à une route et spécifiant les attributs::toRequest(string $routeName, array $params = []): Request|false
: Transforme une route par son nom, en requète HTTP::redirect(string $routeName, array $params = [], int $status = 302): false
: Redirige le visiteur vers une route en fonction de son nom::apply(Request $request): array
: Applique la logique d'une route en fonction d'une requète passée en paramètres. Renvoie la requète modifiée et la réponse à envoyer::sendResponse(Request $initialRequest, null|Response $response): void
: Envoie le contenu d'une réponse en fonction de la requète HTTP::any(string $name, string $uri, callable $callback): void
: Enregistre une route pour toutes les méthodes HTTP::map(array $methods, string $name, string $uri, callable $callback): void
: Enregistre une route pour les méthodes HTTP spécifiées::get(string $name, string $uri, callable $callback): void
: Enregistre une route pour la méthode HTTP GET::post(string $name, string $uri, callable $callback): void
: Enregistre une route pour la méthode HTTP POST::put(string $name, string $uri, callable $callback): void
: Enregistre une route pour la méthode HTTP PUT::patch(string $name, string $uri, callable $callback): void
: Enregistre une route pour la méthode HTTP PATCH::delete(string $name, string $uri, callable $callback): void
: Enregistre une route pour la méthode HTTP DELETE::before(?string $routeName, callable|string $middleware): void
: Enregistre un middleware devant s'exécuter avant la logique d'une route::after(?string $routeName, callable|string $middleware): void
: Enregistre un middleware devant s'exécuter après la logique d'une routeRequest : Représente la requète HTTP courante
Sources: https://github.com/pantaflex44/Syme/blob/v1/components/core/Request.php
Schéma:
__construct(string $url = null)
: Constructeur::current(): Request
: Retourne la requète courantegetPath(): string
: Retourne le chemin de l'urlgetUri(): string
: Retourne la portion d'url correspondante au chemingetQueryString(): array
: Retourne la liste des attributs de l'urlgetFragment(): string
: Retourne le fragment de l'urlgetScheme(): string
: Retourne le schéma HTTPgetHost(): string
: Retourne l'hôtegetPort(): int
: Retourne le port utilisé par l'hôtegetDomain(): string
: Retourne le domaine completgetMethod(): string
: Retourne la méthode HTTPgetAcceptedLanguage(): array
: Retourne la liste des languages acceptésgetAcceptedEncoding(): array
: Retourne la liste des encodages acceptésgetAcceptedTypes(): array
: Retourne la liste des types de données acceptésgetUserAgent(): string
: Retourne l'agent HTTPgetRemoteAddress(): string
: Retourne l'adresse IP du visiteurgetRemotePort(): int
: Retourne le numéro du port utilisé par le visiteurgetUrl(bool $full = false): string
: Retourne l'url correspondantehasArgument(string $name): bool
: Indique si l'url contient des attributsgetArgument(string $name): false|string
: Retourne un attribut par son nomisXHRRequest(): bool
: Indique si c'est une requète AJAXhasHeader(string $header): bool
: Indique si une entète HTTP existegetHeaders(): array
: Retourne la liste des entètes HTTPgetHeader(string $header): false|string
: Retourne une entète HTTP par son nomgetAuthorization(): string
: Retourne le jeton d'authorisationgetContent(): mixed
: Retourne le contenu de la requètegetContentType(): string
: Retourne le type du contenu de la requètegetForm(): null|object
: Retourne le contenu d'un formulaire HTMLhasForm(): bool
: Indique si la requète contient un formlaire HTMLgetFiles(): UploadedFiles
: Retourne la liste des fichiers téléversésgetReferer(): bool|string
: Retourne l'url de la page précédenteResponse : Représente la réponse HTTP à renvoyer au visiteur
Sources: https://github.com/pantaflex44/Syme/blob/v1/components/core/Response.php
Schéma:
__construct(string $body = '', string $contentType = 'text/html')
: ConstructeurhasHeader(string $header): bool
: Indique si une entète HTTP a été ajoutéeremoveHeader(string $headerKey): bool
: Supprime une entète HTTPgetHeaders(): array
: Retourne la liste des entètes HTTPgetHeader(string $header): false|string
: Retourne une entète HTTPwithHeader(string $header): Response
: Ajoute une entète HTTPwithBearerAuthorization(string $bearer): Response
: Ajoute un un jeton d'authorizationwithHeaders(array $headers): Response
: Ajoute une liste d'entètes HTTPgetStatus(): int
: Retourne le status HTTP courantwithStatus(int $status): Response
: Modifie le status de la réponse HTTPgetContent(): string
: Retourne le contenu brut de la réponse HTTPgetGzipContent(): string
: Retourne le contenu compressé de la réponse HTTPgetContentType(): string
: Retourne le type mime du contenu de la réponsegetParsed(): array
: Retourne le contenu décomposé de la réponse HTTP. (XML, Json, multipart, form, data)getJson(bool $associative = true): mixed
: Retourne le contenu au format Jsonclear(): Response
: Supprime le contenu de la réponsewrite(string $content, string $contentType = 'text/html'): Response
: Modifie le contenu de la réponse HTTPprepend(string $content): Response
: Ajoute du contenu avant la réponse HTTPappend(string $content): Response
: Ajoute du contenu après la réponse HTTPwriteObject(mixed $object): Response
: Tranforme un objet PHP en contenu Json puis l'écrit dans la réponse HTTPwriteJson(string $json): Response
: Ecrit du contenu Json dans la réponse HTTPData : Représente le conteneur de données personnelles capable de traverser l'ensemble des logiques (Routes, Middleswares, Composants)
Sources: https://github.com/pantaflex44/Syme/blob/v1/components/core/Data.php
Schéma:
__construct()
: Constructeur.count(): int
: Retourne le nombre de données enregistréesclear(): void
: Supprime toutes les donnéesall(): array
: Retourne toutes les données enregistréesexists(string $key): bool
: Indique si une donnée existe par le nom de sa clefget(string $key): mixed
: Retourne la valeur d'une donnée en fonction du nom de sa clefset(string $key, mixed $value): void
: Modifie la valeur d'une donnéedelete(string $key): void
: Supprime une donnée en fonction de sa clefUploadedFile : Représente la réponse HTTP à renvoyer au visiteur
Sources: https://github.com/pantaflex44/Syme/blob/v1/components/core/UploadedFile.php
Schéma:
__construct(array $fileinfo)
: ConstructeurgetName(): string
: Retourne le nom du fichiergetType(): string
: Retourne le type du fichiergetSize(): int
: Retourne la taille du fichiergetReadableSize(): string
: Retourne la taille du fichier (au format lisible)getContentType(): false|string
: Retourne le type mime du contenu du fichiergetError(): int
: Retourne le numéro de l'erreur ou UPLOAD_ERR_OK si aucune erreurhasError(): bool
: Indique si le téléversement comporte une erreurmoveTo(string $directory): bool
: Déplace le fichier téléversé dans le dossier de son choixUploadedFiles : Représente la liste des fichiers téléversés
Sources: https://github.com/pantaflex44/Syme/blob/v1/components/core/UploadedFiles.php
Schéma:
__construct()
: ConstructeurgetList(): array
: Retourne la liste des fichiers téléverséshasFile(string $elementName): bool
: Indique si un fichier est téléversé par le nom du champ de formulaire HTMLgetFile(string $elementName): UploadedFile|array|false
: Retourne le fichier téléversé par le nom du champ de formulaire HTMLcount(): int
: Retourne le nombre de fichiers téléversésSession : Gestionnaire de sessions paramètrable.
Sources: https://github.com/pantaflex44/Syme/blob/v1/components/extended/Session.php
Requiert:
- Composant: 'components\core\Route'
- Configuration: SESSION_USE_COOKIES (facultatif)
- Configuration: SESSION_USE_ONLY_COOKIES (facultatif)
- Configuration: SESSION_USE_STRICT_MODE (facultatif)
- Configuration: SESSION_COOKIE_HTTPONLY (facultatif)
- Configuration: SESSION_COOKIE_SECURE (facultatif)
- Configuration: SESSION_COOKIE_SAMESITE (facultatif)
- Configuration: SESSION_USE_TRANS_ID (facultatif)
- Configuration: SESSION_CACHE_LIMITER (facultatif)
- Configuration: SESSION_URL_REWRITER_TAGS (facultatif)
- Configuration: SESSION_LIFETIME (facultatif)
- Configuration: SESSION_COOKIE_PATH (facultatif)
Schéma:
__construct()
: Constructeurdestroy(): void
: Nettoie et supprime tout le contenu de la session en coursexists(string $name): bool
: Retourne si une clef existe par son nomget(string $name): mixed
: Retourne la valeur d'une clef par son nomset(string $name, mixed $value): void
: Défini la valeur d'une clefdelete(string $name): void
: Supprime une clef et sa valeur par son nomExemple:
```php
namespace middlewares {
use components\extended\Session;
class MyMiddleware {
public function __invoke(Response $response, Session $session): void {
if ($session->exists('myKey')) {
$value = $session->get('myKey');
$response->append(strval($value));
$session->delete('myKey');
}
}
}
}
```
MySQL : Gestionnaire de données MySQL utilisant PDO.
Sources: https://github.com/pantaflex44/Syme/blob/v1/components/extended/MySQL.php
Requiert:
- Composant: 'components\core\Route'
- Configuration: MYSQL_HOST (impératif)
- Configuration: MYSQL_PORT (impératif)
- Configuration: MYSQL_DATABASE (impératif)
- Configuration: MYSQL_USERNAME (impératif)
- Configuration: MYSQL_PASSWORD (impératif)
Schéma:
__construct()
: Constructeur__destruct()
: DestructeurgetInstance(): \PDO
: Retourne l'instance PDOloadSqlFile(string $sqlFile): void
: Charge le contenu d'un fichier SQLquote(mixed $value): string
: Assainie une valeurexecute(string $sql, ?array $args = null): int
: Execute une requètecount(string $sql, ?array $args = null): int
: Retourne le nombre d'enregistrements trouvésunique(string $sql, ?array $args = null): array|bool
: Retourne l'unique enregistrement trouvéfirst(string $sql, ?array $args = null): array|bool
: Retourne le premier enregistrement trouvéall(string $sql, ?array $args = null): array
: Retourne tous les enregistrements trouvésExemples:
```php
// MyMiddleware.php
namespace middlewares {
use components\extended\MySQL;
class MyMiddleware {
public static function __invoke(MySQL $sql): void {
$rows = $sql->all('SELECT * FROM users');
var_dump($rows);
}
}
}
```
TwigWrapper : Permet l'utilisation de Twig
via Syme. Requiert twig/twig:^3.0
via Composer.
Sources: https://github.com/pantaflex44/Syme/blob/v1/components/extended/TwigWrapper.php
Requiert:
- Composer: twig/twig:^3.0
- Composant: 'components\core\Response'
- Composant: 'components\core\Route'
Schéma:
__construct(Response $response)
: ConstructeurcreateResponse(string $templateName, array $data = [], bool $toCurrentResponse = true): Response
: Compile et charge le résultat dans une réponse HTTP::addFilter(string $name, callable $callback, array $options = []): void
: Ajoute un filtre utilisable dans les templates::addFunction(string $name, callable $callback, array $options = []): void
: Ajoute une fonction utilisable dans les templatesExemples:
```php
// MyMiddleware.php
namespace middlewares {
use components\extended\TwigWrapper;
class MyMiddleware {
public static function __added(): void {
TwigWrapper::addFilter('bold', function (string $value): string {
return "<b>$value</b>";
});
}
}
}
```
html
<!-- home.html -->
{% set foo = 'foo' %}
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>{{ title|upper }}</title>
</head>
<body>
{{ foo|bold|raw }}
</body>
</html>
php
// index.php
Route::get('home', '/', function (Response $response, TwigWrapper $twig): Response {
$twig->createResponse('home.html', [
'title' => "Syme"
]);
return $response;
});
Route::after('home', MyMiddleware::class);
CsrfMiddleware : Permet d'ajouter une protection contre les attaques CSRF aux formulaires HTML.
Sources: https://github.com/pantaflex44/Syme/blob/v1/middlewares/CsrfMiddleware.php
Requiert:
- Composant: 'components\core\Request'
- Composant: 'components\extended\Session'
- Composant: 'components\extended\TwigWrapper'
Principe:
Enregistre une fonction Twig
nommée csrf(string $prefix)
pour ajouter à un formulaire 2 champs cachés permettant de limiter les attaques de types CSRF.
Pour chaque route ayant ajoutée avant son exécution (Route::before) le middleware CsrfMiddleware::class
, une vérification de la présence des 2 champs nécessaires, ainsi
que la vérification des valeurs attendues, sont effectuées. En cas de manquement, une réponse 403 est renvoyée. En cas de mauvaises valeurs, une réponse 401 est renvoyée.