kurzejapatryk/noobmvc

简单且小巧的 MVC 框架,适合初学者 PHP 开发者。

dev-master 2024-08-02 02:22 UTC

This package is auto-updated.

Last update: 2024-10-02 02:41:35 UTC


README

NoobMVC 是一个简单易用的 MVC 框架,专为初学者 PHP 开发者设计。其主要目标是实现最大程度的简洁。该项目于 2017 年作为一个学习练习而创建,我决定将其分享出来。它允许您快速创建简单应用,并熟悉面向对象编程和 MVC 概念。我不建议将其用于专业用途,如果您这样做,请自行承担风险!

目录

技术

  • PHP: >= 7.4
  • SMARTY: ^4.3.2

入门

安装

要安装框架,您需要在终端中执行以下命令

composer create-project kurzejapatryk/noobmvc:dev-master you-project-name

或者克隆仓库并安装依赖项

git clone git@github.com:kurzejapatryk/NoobMVC.git
composer install

Docker 服务器设置

您可以使用传统的服务器,如 Apache、Nginx 或 XAMPP 来运行应用。或者,您可以使用命令创建 Docker 容器。这是推荐的选项,尤其是对于初学者来说。

您需要安装 Docker!如果您没有安装,可以从此网站下载:[https://dockerd.com.cn/](https://dockerd.com.cn/)。同时,请确保 Docker 在 Windows 上运行。

docker compose up --build -d --watch

添加 --watch 标志将自动同步代码和 Docker 容器之间的更改。

此设置将自动创建一个在端口 80 上运行项目的容器,一个在端口 3306 上运行 MySQL 数据库的容器,以及一个在端口 8080 上可访问的 PHPMyAdmin 容器。

要创建数据库中必要的表,您可以通过 Docker 使用 NoobMVC CLI 工具。此过程可以在应用中添加新表时执行。当前实现不会删除或修改现有表,因此如果您需要删除它们,应使用 PHPMyAdmin。

docker exec apache-noobMVC php noob.php -i

要创建所有表并设置具有指定密码的管理员用户,请使用以下命令

docker exec apache-noobMVC php noob.php -ipassword123

将 password123 替换为您为管理员用户设置的密码。密码长度必须至少为 8 个字符。

管理现有表

如果您需要删除现有表,可以使用 PHPMyAdmin:通过 https://:8080/ 访问 PHPMyAdmin。使用以下凭据登录

  • 用户名:db_user
  • 密码:password123

从那里,您可以在运行 CLI 工具之前手动删除任何现有表。

CLI 工具计划增强以实现完全自动化,包括删除或修改现有表的能力。在这些改进实施之前,建议通过 PHPMyAdmin 进行手动管理现有表。

配置文件

应用设置位于 Configs 目录中。每个文件负责应用的各个方面。

  1. Database.php - 数据库连接设置。
  2. Debuging.php - 应用调试设置。
  3. Init.php - 应用的默认控制器设置。
  4. Locale.php - 语言、日期和时间设置。
  5. Mailer.php - 发送电子邮件的邮件服务器设置。
  6. System.php - 应用地址、版本和访问路径设置。

控制器

控制器包含在调用特定页面时执行的方法定义。它以简单的方式工作,在运行 /index.php 脚本后,默认控制器(文件 /Configs/Init.php)中的 start() 方法被调用,或者通过 GET 方法传递的 page 参数指定了控制器(例如,通过地址栏,例如 yourwebsite.com/?page=controlleryourwebsite.com/Controller)。要调用除 start() 方法之外的方法,请使用名为 action 的第二个 GET 参数(例如 yourwebsite.com/?page=Controller&action=selectedMethodyourwebsite.com/Controller/method)。重要的是类名应与文件名相同,并添加 .class.php,并在文件开头定义命名空间 Controllersnamespace Controllers;)。

模型

为了方便与数据库一起工作,框架使用模型。模型表示数据库表的结构。模型类名必须与文件名相同,并在 Models 命名空间中(namespace Models;)。idtable 字段非常重要。id 字段应该是公开的(public $id;),table 字段应该是私有的静态字段(private static $table = 'table_name'),而 schema 字段应该是受保护的静态字段,并包含表模式。作为模型的类应扩展 Core\Models 类。模型类可以包含可选的额外方法。例如,表模型:

namespace Models;

use Core\Model;

class User extends Model{

    private static $table = 'users';

    protected static $schema = array(
        'id' => "INT PRIMARY KEY AUTO_INCREMENT",
        'created_time' => 'TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP',
        'user_name' => "VARCHAR(100) NOT NULL UNIQUE",
        'name' => "VARCHAR(100)",
        'surname' => "VARCHAR(100)",
        'password' => "VARCHAR(255) NOT NULL",
        'email' => "VARCHAR(255) UNIQUE",
        'role' => "INT",
        'notes' => "TEXT",
    );

    public $id;
    public $user_name;
    public $name;
    public $surname;
    public $password;
    public $email;

    public function setPassword(string $password) : void
    {
        $this->password = md5($password.SALT);
    }
}

构造函数和 .get()

要从数据库中检索用户,只需创建一个新对象,并将用户的 id 作为参数传递给构造函数方法。

// ...
use Models\User;
// ...
$User = new User($id);
// ...

或者我们可以使用 .get() 方法。

// ...
use Models\User;
// ...
$User = new User();
$User->id = $id;
$User->get();
// ...

