phy/ phyneapple
一个轻量级的PHP5.4框架。你没有理由使用它,我只是无聊所以放出来。此外,它有助于快速推出小型到中型网站。
Requires
- php: >=5.4.0
- phy/markup: 1.0.2
- phy/variable: 1.0.2
This package is not auto-updated.
Last update: 2024-09-24 05:56:54 UTC
README
Phyneapple 是我为侧项目构建的一个小型框架,用作 Symfony2 的替代品。在大多数情况下,它并不与 Symfony2 或其他框架竞争,因为它甚至没有简单的路由模式...
安装
要安装,运行这个命令。然后把你所有的代码添加到 src 中。
composer create-project phy/phyneapple
路由
为了保持基本,路由通过将 /:controller/:method 映射到 \PHY\Controller{:controller}::{:method}_{:request_method}() 来工作。例如,执行 POST /user/login 会加载 \PHY\Controller\User 并尝试调用 login_post() 方法,如果不存在,则回退到 login_get(),然后 index_post(),最后 index_get()。这就是路由在表面上是如何工作的。
控制器
控制器和路由被合并在一起,除此之外,路由器可以通过 \PHY\View\Layout 访问页面的构建块,页面的请求 \PHY\Request,并返回一个 \PHY\Response。
视图
视图受到了 Magento 的块的影响。然而,Magento 使用 XML,而且非常繁琐。这确实有很好的理由,因为它是高度可定制的,一旦你熟悉了它,就非常棒。尽管如此,对于小型项目来说,不需要 XML 和更简单的结构。因此,视图被分解为块,并使用 JSON 配置文件组合在一起。
一切从 design/default/www/config/default.json 开始,它有一个主要的 "layout" 类,所有其他块都是 "layout" 或其子类的子项。配置可以覆盖 design/default/www/config/default.json 中的任何块,并且使用相同的路由方法加载这些配置文件(如果存在),我们的上一个 /user/login 会查找 design/default/www/config/user/login.json,然后 design/default/www/config/user/login.json,除非你在操作方法内部覆盖了配置。
现在,关于块本身,它们只是 .phtml 文件,这些文件将基本变量传递给它们。它们还可以访问 $this,这与 \PHY\View\AView 和扩展该视图的类型相对应。
以下是 .phtml 文件的快速示例。
/* * in \PHY\Controller\Index::index_get() */ $this->getLayout()->getBlock('message', [ 'someVariable' => 'banana!' ]); /* * in design/default/www/block/ */ I passed variable "someVariable": <?=$someVariable?> Here's a url builder: <a href="<?=$this->url('user/login')?>">Login</a>
最后关于视图。你也可以为视图块使用自定义类,而不是使用通用的 \PHY\View\Block。这些类在 JSON 配置文件中进行配置,并且自定义类只需要实现 \PHY\View\IBlock。
模型
模型是为了快速创建新表并添加内容而设计的,无需在数据库端管理一切。模型本身的数据结构是其静态受保护值 $source,可以通过 Model::getSource() 获取。有了这个,DataMapper 将读取 $source 并创建与任何已设置数据库兼容的映射。我个人正在编写 MySQL 和 MongoDB 的连接,但可以编写自己的映射器并将其注入。
AJAX 注意事项
框架本身非常关注 AJAX 请求。所有模型都有一个有用的 toArray(),用于轻松构建模型路径以及针对像 Manager::{save, delete}(Model) 这样的操作的 AJAX 请求友好的响应。例如,在 Manager::save(Model) 中,你会得到一个类似于下面的 $response 数组
- 成功的插入:['status' => 200, 'response' => $insert_id]
- 成功的更新:['status' => 204]
- 失败:['status' => 500, 'response' => '错误信息']
- 访问失败:权限被拒绝:['状态' => 403, '响应' => '没有权限...']
有了响应,有一个辅助函数可以检查响应是否成功,\PHY\Response::ok($response),它对于2xx状态码返回true。
安全
Phyneapple 使用一个非常基本的 ACL 模型,可以检查用户或其组是否被授予或拒绝访问网站的任何方面。无论是查看页面还是编辑特定的模型,它们都很容易进入页面。快速示例
namespace \PHY\Controller class Check extends \PHY\Controller\AController { /** * This matches GET /check */ public function index_get() { $app = $this->getApp(); $user = $app->getUser(); $authorize = $app->get('model/authorize')->loadByRequest('controller/check'); if (!$authorize->exists()) { $authorize->request = 'controller/admin'; $authorize->allow = 'admin super-admin'; $authorize->deny = 'all'; $app->get('database')->getManager()->save($authorize); } $authorize->setUser($user); if (!$authorize->isAllowed()) { $this->redirect('edgage'); } } }
该示例将检查登录用户是否有 'admin' 或 'super-admin' 组,如果没有,则会因为拒绝所有请求而被重定向。
那个例子并不太好,因为页面加载时已经存在对 'controller/:controller/:method/:request_method', 'controller/:controller/:method', 和 'controller/:controller' 的检查。尽管如果没有找到请求则不会执行任何操作,而在示例中,它会创建授权请求以进行即时检查和之后的每次检查(这是在不手动编写新 ACL 表的情况下设置默认 ACL 的好方法)。
另一个需要了解的主要安全区域是 Phyneapple 努力阻止 XSRF 攻击,并且密码默认使用 bcrypt 加密,通过 PHPass 实现。
注册自动魔法
大多数都消失了,被组件取代了。但这些组件仍然“神奇”...
读取配置
配置也使用 $app->get('config/:configFile'); 其中 :configFile 与一个 JSON 文件匹配。您还可以将配置文件添加到与 get 字符串中任何额外的 '/' 匹配的嵌套文件夹结构中。但是,这里还有更多细节,比如说你做了
$config = $app->get('config/funny/jokes');
配置组件将首先查找 config/funny/jokes.json 并将其作为关联数组返回。如果找不到该文件,它将尝试找到 config/funny.json 并读取该文件。当读取该文件时,它将尝试匹配 {"jokes":{}}。否则,将抛出异常。
关于
这个项目的最初灵感来源于我在 Lafango 工作时。在那里工作期间,事情开始变得非常混乱,因为有几位开发者,我们都在重写相同的基本底层功能。过了一段时间,我厌倦了我们的 JS 文件超过了 2MB,以及我们创建的每个新页面或需要维护的页面都没有从文件到文件的一致性,甚至首页 HTML 也不匹配。
这是在 2000 年代中期,当时 Symfony2 正在推出,但当时的我是个傻瓜,对框架并不完全熟悉,并且不想与大家争论是否要内置的心态,结果我花了大约一个月的时间编写了这个框架的原始版本。我选择了 PHY_ 作为命名空间(那时是 PHP 5.2,还没有实际的命名空间),当时它做了一切需要做的事情,因为创建页面的速度非常快,而且我们都是开发者,所以我们可以通过容器类(不包括在新版本中)使用 HTML 元素。
这很好,因为它涵盖了大约 95% 的我们的 HTML 和 JavaScript 需求(包括通过添加类="ajax"并将 data-* 属性用于指定在发送响应前后 AJAX 应如何操作,将任何链接/表单转换为 AJAX 调用)。因此,我们的全局 JS 现在只有 100kb,页面生成速度快,我们的页面现在开始看起来像是一个连续的网站。另一个小细节... 这两个月的项目还取代了我们四人之间的许多旧编码风格,并完全淘汰了 mysql_*,以及新的模型处理基本加载/保存模型时的 SQL 注入(有人仍然可以编写可注入 SQL 的代码,但那时我已经是一个守卫,一直在等待...)。
要求
- PHP 5.4+
- PHY\Markup
- PHY\Variable
- [可选] PHY容器
提交错误和功能请求
请将错误发送给我,通过GitHub
作者
John Mullanaphy - john@jo.mu - http://jo.mu/ 暂时就这些...
许可证
Phyneapple采用开源软件许可(OSL 3.0)- 详细信息请参阅LICENSE文件
致谢
Lafango及其团队为我提供了一个发展个人技能和构建项目早期原型的地方。虽然当前项目只是从中汲取灵感,并且所有内容都被重写,但我试图保留某些与之相似的东西。
待办事项
- 目前正在处理控制器/布局/请求/响应交互
- 正在处理模型,特别是DataMappers。
- 集成MongoDB
- 测试,测试,测试!
- 尽可能地减少全局状态,只留下核心全局。