zaek / framy
PHP 框架
2.0.0-alpha.2
2021-09-24 10:34 UTC
Requires
- php: >=7.1.0
Requires (Dev)
- phpunit/phpunit: ^7
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
选项将路由添加到此类脚本。