tombrown86 / workframe
一个可工作的框架
This package is auto-updated.
Last update: 2024-09-23 07:26:42 UTC
README
... 更多即将到来
简介 ¶
这是一个超轻量级的PHP7 - PHP8.2兼容框架的初次尝试,旨在实现MVC风格框架的基本标准需求,并附带一些希望有用的意外功能。
动机 ¶
在我的经验中,框架非常适合处理基本任务。然而,当它们过于复杂时,工作起来可能会变得令人厌倦。
然后它们被升级、重写、彻底改变,这会给每个人带来痛苦!
我的建议是避免过度依赖框架来实现应用逻辑的细节。
任何更复杂的东西都可能具有框架不试图提供的特定要求。
这是一个小型灵活的框架,基本上足够简单,可以升级到未来的PHP版本,同时足够强大,可以提供我们通常需要的核心功能。
快速入门 ¶
执行以下操作
- 从github项目(https://github.com/tombrown86/WorkFrame/)拉取,或者在您的composer.json中包含它
- 了解包含的内容(3个目录)
- www目录 - 这是您的Web根目录(通常称为htdocs,public_html等)
- ExampleApp目录 - 该目录包含自定义应用程序代码,将其存储在您的Web根目录之外
- WorkFrame目录 - 这是框架,将其存储在您的Web根目录之外
- 以下是一个典型的vhost配置(适用于Apache),Directory部分显示了关键的ReWrite位(将所有请求路由到框架入口脚本)。
<VirtualHost *:80> ServerName local.workframe DirectoryIndex index.php index.html DocumentRoot /var/www/site/www ErrorLog /var/log/apache2/workframe/local.workframe.error.log
<Directory /var/www/site/www/> Require all granted RewriteEngine on RewriteBase /var/www/site/www # Or If WorkFrame is running in a subdir: # RewriteBase /var/www/site/www/subdir RewriteCond $1 !^(index.php|public/|robots.txt) RewriteRule ^(.*)$ /index.php?$1 [L] </Directory>
</VirtualHost>
- 更新应用初始化脚本中的定义(如./ExampleApp/init.php)中的定义,希望它们是自我解释的。
- 也许可以查看功能
基本功能 ¶
您的应用程序代码基本上遵循HMVC框架的模式,但并不需要以此方式使用。您的应用程序可能至少包含以下内容
标准构造
- 请求处理器(类似于控制器)
- 您可以通过扩展 \WorkFrame\Request_handler 来编写自己的
- 它们仅存在于作为HTTP请求的着陆点
- 根据URL段映射请求到这些处理器,最后一个为动作名称(方法名称)(例如:/directoryname/subdirectoryname/request_handler_name/method_name?get_vars_here)
- 如果没有提供,则默认使用index作为方法名称和请求处理器名称的值
- 注意,您可以覆盖pre_action_hook和post_action_hook,您可能可以猜测它们何时被调用
- 您可以通过抛出 \WorkFrame\Exceptions\Request_handler_rewrite_exception 来执行基于异常的重定向
- 模型层(见下文)
- 处理“业务逻辑”,包括数据操作和数据存储
- 请求处理器(通常)设置这些并调用保留数据以传递到视图层的程序
- 视图层
- 模板 - 页面模板
- 部分 - 要包含的片段
具有高度复杂性的应用程序可能从拥有自己的类结构中受益,该结构不遵循此模式。
模型层
这些包括3类事物
加载/实例共享
任何扩展/实现任何核心WorkFrame组件(大多数事物)都可以轻松标记并共享实例。
例如
- 使用$this->SERVICE('Service_name', 'service_label')来实例化一个服务,然后在任何地方使用$this->service_label引用它
- 您也可以使用$this->DOMAIN_OBJECT(...)和$this->DATA_MAPPER(...)分别与此进行
(或者只需省略第二个参数以获取单个实例)
要卸载现有的实例,请调用
$this->UNLOAD($component_type, $component_name)
Renderer_trait
您所有的请求处理器都将自动展示此特性。
虽然不是固定不变的,但您很可能会从具有此特性的类中调用模板和部分
使用此特性的东西可以利用其add_scripts()和add_stylesheets()方法方便地将JS/样式表标签附加到模板中
(注意:有一个内置的工具可以通过将true作为第二个参数传递给基于add_script(...)的add_scripts()方法来最小化客户端代码)
可以使用add_view_var/add_view_vars()方法将视图数据传递到模板和部分。
默认情况下,每个请求处理器和动作都将有一个相应的部分文件路径($YOUR_APP/html/partials/request_handler_dir_path/request_handler_name/action_name(小写)
还有一个模板目录:$YOUR_APP/html/templates/。您可以通过将模板子路径传递给$this->render(...)来自动将部分渲染到模板中
The Processor_trait
处理器可以附加到字段上,可以操作和/或验证数据。该框架自带一些,但您也可以添加自己的。如果处理器被编码为这样的方式,它们有一个客户端(使用JavaScript)工作的机制。
处理器(/验证规则)也可以附加到字段的一个子集以及实体上的一个场景子集(如果特性能在Domain_object(或实际上任何具有场景属性的实体)上使用)。
这些可以用于在行内验证/纠正表单字段 - 即时(使用客户端、服务器端或两者)。
\WorkFrame\Html\Form_tools
这些可以帮助您编写HTML。它们可以实例化并返回HTML,用于常见事物(如表单字段和验证错误)。
如果需要额外的功能,也可以扩展(如大多数东西一样)。
\WorkFrame\Libraries\Session
提供了一个简单的会话库。您可以使用以下静态方法。
- write($key, $value)
- read($key, $child=FALSE)
- delete($key)
- dump() [打印当前会话数据数组]
- regenerate_session_id()
- destroy()
- ... 如果需要更多,可能已经包含了您需要的功能 - 尝试看看。
应用程序类 (\App\App),钩子等
您的应用程序可能需要在它的路由中有一个这样的类。它必须有与您的应用程序命名空间相同的类名(和文件名),并且必须扩展 \WorkFrame\WorkFrame。
这个类中可以定义一些标准钩子(如预路由、预动作等)。您也可以使用这个类来执行应用范围内的任何事情(如存储当前用户等)。
日志记录
有一个非常简单的日志机制,基本上是一个单个函数: log_message($level, $message, $debug_silent=FALSE)。它将写入您的App中的日志目录。
如果您喜欢,也可以使用您自己的自定义错误级别,但有一些预定义的常量您可以使用:APP_LOG_LEVEL_WARNING,APP_LOG_LEVEL_ERROR 和 APP_LOG_LEVEL_INFO。除非将 $debug_silent 作为 TRUE 传递,否则在调试模式下,任何不是 APP_LOG_LEVEL_INFO 的错误都会打印在响应中。
Conf
这是一个简单的机制,用于定义和检索Conf目录中的配置。
简单调用 conf($conf_filename) 来调用并返回具有该 $conf_filename 的配置数据。
如果您想使用现有的mysql数据库支持,您必须在 db.php 中定义(1个或多个)数据库连接(请参阅示例文件)。
安全性
已添加一个基本的Security库。到目前为止,它只能执行简单的XSS过滤。如果您启用此过滤(请参阅conf中的security.php)。如果启用,您将需要在请求处理程序中使用 $this->GET(...), $this->POST(...) 等,来访问清理后的get/post请求变量。以 _GET 为例,调用 $this->GET() 将返回整个清理后的 _GET 数组;传入一个 $key 作为第一个参数将返回具有该键的清理项。您仍然可以通过传递 TRUE 作为第二个参数来访问未清理的原始值。
想法 / 未来 ¶
以下是我想按时间顺序工作的内容
- 基于用户类型的认证规则/配置
- 一个内置的数据库访问器系统(用于在您的Data_mapper中使用)
- 简单的RESTful API支持
- 一个cookie库
- .. 还有什么基本的功能缺失?请 告诉我
不足之处 ¶
- 目前,内置的数据库访问仅限于mysqli
- 一些前端功能依赖于JavaScript的可用性
- 在Windows上无法工作!(基本上由于目录分隔符!)
- 不支持国际化
- 没有内置的性能基准测试
- 没有测试套件。实际上,该框架本身也没有单元测试..
可能可以在没有任何问题的前提下为您的应用程序组件编写单元测试。通过WorkFrame Loader($this->LOAD)加载的任何内容可能存在潜在问题,因为它使用了一些魔法(而不是依赖注入)来加载组件。我认为可以通过覆盖加载器为您的自定义测试加载器(您可以通过set_loader函数注入,该函数应在所有组件上都可用)来解决这个问题。 - 无缓存
- ...可能会持续一段时间
此框架提供基本功能,可以轻松扩展以实现任何所需的功能 :)