.save()

新记录

要创建新记录,我们使用 id 字段为 NULL0(默认情况下,新对象有 ID = NULL)的对象的 .save() 方法。

// ...
use Models\User;
// ...
$User = new User();
$User->name = "John";
$User->surname = "Doe";
$User->setPassword("password123");
$User->email = 'john.doe@example.com';
$User->save();
// ...

更新记录

更新记录类似,但将更新指定 id 的记录。

// ...
use Models\User;
// ...
$User = new User($id);
$User->name = "Peter";
$User->save();
// ...

这样,只有现有记录中的用户姓名已被更改。

.delete()

要删除记录,我们使用 .delete() 方法。

// ...
use Models\User;
// ...
$User = new User($id);
$User->delete();
// ...

.find()

还有一个方法可以搜索单个记录。这是 .find() 方法。它使用包含值的字段。然而,如果多个记录满足指定的标准,只会返回一个!

// ...
use Models\User;
// ...
$User = new User();
$User->name = 'John';
$User->surname = "Doe";
$User->find();
// ...

自定义方法

我们可以用我们自己的方法扩展模型。

namespace Models;
use Core\Model;
use Core\Db;

class User extends Model{

    public $id;
    public $table = 'users';

    public $user_name;
    public $name;
    public $surname;
    public $password;
    public $email;


    public function getByUserName(string $user_name) : User
    {
        $table = $this->table;
        if($user_name){
            $SQL = "SELECT * FROM ".$table." WHERE user_name = ? LIMIT 1";
            $params = Db::select($SQL, array($user_name), true);
            foreach($params as $key => $val){
                $this->{$key} = $val;
            }
        }
        return $this;
    }
}

::getAll()

模型本身有一个额外的静态方法 getAll($where = array(), $order = "id ASC"),它返回数据库中的所有对象列表或仅通过传递一个标准数组作为参数返回所选对象。

// ...
use Models\User;
// ...
$all_Users = User::getAll();
$KowalskiUsers = User::getAll(array('surname' => "Kowalski"));
$KowalskiUsers = User::getAll(array('surname' => "Kowalski", "name DESC"));
// ...

响应类和模板系统

脚本使用 SMARTY 库来编译模板。模板文件位于 Views 目录中。库缓存位于 tmp/ 目录中,其路径在 Configs/System.php 文件中设置。

有关使用 SMARTY 库的更多信息,请参阅:

  1. Wiki
  2. 官方文档

Core\Response 类允许快速显示适当的模板或以 JSON 格式返回数据。要将数据分配给视图,请使用 .assign($name, $value) 方法。分配的数据将可用于模板或以 JSON 格式返回。显示模板是通过调用 .displayPage('template_name.tpl') 方法完成的。

namespace Controllers;

use Core\Response;

class Home{

    // Method to display a page
    public static function start(){
        $resp = new Response();
        $resp->assign('lang', LANG);
        $resp->displayPage('Hello.tpl');
    }
}

数组处理

我实现了一个非常简单的数组处理。Core\Tables 类包含三个方法:GET()POST()COOKIE()SESSION()。要使用它们,只需提供 GET、POST 或 COOKIES 数组中的字段名作为参数。在方法内部,有一个检查指定字段是否存在于给定数组中的检查。如果没有,则返回值 false 而不是错误消息。

调试

在Debuging.php配置文件中,我们可以选择启用或禁用错误报告。我们还可以启用SQL查询调试。当此选项启用时,查询列表以及错误描述将显示在全局变量$SQL_DEBUG_ARRAY中。Core\Debuging类有一个方法,可以以HTML代码格式返回查询列表和错误,这使得在Smarty视图中通过在</body>标签之前插入此代码片段来显示错误变得非常容易:{$SQL_DEBUG_HTML|unescape:'html'}

数据验证

davidecesarano创建的Core\Validation类用于验证接收到的数据,例如来自网站表单的数据。

使用示例

use Core\Validation;
// ...
$email = 'example@email.com';
$username = 'admin';
$password = 'test';
$age = 29;

$val = new Validation();
$val->name('email')->value($email)->pattern('email')->required();
$val->name('username')->value($username)->pattern('alpha')->required();
$val->name('password')->value($password)->customPattern('[A-Za-z0-9-.;_!#@]{5,15}')->required();
$val->name('age')->value($age)->min(18)->max(40);

if($val->isSuccess()){
    echo "Validation ok!";
}else{
    echo "Validation error!";
        var_dump($val->getErrors());
}

完整的文档可以在以下链接中找到: davidecesarano/Validation。由于原始代码未能正确工作,函数中的电子邮件地址验证已被修改。

发送电子邮件

要发送电子邮件,请使用方法Mailer::send(string $to, string $subject, string $message, array $Attachment = [])。该方法接受的参数包括

  • $to - 收件人的电子邮件地址
  • $subject - 电子邮件主题
  • $message - 电子邮件的HTML内容
  • $Attachment - (可选)包含要附加文件路径的字符串列表

方法在成功时返回true,在失败时返回false。请记得配置Configs/Mailer.php文件。

示例

use Core\Mailer;

Mailer::send('test@test.com', 'Test message', '<h1>Test Message</h1><p>This is test message</p>');

文档

更多详细信息可以在GitHub上的wiki中找到。

支持

如果您想支持我的工作,您可以提出对项目的修改或创建自己的代码并生成一个Pull Request。您也可以为我干杯 :)