zaek/framy

PHP 框架

维护者

详细信息

github.com/za-ek/framy

源代码

问题

安装次数: 52

依赖: 0

建议者: 0

安全: 0

星级: 1

关注者: 2

分支: 0

开放问题: 0

类型:项目

2.0.0-alpha.2 2021-09-24 10:34 UTC

This package is auto-updated.

Last update: 2024-09-25 15:02:22 UTC


README

简单的 PHP 框架,可用于创建前端开发中的临时端点。

开始

为您脚本创建入口点,并定义配置,如下一部分所述

<?php
require_once __DIR__ . '/vendor/autoload.php';

try {
    $app = new \Zaek\Framy\App([
        'homeDir' => __DIR__,
        'routes' => [
            'GET /' => '/web/Index.php',
        ]
    ]);
    $app->handle();
    $app->response()->flush();

} catch (\Exception $e) {
    echo $e->getMessage();
}

路由

您可以通过调用 setRouter 方法覆盖默认路由器

\Zaek\Framy\App::setRouter(\Zaek\Framy\Router)

路由器语法

[
  '[METHOD[:RESPONSE_TYPE] ]URI' => TARGET
] 
方法

方法必须是以下之一:GET|HEAD|POST|PUT|DELETE|CONNECT|OPTIONS|TRACE|CLI
省略方法定义意味着 URI 可由任何已知方法访问

响应类型

您可以指定响应类型

html|json
URI

URI 可能是静态的...

/api/testCall

...或者动态的

/api/<dynamicGroup>

其中动态分组由以下表达式定义

variable:regex
variable - any latin symbol
regex - regular expression rule

Example:
/api/user<userId:[\d]+> 
(converts by framework to #/api/user(?<userId>[\d]+)#)
目标

目标可以是回调函数、包含函数名的数组、包含类名和方法名的数组(对于非对象类名,方法必须是静态的),或者实现 \Zaek\Framy\Action 接口的对象

示例
[
  '/api/staticCall' => '/Web/Index.php',
  'GET:json|CLI /api/runCron' => '/Cli/Job.php',
  '/api/users/<userId:[\d]+>' => '/Web/User.php', // access to $userId from $this->request()->getQuery('userId')
  '/api/functionCall' => function(Controller $app) : Action {},
  '/api/methodCall' => ['MyController', 'MethodAction'], // Вызывается непосредственно для получения Action
  '/api/anotherFunction' => ['FunctionName'], // Вызывается непосредственно для получения Action
  '/api/actionCall' => new Zaek\Framy\Action\Action,
  '/api/absolutePathFileCall' => '@/var/www/index.html',
]

REST

REST 路由创建以下链接

new Router(['REST /projects' => '/api/projects/']);

[
    'GET:json /projects' => '/api/projects/List.php',
    'POST:json /projects' => '/api/projects/Add.php',
    'GET:json /projects/<project_id:[\d]+>' => '/api/projects/Item.php',
    'PATCH:json /projects/<project_id:[\d]+>' => '/api/projects/Update.php',
    'DELETE:json /projects/<project_id:[\d]+>' => '/api/projects/Delete.php',    
]

路由键用作路由键,例如,对于 /projects 是 project_id,对于 /users 是 user_id 等。

前缀

您可以使用 RoutePrefix 类对通过前缀分组的 URI 进行分组

new Router(new RoutePrefix('/api', [
    '/users' => '/users.php',
    '/settings' => '/v.php'
]));

// Is the same as

new Router([
    '/api/users' => '/users.php',
    '/api/settings' => '/settings.php'
]);

RoutePrefix 被处理为数组,因此您可以在其他前缀内分组前缀,并结合 RoutePrefix 与标准路由

new Router([
    ...new RoutePrefix('/api', [
        '/settings' => '/settings.php',
        ...new RoutePrefix('/users', [
            'GET /' => '/users_list.php',
            ...new RoutePrefix('/auth', [
                'POST /login' => '/login.php',
                'POST /logout' => '/logout.php',
            ])
        ])
    ])),
    ...new RoutePrefix('/catalog', ['/' => '/catalog.php']),
    '/' => '/index.php'
]);

版本化的示例

$routes = new RoutePrefix('/users', ['GET /' => '/users.php']);

$v1 = new RoutePrefix('/v1', ['GET /version' => '/v1.php', ...$routes]);
$v2 = new RoutePrefix('/v2', ['GET /version' => '/v2.php', ...$routes]);
$v3 = new RoutePrefix('/v3', ['GET /version' => '/v3.php', ...$routes, ...['GET /users/' => '/users_change.php']]);

$router = new Router(new RoutePrefix('/api', [
    ...$v1,
    ...$v2,
    ...$v3,
]));

// /api/v1/users => /users.php
// /api/v2/users => /users.php
// /api/v3/users => /users_changed.php

代理

使用回调代理组中的所有响应

$proxyCallback = function($route) {
    return new CbFunction(function(App $app) use($route) {
        if($app->user()->getId() < 1) {
            throw new Exception('No auth', 401);
        }

        return new File($route);
    });
};

/// The request /api/user/data and /api/personal/data will be proxy by proxyCallback
///     and will throw an exception for non-authorized users

new Router(new RoutePrefix('/api', [
    '/data' => '/data.php',
    // It could be the proxy inside a group as a group inside the proxy 
    ... new RoutePrefix('/user', new RouteProxy($proxyCallback, [
        'GET /data' => '/user_data.php',
    ])),
    ... new RouteProxy($proxyCallback, new RoutePrefix('/personal', [
        'GET /data' => '/user_personal.php',
    ]))
]))

配置

默认设置

Framy 提供的默认功能将放置

具有以下属性的用户
id = 10012019
login = 'framy'
email = 'framy@za-ek.ru'
在 JSON 响应中状态=ok

每个操作的 JSON 响应都将完整地包含 {status:'ok'} 标志

路由到 API

内置的注册操作位于 ./bin 目录中。使用 useDefault 选项将路由添加到此类脚本。

内置 API