pantaflex44 / syme
Syme 是一个小型 PHP 框架,帮助实现 Web 应用程序。简单且快速,这个框架旨在加速开发,同时保持模块化和高效。Web 应用程序、REST API,Syme 是您项目的必备工具。
Requires
- php: >=8.2
- ext-fileinfo: *
- ext-libxml: *
- ext-simplexml: *
- ext-zlib: *
- phpmailer/phpmailer: ^6.9
- twig/twig: ^3.0
README
另一个 PHP 微型框架。
Syme 是一个帮助实现 Web 应用程序的 PHP 框架。简单且快速,这个框架旨在加速开发,同时保持模块化和高效。Web 应用程序、REST API,Syme 是您项目的必备工具。
安装
自动安装
$ composer create-project pantaflex44/syme
手动安装
下载项目
$ git clone https://github.com/pantaflex44/Syme.git syme
$ cd syme
安装依赖项:
$ composer install
编辑配置:
$ 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 ;-)"); });
文档(v1)
完整
(进行中...) https://pantaflex44.gitbook.io/documentation-de-syme/
快速
框架组件(/components/core)
-
Route : 代表路由引擎
来源: https://github.com/pantaflex44/Syme/blob/v1/components/core/Route.php
方案:
::extendWith(string $class): void
: 向路由系统添加组件,使其在所有路由、中间件或其他组件中可访问::isAsset(Request $request): string|false
: 指示 URL 是否对应一个可下载的文件(位于 '/public' 文件夹中的文件)::sendAsset(string $filepath): void
: 向访客发送与 URL 对应的文件::exists(string $routeName): bool
: 指示是否有一个路由通过其名称存在::match(string $routeName): array|false
: 通过名称返回路由的信息::isLinked(string $uri, array $methods = ['GET', 'POST', 'OPTIONS', 'PUT', 'PATCH', 'DELETE']): bool
: 指示路由是否正确地附加到一个路径和一种或多种 HTTP 方法::getUri(string $routeName, array $params = []): string|false
: 返回与路由关联的路径和指定属性::getPath(string $routeName, array $params = []): string|false
: 返回与路由关联的完整路径和指定属性::getUrl(string $routeName, array $params = []): string|false
: 返回与路由关联的完整 URL 和指定属性::toRequest(string $routeName, array $params = []): Request|false
: 将路由通过其名称转换为 HTTP 请求::redirect(string $routeName, array $params = [], int $status = 302): false
: 根据名称将访客重定向到路由::apply(Request $request): array
: 根据传入的参数应用路由的逻辑。返回修改后的请求和要发送的响应::sendResponse(Request $initialRequest, null|Response $response): void
: 根据 HTTP 请求发送响应的内容::any(string $name, string $uri, callable $callback): void
: 为所有 HTTP 方法记录路由::map(array $methods, string $name, string $uri, callable $callback): void
: 为指定的 HTTP 方法记录路由::get(string $name, string $uri, callable $callback): void
: 为 HTTP GET 方法记录路由::post(string $name, string $uri, callable $callback): void
: 为 HTTP POST 方法记录路由::put(string $name, string $uri, callable $callback): void
: 为 HTTP PUT 方法记录路由::patch(string $name, string $uri, callable $callback): void
: 注册用于HTTP PATCH方法的路由::delete(string $name, string $uri, callable $callback): void
: 注册用于HTTP DELETE方法的路由::before(?string $routeName, callable|string $middleware): void
: 注册在路由逻辑之前运行的中间件::after(?string $routeName, callable|string $middleware): void
: 注册在路由逻辑之后运行的中间件
-
Request : 表示当前的HTTP请求
来源: https://github.com/pantaflex44/Syme/blob/v1/components/core/Request.php
方案:
__construct(string $url = null)
: 构造函数::current(): Request
: 返回当前请求getPath(): string
: 返回URL的路径getUri(): string
: 返回与路径对应的URL部分getQueryString(): array
: 返回URL的属性列表getFragment(): string
: 返回URL的片段getScheme(): string
: 返回HTTP方案getHost(): string
: 返回主机getPort(): int
: 返回主机使用的端口号getDomain(): string
: 返回完整域名getMethod(): string
: 返回HTTP方法getAcceptedLanguage(): array
: 返回接受的语言列表getAcceptedEncoding(): array
: 返回接受的编码列表getAcceptedTypes(): array
: 返回接受的数据类型列表getUserAgent(): string
: 返回HTTP代理getRemoteAddress(): string
: 返回访问者的IP地址getRemotePort(): int
: 返回访问者使用的端口号getUrl(bool $full = false): string
: 返回相应的URLhasArgument(string $name): bool
: 指示URL是否包含属性getArgument(string $name): false|string
: 通过名称返回一个属性isXHRRequest(): bool
: 指示是否为AJAX请求hasHeader(string $header): bool
: 指示是否存在HTTP头getHeaders(): array
: 返回HTTP头列表getHeader(string $header): false|string
: 通过名称返回一个HTTP头getAuthorization(): string
: 返回授权令牌getContent(): mixed
: 返回请求的内容getContentType(): string
: 返回请求内容的类型getForm(): null|object
: 返回HTML表单的内容hasForm(): bool
: 指示请求是否包含HTML表单getFiles(): UploadedFiles
: 返回上传的文件列表getReferer(): bool|string
: 返回前一个页面的URL
-
Response : 表示要返回给访问者的HTTP响应
来源: https://github.com/pantaflex44/Syme/blob/v1/components/core/Response.php
方案:
__construct(string $body = '', string $contentType = 'text/html')
: 构造函数hasHeader(string $header): bool
: 指示是否已添加HTTP头removeHeader(string $headerKey): bool
: 删除HTTP头getHeaders(): array
: 返回HTTP头列表getHeader(string $header): false|string
: 返回一个HTTP头withHeader(string $header): Response
: 添加HTTP头withBearerAuthorization(string $bearer): Response
: 添加授权令牌withHeaders(array $headers): Response
: 添加HTTP头列表getStatus(): int
: 返回当前的HTTP状态码withStatus(int $status): Response
: 修改HTTP响应的状态码getContent(): string
: 返回HTTP响应的原始内容getGzipContent(): string
: 返回压缩的HTTP响应内容getContentType(): string
: 返回响应内容的MIME类型getParsed(): array
: 返回HTTP响应的分解内容。(XML,Json,multipart,form,data)getJson(bool $associative = true): mixed
: 返回Json格式的数据clear(): Response
: 删除响应内容write(string $content, string $contentType = 'text/html'): Response
: 修改HTTP响应内容prepend(string $content): Response
: 在HTTP响应前添加内容append(string $content): Response
: 在HTTP响应后添加内容writeObject(mixed $object): Response
: 将PHP对象转换为Json内容然后写入响应HTTPwriteJson(string $json): Response
: 将Json内容写入响应HTTP
-
数据 : 表示能够穿越所有逻辑(路由,中间件,组件)的个人信息容器
来源: https://github.com/pantaflex44/Syme/blob/v1/components/core/Data.php
方案:
__construct()
: 构造函数。count(): int
: 返回已注册数据数量clear(): void
: 删除所有数据all(): array
: 返回所有已注册数据exists(string $key): bool
: 通过键名指示数据是否存在get(string $key): mixed
: 根据键名返回数据值set(string $key, mixed $value): void
: 修改数据值delete(string $key): void
: 根据键名删除数据
-
UploadedFile : 表示返回给访问者的HTTP响应
来源: https://github.com/pantaflex44/Syme/blob/v1/components/core/UploadedFile.php
方案:
__construct(array $fileinfo)
: 构造函数getName(): string
: 返回文件名getType(): string
: 返回文件类型getSize(): int
: 返回文件大小getReadableSize(): string
: 返回文件大小(可读格式)getContentType(): false|string
: 返回文件内容的MIME类型getError(): int
: 返回错误号或UPLOAD_ERR_OK如果没有错误hasError(): bool
: 指示上传是否有错误moveTo(string $directory): bool
: 将上传的文件移动到指定的目录
-
UploadedFiles : 表示上传文件列表
来源: https://github.com/pantaflex44/Syme/blob/v1/components/core/UploadedFiles.php
方案:
__construct()
: 构造函数getList(): array
: 返回上传文件列表hasFile(string $elementName): bool
: 通过HTML表单字段的名称指示是否有文件上传getFile(string $elementName): UploadedFile|array|false
: 通过HTML表单字段的名称返回上传的文件count(): int
: 返回上传文件数量
可选的扩展
可用的组件 (/components/extended)
-
Session : 可定制的会话管理器。
来源: https://github.com/pantaflex44/Syme/blob/v1/components/extended/Session.php
要求:
- 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)
方案:
__construct()
: 构造函数destroy(): void
: 清除并删除当前会话的所有内容exists(string $name): bool
: 返回是否存在名为的键get(string $name): mixed
: 返回键的值set(string $name, mixed $value): void
: 定义键的值delete(string $name): void
: 删除键及其值
示例:
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 : 使用PDO的MySQL数据管理器。
来源: https://github.com/pantaflex44/Syme/blob/v1/components/extended/MySQL.php
要求:
- 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)
方案:
__construct()
: 构造函数__destruct()
: 析构函数getInstance(): \PDO
: 返回 PDO 实例loadSqlFile(string $sqlFile): void
: 加载 SQL 文件内容quote(mixed $value): string
: 清理一个值execute(string $sql, ?array $args = null): int
: 执行一个请求count(string $sql, ?array $args = null): int
: 返回找到的记录数unique(string $sql, ?array $args = null): array|bool
: 返回找到的唯一记录first(string $sql, ?array $args = null): array|bool
: 返回找到的第一个记录all(string $sql, ?array $args = null): array
: 返回找到的所有记录
示例:
// 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 : 通过 Syme 使用
Twig
。通过 Composer 需要twig/twig:^3.0
。来源: https://github.com/pantaflex44/Syme/blob/v1/components/extended/TwigWrapper.php
要求:
- Composer: twig/twig:^3.0 - Composant: 'components\core\Response' - Composant: 'components\core\Route'
方案:
__construct(Response $response)
: 构造函数createResponse(string $templateName, array $data = [], bool $toCurrentResponse = true): Response
: 编译并加载结果到 HTTP 响应中::addFilter(string $name, callable $callback, array $options = []): void
: 添加可在模板中使用的过滤器::addFunction(string $name, callable $callback, array $options = []): void
: 添加可在模板中使用的函数
示例:
// 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);
可用的中间件 (/middlewares)
-
CsrfMiddleware : 向 HTML 表单添加 CSRF 攻击防护。
来源: https://github.com/pantaflex44/Syme/blob/v1/middlewares/CsrfMiddleware.php
要求:
- Composant: 'components\core\Request' - Composant: 'components\extended\Session' - Composant: 'components\extended\TwigWrapper'
原理:
注册一个名为
csrf(string $prefix)
的Twig
函数,用于在表单中添加两个隐藏字段以限制 CSRF 攻击。对于在执行之前添加的每个路由(Route::before)中间件CsrfMiddleware::class
,将执行必要字段的检查以及预期值的验证。如果不符合要求,则返回 403 响应。如果值不正确,则返回 401 响应。
使用 Bootstrap
首先,通过 Composer 安装 Bootstrap
。
$ composer require twbs/bootstrap
然后,在项目根目录创建必要的 bootstrap.install
文件以部署 Bootstrap
。
<?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);
然后,修改 composer.json
文件。
... "scripts": { "post-update-cmd": [ "@php bootstrap.install" ] } ...
为了使用 Bootstrap
,您需要在未来的项目中包含它
<!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>
就这么简单 ;-)
现在您可以在未来的项目中使用 Bootstrap
。