Syme 是一个小型 PHP 框架,帮助实现 Web 应用程序。简单且快速,这个框架旨在加速开发,同时保持模块化和高效。Web 应用程序、REST API,Syme 是您项目的必备工具。

安装: 7

依赖项: 0

建议者: 0

安全性: 0

星标: 0

关注者: 1

分支: 0

公开问题: 0

类型:项目

v1.1.1 2024-01-01 00:00 UTC

This package is auto-updated.

Last update: 2024-09-06 08:03:28 UTC


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 : 返回相应的URL
    • hasArgument(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内容然后写入响应HTTP
    • writeJson(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




Syme