tombrown86/workframe

此包的最新版本(dev-master)没有可用的许可信息。

一个可工作的框架

安装: 508

依赖: 0

建议者: 0

安全性: 0

星标: 2

关注者: 3

分支: 2

开放问题: 0

类型:框架

dev-master 2024-07-23 07:07 UTC

This package is auto-updated.

Last update: 2024-09-23 07:26:42 UTC


README

  1. 简介
  2. 动机
  3. 快速入门
  4. 功能
  5. 想法/未来
  6. 不足之处

... 更多即将到来

简介

这是一个超轻量级的PHP7 - PHP8.2兼容框架的初次尝试,旨在实现MVC风格框架的基本标准需求,并附带一些希望有用的意外功能。

动机

在我的经验中,框架非常适合处理基本任务。然而,当它们过于复杂时,工作起来可能会变得令人厌倦。

然后它们被升级、重写、彻底改变,这会给每个人带来痛苦!

我的建议是避免过度依赖框架来实现应用逻辑的细节。

任何更复杂的东西都可能具有框架不试图提供的特定要求。

这是一个小型灵活的框架,基本上足够简单,可以升级到未来的PHP版本,同时足够强大,可以提供我们通常需要的核心功能。

快速入门

执行以下操作

  1. 从github项目(https://github.com/tombrown86/WorkFrame/)拉取,或者在您的composer.json中包含它
  2. 了解包含的内容(3个目录)
      www目录 - 这是您的Web根目录(通常称为htdocs,public_html等)
      ExampleApp目录 - 该目录包含自定义应用程序代码,将其存储在您的Web根目录之外
      WorkFrame目录 - 这是框架,将其存储在您的Web根目录之外

  3. 以下是一个典型的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>

  4. 更新应用初始化脚本中的定义(如./ExampleApp/init.php)中的定义,希望它们是自我解释的。
  5. 也许可以查看功能

基本功能

您的应用程序代码基本上遵循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\Service来编写自己的
这些包含大部分业务逻辑
它们负责(可能是全部)对域对象的操作,并处理数据持久化(通过数据映射器)
它们通常会返回结果或与输出相关的数据(表示数据),但不会期望返回HTML。(相反,您的请求处理器将提取这些结果信息并将它们映射到视图层。)

域对象
您可以通过扩展\WorkFrame\Domain_object来编写自己的
它们可以代表您喜欢的任何类型的实体,包括网页表单和/或用于持久化的数据(有时与数据库表一一对应)
它们可以可选地展示场景,您作为程序员定义这些场景以描述对象的不同的角色/或规则
可以为每个场景定义属性列表,以指定哪些属性可以被“批量分配”(例如,来自_post或数据映射器)
有一些便利的方法,如from_assocto_assoc,您可以使用这些方法帮助处理对象数据
您可以使用\WorkFrame\Magic_get_set_trait来自动实现调用不存在的方法$this->get_privatevarname()的get/set行为,以及通过$this->varname在外部引用私有属性(请合理使用!)

数据映射器
您可以通过扩展\WorkFrame\Data_mapper来编写自己的
...或者更有可能的是它的子类之一,例如like \WorkFrame\Database_data_mapper
这是模型层的持久化端
它们应该接受并返回域对象(单个或作为列表,在适当的情况下)
这是您应该放置数据库CRUD查询的地方
这些不应该包含(几乎没有任何!)逻辑...保持简单。它们最复杂的特性可能是对数据选择应用条件
您可能希望使用ORM库来实现这一点,或者可能只是让它实现一个数据库访问辅助库(ActiveRecord、数据表网关等)

加载/实例共享

任何扩展/实现任何核心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 作为第二个参数来访问未清理的原始值。

想法 / 未来

以下是我想按时间顺序工作的内容

  1. 基于用户类型的认证规则/配置
  2. 一个内置的数据库访问器系统(用于在您的Data_mapper中使用)
  3. 简单的RESTful API支持
  4. 一个cookie库
  5. .. 还有什么基本的功能缺失?请 告诉我

不足之处

  1. 目前,内置的数据库访问仅限于mysqli
  2. 一些前端功能依赖于JavaScript的可用性
  3. 在Windows上无法工作!(基本上由于目录分隔符!)
  4. 不支持国际化
  5. 没有内置的性能基准测试
  6. 没有测试套件。实际上,该框架本身也没有单元测试..
    可能可以在没有任何问题的前提下为您的应用程序组件编写单元测试。通过WorkFrame Loader($this->LOAD)加载的任何内容可能存在潜在问题,因为它使用了一些魔法(而不是依赖注入)来加载组件。我认为可以通过覆盖加载器为您的自定义测试加载器(您可以通过set_loader函数注入,该函数应在所有组件上都可用)来解决这个问题。
  7. 无缓存
  8. ...可能会持续一段时间

此框架提供基本功能,可以轻松扩展以实现任何所需的功能 :)