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.
$ composer create-project pantaflex44/syme
Téléchargement du projet
$ git clone https://github.com/pantaflex44/Syme.git syme
$ cd syme
Installation des dépendances:
$ composer install
Edition des configurations:
$ sudo nano config.php
<?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 ;-)");
});
(en cours...) https://pantaflex44.gitbook.io/documentation-de-syme/
-
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 route
-
Request : 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édente
-
Response : 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 HTTP
-
Data : 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 clef
-
UploadedFile : 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 choix
-
UploadedFiles : 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és
-
Session : 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 nom
Exemple:
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és
Exemples:
// 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. Requierttwig/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 templates
Exemples:
// 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>"; }); } } }
<!-- 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>
// 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éecsrf(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 middlewareCsrfMiddleware::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.
En premier lieu, il faut installer Bootstrap
via Composer:
$ composer require twbs/bootstrap
Ensuite, il faut créer le fichier bootstrap.install
nécessaire au déploiement de Bootstrap
à la racine du projet:
<?php
require_once(__DIR__ . '/functions.php');
$bootstrapVendorDir = __DIR__ . '/vendor/twbs/bootstrap/dist';
$bootstrapDir = __DIR__ . '/public/bootstrap';
if (is_dir($bootstrapDir)) removeDir($bootstrapDir);
mkdir($bootstrapDir, 0755);
copyDir($bootstrapVendorDir, $bootstrapDir);
Puis, modifier le fichier composer.json
:
...
"scripts": {
"post-update-cmd": [
"@php bootstrap.install"
]
}
...
Pour utiliser Bootstrap
, vous devez l'inclure dans vos future projet:
<!DOCTYPE html>
<html>
<head>
<title>Mon projet</title>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<script src="./bootstrap/js/bootstrap.min.js"></script>
<link href="./bootstrap/css/bootstrap.min.css" rel="stylesheet" />
</head>
<body>
Je suis le projet.
</body>
</html>
C'est aussi simple que ça ;-)
Vous pouvez désormais utiliser Bootstrap
dans vos futurs projets.