panique / php-mvc
Requires
- php: >=5.3.0
This package is auto-updated.
Last update: 2022-09-17 18:36:06 UTC
README
MINI
MINI是一个非常简单且易于理解的PHP应用程序骨架,简化到极致。MINI不是一个专业框架,它不包含真实框架所拥有的所有功能。如果您只想展示一些页面,进行一些数据库调用和一点AJAX,而不需要阅读高度复杂的专业框架的大量文档,那么MINI可能非常适用于您。MINI易于安装,几乎在所有地方都能运行,并且不会使事情比必要更加复杂。
要深入了解MINI,请参阅这篇博客文章:MINI,一个极其简单的裸PHP应用程序。
功能
- 极其简单,易于理解
- 结构简单但清晰
- 生成“美观”的清洁URL
- 演示CRUD操作:轻松创建、读取、更新和删除数据库条目
- 演示AJAX调用
- 尽量遵循PSR 1/2编码指南
- 使用PDO进行任何数据库请求,附带一个额外的PDO调试工具来模拟SQL语句
- 有注释的代码
- 只使用原生PHP代码,因此人们不必学习框架
MINI的分支
TINY
MINI有一个更小的兄弟,名为TINY。它与MINI类似,但几乎在所有环境中都可以不使用mod_rewrite运行。不适用于实时网站,但非常适合快速原型设计。
MINI2
MINI还有一个更大的兄弟,名为MINI2。它甚至更简单,是使用Slim构建的,具有SASS编译、Twig等出色功能。
MINI3
MINI3是MINI的继任者,使用原始MINI1原生应用程序结构(没有底层Slim),但具有适当的PSR-4自动加载、多个模型类和真实命名空间。
要求
- PHP 5.3.0+(首次发布时),现在它与当前稳定的版本PHP 5.6和7.1、7.2、7.3和7.4兼容。最新的PHP 8.0尚未测试,但应该也能正常工作。
- MySQL
- mod_rewrite已启用(以下有教程,但还有一个TINY,这是MINI的无mod_rewrite版本)
安装(在Vagrant中,100%自动)
如果您使用Vagrant进行开发,则可以一键安装MINI(或者在命令行中执行一个命令)[Vagrant文档]。MINI附带一个示例Vagrant-file(定义您的Vagrant虚拟机),以及一个示例bootstrap.sh脚本,该脚本自动安装Apache、PHP、MySQL、PHPMyAdmin、git和Composer,在MySQL和PHPMyadmin中设置所选密码,甚至修改应用程序代码,下载Composer依赖项,激活mod_rewrite并编辑Apache设置,从GitHub下载代码并运行示例SQL语句(用于示例数据)。这是100%自动的,您将在5分钟内完成安装,并在Ubuntu 14.04 LTS Vagrant虚拟机中运行MINI2。
为此,请将_vagrant中的Vagrantfile
和bootstrap.sh
放入一个文件夹中(不要放入其他文件)。执行vagrant box add ubuntu/focal64
将Ubuntu 20.04 LTS 64位添加到Vagrant(除非您已经安装了它),然后执行vagrant up
以运行虚拟机。安装完成后,您可以直接在192.168.33.44
上使用完全安装的示例应用程序(您可以在Vagrantfile中更改此设置)。由于这只是一个快速演示环境,MySQL root密码和PHPMyAdmin root密码均设置为12345678
,项目安装在/var/www/html/myproject
中。您当然可以在bootstrap.sh
中更改此设置。使用vagrant halt
关闭虚拟机。
Ubuntu 14.04 LTS(30秒内)自动安装
只需下载一个文件并执行它,即可通过安装Apache、MySQL、PHP和PHPMyAdmin、mod_rewrite、Composer、所有必要的设置,甚至配置文件中的密码来安装MINI,整个安装过程将100%自动运行。在本文中找到教程:在Ubuntu 14.04 LTS中30秒内安装MINI
安装
- 编辑
application/config/config.php
中的数据库凭据。 - 在
_install/
文件夹中执行.sql语句(例如使用PHPMyAdmin)。 - 确保您在服务器/环境中已激活mod_rewrite。以下是一些指南:Ubuntu 14.04 LTS、Ubuntu 12.04 LTS、Windows上的EasyPHP、Windows/Mac OS上的AMPPS、Windows上的XAMPP、Mac OS上的MAMP
MINI无需进一步配置即可运行。您也可以将其放入子文件夹中,它将无需任何其他配置即可运行。可能有用的提示:关于如何在安装LAMPP(Linux、Apache、MySQL、PHP、PHPMyAdmin)在Ubuntu 14.04 LTS和Ubuntu 12.04 LTS上
服务器配置
nginx
server { server_name default_server _; # Listen to any servername listen [::]:80; listen 80; root /var/www/html/myproject/public; location / { index index.php; try_files /$uri /$uri/ /index.php?url=$uri; } location ~ \.(php)$ { fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
有关nginx设置的更深入讨论,请参阅此处。
安全性
脚本使用了mod_rewrite并阻止了所有对/public文件夹外部的访问。您的.git文件夹/文件、操作系统临时文件、应用文件夹以及其他所有内容都无法访问(当正确设置时)。数据库请求使用PDO,因此无需担心SQL注入(除非您使用极旧的MySQL版本)。
附加功能
MINI附带了一个定制的PDO调试工具(代码在application/libs/helper.php中),尝试模拟您的PDO-SQL语句。它极其易于使用。
$sql = "SELECT id, artist, track, link FROM song WHERE id = :song_id LIMIT 1"; $query = $this->db->prepare($sql); $parameters = array(':song_id' => $song_id); echo Helper::debugPDO($sql, $parameters); $query->execute($parameters);
为什么将"Error"类重命名为"Problem"?
该项目在PHP5时代多次编写,但随着PHP7的发布,不再可能将类命名为"Error",因为PHP自身现在有一个内置的Error类。重命名是最简单的解决方案,与“ErrorController”等其他选项相比,这些选项会带来新的问题,如大写文件名等(这可能在某些设置中无法正常工作)。
许可证
此项目采用MIT许可证。这意味着您可以免费在私人或商业项目中使用和修改它。
我的博客
顺便说一下,我在Dev Metal上也有博客。
快速入门
一般结构
应用程序的URL路径直接映射到application/controllers中的控制器(=文件)及其方法。
example.com/home/exampleOne
将执行application/controllers/home.php中的exampleOne()方法所指示的操作。
example.com/home
将执行application/controllers/home.php中的index()方法所指示的操作。
example.com
将执行application/controllers/home.php中的index()方法所指示的操作(默认回退)。
example.com/songs
将执行application/controllers/songs.php中的index()方法所指示的操作。
example.com/songs/editsong/17
将执行application/controllers/songs.php中的editsong()方法所指示的操作,并将17
作为参数传递给它。
不言而喻,对吧?
显示视图
让我们看看位于application/controllers/home.php的home控制器中的exampleOne()方法:这个方法只是简单地显示头部、尾部和example_one.php页面(在views/home/中)。故意让它尽可能简单和原生。
public function exampleOne() { // load view require APP . 'views/_templates/header.php'; require APP . 'views/home/example_one.php'; require APP . 'views/_templates/footer.php'; }
数据处理
让我们看看位于application/controllers/songs.php的songs控制器中的index()方法:与exampleOne类似,但这里我们还请求数据。同样,一切都非常简化和简单:$this->model->getAllSongs()简单地调用application/model/model.php中的getAllSongs()方法。
public function index() { // getting all songs and amount of songs $songs = $this->model->getAllSongs(); $amount_of_songs = $this->model->getAmountOfSongs(); // load view. within the view files we can echo out $songs and $amount_of_songs easily require APP . 'views/_templates/header.php'; require APP . 'views/songs/index.php'; require APP . 'views/_templates/footer.php'; }
为了极端的简单性,所有数据处理方法都位于application/model/model.php中。这当然不是真正的专业,但这是最简单的实现。看看model.php中的getAllSongs()是什么样的:纯而超级简单的PDO。
public function getAllSongs() { $sql = "SELECT id, artist, track, link FROM song"; $query = $this->db->prepare($sql); $query->execute(); return $query->fetchAll(); }
然后,结果(在这里是$songs),可以轻松地直接在视图文件中使用(在这个简化的例子中是application/views/songs/index.php)。
<tbody> <?php foreach ($songs as $song) { ?> <tr> <td><?php if (isset($song->artist)) echo htmlspecialchars($song->artist, ENT_QUOTES, 'UTF-8'); ?></td> <td><?php if (isset($song->track)) echo htmlspecialchars($song->track, ENT_QUOTES, 'UTF-8'); ?></td> </tr> <?php } ?> </tbody>
历史
MINI 是 php-mvc 的继承者。由于 php-mvc 没有提供真正的 MVC 结构(并且许多人对此表示不满——这完全正确!)因此,我重命名并重建了该项目。
亲爱的喷子、水军和一切糟糕的人们...
... MINI 只是我为日常工作创建的一个简单的辅助工具,因为它比真正的框架更容易设置和处理。对于日常代理工作、快速原型设计和前端驱动型项目来说,这完全没问题,能完成任务,根本没有讨论为什么它“比 Laravel 糟糕”的理由,为什么它不遵循几个 MVC 原则,或者为什么没有个人无偿支持,没有俄语翻译等类似奇怪的事情。对开源项目(及其作者)的骚扰已经达到了疯狂的程度。
我免费、自愿地在业余时间写了这篇文章,并将其上传到 GitHub 以供分享。它是完全免费的,可用于私人商业用途。如果你不喜欢它,不要使用它。如果你看到问题,请写一个工单(如果你真的很酷:我非常感谢任何提交!)。但不要攻击、不要抱怨、不要仇恨。只有坏人才这样做。
贡献
请将提交放入开发分支(其中包含开发版本),而不是 master 分支(其中包含测试和稳定版本)。
变更日志
2002 年 12 月
- [panique] 更新了 Vagrant 安装程序,使其能够与 PHP 7.4 和 Ubuntu 20.04 一起运行
2016 年 8 月
- [codebicycle/panique] 将错误类重命名为 Problem 以使其与 PHP7 兼容 #209
- [ynohtna92/panique] URL 协议现在是协议无关的 #208
2015 年 2 月
- [jeroenseegers] nginx 设置配置
2014 年 12 月
- [panique] CSS 修复
- [panique] 将控制器/视图重命名为单数
- [panique] 在 PDO 创建时添加了 charset(提高了安全性)
2014 年 11 月
- [panique] 为 Vagrant 添加了自动安装脚本
- [panique] 基本文档
- [panique] PDO-debugger 现在是一个静态辅助方法,而不是全局函数
- [panique] 文件夹重命名
- [reg4in] JS AJAX 调用现在即使在子文件夹中使用脚本也能正常运行
- [panique] 删除了所有“模型”,现在使用一个模型文件
- [panique] 完整项目重命名,重新品牌化
2014 年 10 月
- [tarcnux/panique] PDO 调试
- [panique] 演示 AJAX 调用
- [panique] 更好的输出转义
- [panique] 将 /libs 重命名为 /core
- [tarcnux] 基本的 CRUD(创建/读取/更新/删除)示例现在有了 U(更新)
- [panique] URL 现在是配置免费的,应用程序检测 URL 和子文件夹
- [elysdir] htaccess 现在有了一些好的解释注释
- [bst27] 对于不存在的控制器/方法,提供了回退
- [panique] 回退现在将显示错误页面
- [digitaltoast] 修复了 URL 分割以使 php-mvc 在 nginx 上无缝运行
- [AD7six] 安全改进:将 index.php 移动到 /public,将所有请求路由到 /public
2014 年 9 月
- [panique] 添加了对支持论坛的链接
- [panique] 添加了对 Facebook 页面的链接
2014 年 8 月
- [panique] 修改了 README 中的多个内容,更改了捐赠按钮
2014 年 6 月
- [digitaltoast] 从标题中删除了 X-UA-Compatible 元标签(因为现在不再需要了)
- [digitaltoast] 从 jQuery URL 中删除了协议(现代加载外部文件的方式,使其不依赖于协议更改)
- [digitaltoast] 将 jQuery 从 2.1 降级到 1.11 以避免与 IE7/8 合作时出现的问题(jQuery 2 已取消对 IE7/8 的支持)
- [panique] 将 jQuery 加载移动到页脚(以避免页面渲染阻塞)
2014 年 4 月
- 更新jQuery链接至2.1
- 可以支持超过3个参数(参数需要具体化)
- 处理参数的更简洁方式
- 较小的清理和改进
- Apache 2.4安装信息
2014年1月
- 修复了当控制器名为"index"且存在基础index.php时(它们会冲突)的.htaccess问题
支持项目
通过在DigitalOcean租用服务器或直接在BuyMeACoffee.com上买杯咖啡来支持项目。谢谢! :)