页面,超简短的PHP MVC框架
请参阅此项目的子项目:https://github.com/h3rb/papi和https://github.com/h3rb/pagemin
在预先配置的Apache2服务域http://indiedev.space在此处单击此处以进行演示:https://asciinema.org/a/dbaycbfxgbyh4jqmbj1vnxumrh4jqmbj1vnxumr
以上演示显示了如何:
版权(C)2015-2017,H。ElwoodGilliland III保留所有权利。
如果满足以下条件:
Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
该软件由版权所有者和贡献者“按原样”提供,任何明示或暗示的保证,包括但不限于对适销性和特定目的适合性的隐含保证。在任何情况下,版权持有人或贡献者均不得对任何直接,间接,偶然,特殊,特殊,示例性或结果损害均承担任何责任(包括但不限于替代商品或服务的采购,损失,数据或利润损失,数据或利润;还是造成的,无论是在合同中造成的,或者在任何责任中造成的责任,或者是否有任何责任,或者在任何责任中,是否有任何责任,或者是否有任何责任,或者是否有责任,是否有责任,是否有责任。告知可能造成这种损害的可能性。
页面框架非常简单,但文档很少。只需读取index.php,然后从那里挖掘,以查看登录方式。注册页面尚未制作,但登录页面可用于默认管理员帐户。
从这一点开始,您可以做任何事情。页面非常适合开发最小的基于PHP-> PDO的Web应用程序。您需要安装的页面就是将其放入文件夹中,然后仔细检查其.htaccess和一个路径设置,并且您是金色的。多页部署可以共享相同的身份验证数据库。毕竟为什么要使用一些Gargantuan框架?您需要的一切都在这里开始为团队建立协作工具,或者像博客,自定义社交媒体网站等公共网站服务一样!
请注意,您真正需要的所有内容都出现在“核心”文件夹中,其他所有内容都只是在该核心之上实现。所有核心提供的都是页面对象,PDO包装器和一些真正有用的功能,其他所有内容都在主文件夹或其他子文件夹中实现。如果您了解 /core /中的所有内容,则可以删除其他所有内容(也许是缓存文件夹除外)。为了恢复最低限度,只需用曲奇切刀将“核心”切出即可。现在有一个可用的版本称为Pagemin http://github.com/h3rb/pagemin
Page是为PHP5编写的,但在PHP7中工作正常,因为它使用了最小的PHP语言功能。您要注意的一件事是使用ampersand(&),因为某些切碎和演示页可能会以&$ p的形式使用它,但您可以简单地用$ p替换它。该项目始于2008年,但没有名称“页面”。它在2014年被恢复,重新集中并重命名,当时它成为3D打印初创公司内部Intranet系统的“种子”。我使用它为Lostastronaut.com制作工具,并用作我想要大量自定义后端功能的其他灯网站的基本“琼脂”。它也已用于WAMP。
用途:
到目前为止,我已经制造了几个功能齐全且可用的公司系统。我制作了一个安全的公司Intranet,一个基于数据库的在线共享内容管理系统和设计部门的编辑工具,一个包含数据处理的集成产品指标网站以及一些实用程序应用程序。一旦您知道基础知识,就很容易部署然后开始开发。仅在灯泡上可靠地工作。 WAMP实施可能会进行一些修改,但没有Gaurantees。已部署到AWS实例,如果您删除包装包装的样品功能,则可以减少到最小的足迹。
您可以将页面贴在文件夹中,然后将其连接到数据库。如果要创建多个功能集,则可以重复该过程。
提供基础知识:
哲学:
典型的“页面”控制器视图php文件的示例:
include " core/Page.php " ;
$ p = new Page ;
$ p -> title = " My wickid page " ;
if ( Session:: is_logged_in () ) // Checks to see if user is logged in or not...
$ p -> HTML ( " Hey I'm logged in!!!! YAY! " );
else $ p -> HTML ( " not logged in.. :( " );
$ p -> Render (); // Puts page to screen.典型的“来自脚本的自动化PHP”的示例:PHP文件:
include " core/automation.php " ; // Does everything Page does except create the Page class.. no Auth either.
//... load models and do stuff to db ...要设置完整的颗粒记录(存储在缓存/日志/last-log.txt中):
global $ plog_level ; $ plog_level = 1 ; // must appear before Page.php is included
include ' core/Page.php ' ;如何制作新模型的示例:
如何使用模型将数据库表附加到数据库表上:
global $ database ;
$ my_model = new tableName ( $ database );请参阅Core/ PDO/中的文件,以了解所有内容的工作原理。
安装和使用jQuery
页面支持任何版本的jQuery,并且具有一些基本功能,可让您通过编程方式部署jQuery。与其他框架或代码组织方法不同,您需要将jQuery插件分解到CSS/和JS/文件夹中,将CSS和图像放在CSS/以及JavaScript文件中,以便在JS/中将其放置在JS/中,以便您可以使用$ page-> js()$ page()$ page-> css()来加载它们。使用$ page-> jq()将线路贴在文档Ready()区域中,并使用$ page-> js()添加到页面的全局JavaScript中。
include ' core/Page.php ' ;
$ p = new Page ();
$ p -> JS ( ' somejsfile.js ' );
$ p -> JS ( ' http://cdn.url.com ' );
$ p -> JQuery (); // Loads Jquery automatically
$ p -> JQ ( '
$("#docisready").on("click" ... );
' );
$ p -> JS ( ' var myGlobal=1; setInterval(function(){alert( ' foo');}, 1000 );');另外,您需要意识到,如果您加载自己的自定义jQuery,要么在选择位置将加载序列修改为您选择的版本,要么通过另一种方法加载它并告知页面已经安装了它,以免安装它两次,通过执行以下操作:
$page->jq_loaded=TRUE;
内置的“实时编辑”常见数据窗口小部件
(页面核心类中的方法,但非核心功能的一部分)
页面已用于编辑数据库数据 - 作为公司内部网的数据库前端 - 并让您和其他人即时编辑数据。您甚至可以使用内置功能(例如自动锁定和行锁定)来保护数据免受编辑狙击。行锁定支持是在shreds/autolocks.php中
所有这些小部件都与AJAX绑定。*。php文件,并有几个小缺点。它们被写入工作,但以网络为代价(它不会缓存或延迟传出消息)。另外,如果您在更改某些内容后迅速离开页面,请求可能无法完成。因此,如果您要离开页面,请至少等待1-2秒,具体取决于您当前的网络延迟。
另外,您需要使用ACL来保护数据库用户不允许编辑不允许的内容。您可以使用粒度的表格或现场级别使用ACL,以编辑式tablename或Edit-tableName-fieldName的形式使用。 ACL类在shreds/acl.php中定义,这些ACL“标签”已在某些AJAX中检查。*。php文件。它们必须存储在用户的个人资料上。特殊的ACLS“ Admin”和“ SU”让您绕过此安全性!在那里小心。
您必须使用jQuery及其所需的支持插件,并且必须使用$ page-> bind_loadplugins()激活这些功能;
激活后,您可以使用$ page-> bind*选项来修改主要的全局$数据库。您应该在core/pag.php中阅读它们
$ p = new Page ();
$ p -> Bind_LoadPlugins (); // Automatically loads jQuery and the required jQuery plugins.
$ p -> BindString (...);看法/
包含您要明确称为“视图”的任何东西 - 不包括自动包含,请调用:include“ view/myview.php”
自动化/
包含您不介意在Web文件夹中使用的任何内容(否则,使用一个称为/离线的文件夹)通常以bash和/或php脚本的形式使用core/automation.php输入点。
缓存/
包含日志文件(来自PLOG函数)和您可能使用的任何插件或其他要缓存的任何插件的缓存。
确保这是可以写的,所有的子文件夹...
核/
包含页面框架的核心。 core/page.php是您一直要包含的一个。 core/automation.php适用于需要访问模型的离线脚本。 core/utility.php是我保留所有有用的辅助功能的地方。
核心/PDO/
包含与PDO相关的功能。您需要扩展的是模型。您应该阅读它们以了解选项和界面。
CSS/
包含您的Main.css和其他CSS文件,用于插件或网站的特殊区域。您可以像这样包含这些文件:
$ p -> CSS ( ' main.css ' ); // Includes css/main.css
$ p -> CSS ( ' myplugin/plugin.css ' ); // Includes css/myplugin/plugin.css. 发动机/
该文件夹包含任何更“引擎”的内容,并且文件自动包含,因此除了.htaccess以外,它们应该以.php结尾,并且是有效的代码(无语法错误)。
表格/
包含用于数据形式类的专用文件,通常称为form_name.txt,用于将经典的Web表单直接映射到数据库中的字段以进行数据输入和编辑。
例子/
包含一些例子和笔记。
全球的/
该文件夹包含“类似全局”的任何内容,并且文件自动包含,因此除了.htaccess以外,它们应以.php结尾,并且是有效的代码(无语法错误)。通常,您只是在调用全球指令并设置默认设置,尽管您可以以任何方式使其“更聪明”。
html/
包含可以加载到页面 - > html的html摘要,示例$ p-> html('myfile.html')自动在html/
JS/
将您的JavaScript文件放在此处。当您$p->JS('somefile.js')时,它会在这里查看,并且还可以识别CDN URL。
phtml/
您想要评估的任何内容都应在此处进行混合模式HTML。并不是真正的推荐功能,但是如果您想做这种事情,我会添加它。
图式/
您用来创建网站的任何数据库模式都可以在此处存储,但这是不安全的。如果愿意,请删除此文件夹。
设置/
包含配置文件。该文件夹中的所有文件均自动加载,并且应以.php结尾并包含有效的PHP代码。
ui/
包含在core/ui.php中使用UI base类的UI摘要文件 - 我最终以shreds/而改成我的,但是如果需要,您可以使用它。该文件夹中的所有文件均自动加载,并且应以.php结尾并包含有效的PHP代码。
模型/
包含配置文件。该文件夹中的所有文件均自动加载,并且应以.php结尾并包含有效的PHP代码。
切碎/
包含自动加载的模块,片段,功能等。我用它将jQuery插件(或其他JavaScript作品)包装在PHP中,以进行预处理,当我不想以另一种方式处理它时。例如,我以这种方式实现了Muuri.js相关的功能,因此您可以在端点而不是在HTML/文件夹包含页面片段或随附的JS文件中使用它。
模块/
您要手动包含的文件。类似于蛋糕中的供应商/文件夹。 include 'module/whatever.php'
我/
你的图像!这些都在.html文件中引用。或者您可以用i/参考它们
文档/
您想在您的网站或其他人上提供的文档。如果这里有.sql,请在使用它后将其删除。
您将需要A2ENMOD到期,包括重写MCRYPT以及其他一些可能的重写。
为了方便起见,我在此处包含了一个Guidelet,可以引导您完成Ubuntu/php/apache2设置。这在AWS EC2实例上效果很好。之后,可能需要重新启动机器。
如果您使用FPM安装PHP7.1,在Ubuntu 16.04 LTS上,您将在上述任何一个之前完成此操作:
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install -y unzip apache2 php7.1 php7.1-cli php7.1-common libapache2-mod-php7.1 php7.1-mysql php7.1-fpm php7.1-curl php7.1-gd php7.1-bz2 php7.1-mcrypt php7.1-json php7.1-tidy php7.1-imagick php7.1-mbstring php-redis php-memcached
sudo a2enmod expires include rewrite mcrypt
sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php7.1-fpm
sudo service apache2 restart
默认管理用户名:管理员的管理密码:单个空间''(登录后更改)
Fatal error: Call to a member function Select() on a non-object in /var/www/core/PDO/model.php on line 104
这意味着您的数据库无法正确设置。它是不存在的,或者根本不可用。
示例站点骨骼页面附带的,包括内置auth,是用MySQL的严格版本编写的,而不是默认安装的版本。如果是这种情况,您将在写入数据库时会看到错误。
要关闭其中一些限制,请以root的形式进入服务器并创建此文件: /etc/mysql/conf.d/disable_strict_mode.cnf
打开文件并输入这两行:
[mysqld]
sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
通过重新启动MySQL来完成操作。
sudo service mysql restart
仅使用核心功能完全从头开始启动项目
性能和记录
您绝对不应在生产服务器上允许$ plog_level = 1个设置。
您不应将模式保留在公共网络文件夹中,这包括预先包装的Page_authdb.sql,出于明显的原因。
拥有数据的所有权
请注意,您必须审查所有与数据库相关的请求,以获得所有权和可见性。最终,一旦我有时间实施核心模块量,页面将为您处理与数据所有权有关的一些,但是要执行必须从数据库中检索和存储的数据的必要硬化和验证。知道这一点,许多ajax.?.php您应该实施自己的数据库所有权系统(团体和个人,公共和私人权限)。
隐藏私人源代码
页面依赖于Apache2的.htaccess文件功能(或VHOST或HTTPD或端口中的常规配置特异性或您使用的.conf)来设置每个Web文件夹及其子文件夹的特殊权限和参数。这样做是为了允许页面插入其他项目,或者将其放置在同一Web服务器上的多个位置。开箱即用,可以将页面放在文件夹中,几乎所有文件都将隐藏在主文件夹中。即使您创建一个允许它的.htaccess文件,也无法公开访问您的新子文件夹。
如果您使用的是NGINX或Apache以外的其他任何内容,则可以跳过接下来的两段并按照说明进行操作。
但是,有些人似乎认为这是一个坏主意。只要您小心地将哪种代码添加到页面上,就应该能够制作一个安全的网站。过去,这是通过在每个包含文件的顶部测试资源是否由远程浏览器加载或包含在文件中(例如codeigniter,Zend)来完成。页面没有这样做,因为整个文件夹都无法访问,而且如果它们确实设法运行了一个“类”文件,那么什么都不会发生任何意义。无论如何,有些人似乎认为黑客可以以某种方式愚弄apache2忽略.htaccess文件。页面及其上传功能不允许这样做。另外,页面不需要eval()任何事物,因为它不使用相同的方法来实现MVC与其他框架(例如,codeigniter,zend)。
如果您认为将代码放入暴露但不公开的文件夹中的理由是一个坏主意,那么对于您来说,可以通过将其移动到离线文件夹中,而仅将PHP Public Public Pointpoint(您希望人们浏览的文件浏览到)在您的Web服务器文件夹中使其更加安全。我个人没有看到好处,除了它使您不可能弄乱而没有所需的.htaccess文件。这样做的一种副作用是,如果您在页面上构建了多个站点,并且想要维护一个核心,则可以使用这种相同的方法来实现。
要保持页面范围内和离线网络文件夹:
您可能需要调整实际核心/page.php的前几行才能反映此路径差异,在此您可以看到Include_all和Include_once与Core相关的inception_once,但是它应该很好,因为此时相对于随附的core/Page.php文件。
如果您手动包含了任何模块,则必须添加/path/to/page/folder/
有一天,我将进一步实施Pown,这将促进数据库播种和模式迁移功能,以使生活更轻松。 You will be able to create an entire description of a database in a specialized text file (it will look like class declarations in C++ / Java), and convert that to a JSON tree (which you could also read from a file) and then feed that to a Pown class constructor, and attempt to deploy the database, or migrate it using $orm->Deploy() (where migration will add missing table columns, and modify existing columns detecting the old type first)
想法
随着我越来越多地使用页面,我发现它令人上瘾。页面在nodejs的世界中具有等效:expressjs。无论如何,这些旧手仍然更快地键入PHP。我在Lostastronaut.com上使用PHP进行内部工具,因为它与我写了Windows Game Engine的C ++相对相似。我还在其他一些可以使用它的网站上工作。仍然没有什么比能够使用PHP自定义JavaScript渲染自定义的JavaScript更强大了,即使这是一场语法噩梦。