panique/php-mvc

此软件包已被废弃,不再维护。作者建议使用panique/mini软件包代替。

一个极其简单的裸PHP应用程序

安装: 647

依赖: 0

推荐者: 0

安全: 0

星星: 1,335

关注者: 113

分支: 487

开放问题: 21

类型:项目

dev-develop 2022-09-17 18:36 UTC

This package is auto-updated.

Last update: 2022-09-17 18:36:06 UTC


README

MINI - A naked barebone PHP application

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中的Vagrantfilebootstrap.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

安装

  1. 编辑application/config/config.php中的数据库凭据。
  2. _install/文件夹中执行.sql语句(例如使用PHPMyAdmin)。
  3. 确保您在服务器/环境中已激活mod_rewrite。以下是一些指南:Ubuntu 14.04 LTSUbuntu 12.04 LTSWindows上的EasyPHPWindows/Mac OS上的AMPPSWindows上的XAMPPMac OS上的MAMP

MINI无需进一步配置即可运行。您也可以将其放入子文件夹中,它将无需任何其他配置即可运行。可能有用的提示:关于如何在安装LAMPP(Linux、Apache、MySQL、PHP、PHPMyAdmin)在Ubuntu 14.04 LTSUbuntu 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上买杯咖啡来支持项目。谢谢! :)

Buy Me A Coffee