aaron-lin / app-php
一个用于构建 Web 应用的 PHP 框架。
1.0.0
2024-08-13 02:05 UTC
Requires
- php: >=7.4
- firebase/php-jwt: ^6.4
- nyholm/psr7: ^1.5
- nyholm/psr7-server: ^1.1
- psr/http-server-handler: ^1.0
Requires (Dev)
- phpunit/phpunit: ^9.6
README
安装
$ composer require aaron-lin/app-php
使用
支持的 PHP 应用程序类型有三种:RESTful 应用、CRUD 应用 和 单页应用。
RESTful 应用
要构建 RESTful 应用,扩展 Lin\AppPhp\Server\RestfulApp
类,并覆盖 OnGet|OnPost|OnPut|OnDelete|OnPatch
方法。
详细示例,请参阅 example/restful_app.php。
CRUD 应用
要构建仅接受 POST
方法并从资源路径接收命令的 CRUD 应用,扩展 Lin\AppPhp\Server\CrudApp
类,并覆盖 OnCreate|OnRead|OnUpdate|OnDelete
方法。
详细示例,请参阅 example/crud_app.html 和 example/crud_app.select.php。
单页应用
要构建单页应用,实例化 Lin\AppPhp\Server\SinglePageApp
类,并将网页 HTML 代码作为字符串传递给构造函数,然后调用 AddPostAction
方法添加处理 POST 请求的动作。
详细示例,请参阅 example/single_page_example.html 和 example/single_page_app.php。
授权
要实现授权
- 创建一个实现了
Lin\AppPhp\Authorization\AuthorizationInterface
接口的类,并实现Authorize($Token, $RequestScopes = [])
方法 - 将实例传递给
Lin\AppPhp\Server\App
类的WithAuthorization
方法 - 调用
Lin\AppPhp\Server\App
类的AuthorizeRequest
方法来检查授权
require __DIR__ . '/vendor/autoload.php'; use Lin\AppPhp\Server\App; use Lin\AppPhp\Server\RestfulApp; use Lin\AppPhp\Authorization\AuthorizationInterface; // 實作 AuthorizationInterface class Authorization implements AuthorizationInterface { public function Authorize($Token, $RequestScopes = []): bool { $AvailableScopes = ['user.read', 'user.create']; $AccessScopes = array_intersect($RequestScopes, $AvailableScopes); if (count($RequestScopes) > 0 && count($AccessScopes) === 0) { return false; } return true; } } class User extends RestfulApp { public function OnGet() { // 檢查權限: 呼叫 App::AuthorizeRequest if (!$this->AuthorizeRequest(['user.read'])) { return App::UnauthorizedResponse(); } // 回應 return App::NoContentResponse(); } } // 處理請求 $App = new User(); $App->WithAuthorization(new Authorization())->HandleRequest(App::CreateServerRequest()); $App->SendResponse(); exit;
对于使用 JWT 的 OAuth2 授权,使用 Lin\AppPhp\Authorization\OAuthAuthorization
类
- 创建一个扩展
Lin\AppPhp\Authorization\OAuthAuthorization
类的类,并实现IsTokenRevoked($JTI)
方法 - 将实例传递给
Lin\AppPhp\Server\App
类的WithAuthorization
方法 - 调用
Lin\AppPhp\Server\App
类的AuthorizeRequest
方法来检查授权
require __DIR__ . '/vendor/autoload.php'; use Lin\AppPhp\Server\App; use Lin\AppPhp\Server\RestfulApp; use Lin\AppPhp\Authorization\AuthorizationInterface; // 實作 AuthorizationInterface class Authorization extends OAuthAuthorization { public function IsTokenRevoked($JTI) { // 檢查 token 是否被撤銷 return false; } } class User extends RestfulApp { public function OnGet() { // 檢查權限: 呼叫 App::AuthorizeRequest if (!$this->AuthorizeRequest(['user.read'])) { return App::UnauthorizedResponse(); } // 回應 return App::NoContentResponse(); } } // 處理請求 $PublicKeyPath = '/var/www/pubkeys/oauth_pub'; $App = new User(); $App->WithAuthorization(new Authorization($PublicKeyPath))->HandleRequest(App::CreateServerRequest()); $App->SendResponse(); exit;