gpcosta/thats-it

这是一个用于个人项目的简单PHP框架。易于使用……就这么简单!

dev-master 2024-07-14 16:13 UTC

This package is auto-updated.

Last update: 2024-09-14 16:29:33 UTC


README

这是一个用于个人项目的简单PHP框架。易于使用……就这么简单!

想象一下,你喜欢创造事物,你也喜欢使用PHP... 你现在如何开始你的项目?或者你只是用纯PHP开始,或者使用众多框架中的一个?虽然它们很棒,但它们很重,而且大多数时候它们有很多过度的特性。

所以,因为我有很多空闲时间(只是开个玩笑),我开始创建自己的框架。可能是世界上第一个VC框架,因为我只需要控制器和视图。为什么不呢?

要求

  • 您至少需要PHP 7.2
  • 已安装Composer
  • 如果您想使用数据库,MySQL是唯一支持的数据库(目前没有支持其他数据库的功能)

如果您想使用它,请从该存储库下载,然后在项目根目录的shell中,输入以下命令下载所有依赖项(fastRoute、whoops和monolog)

composer install

之后,在shell中,要验证/构建您项目的结构,只需输入

php thatsIt.php verify

此命令将创建启动项目所需的所有文件和文件夹。在此阶段,您可以转到src/Public,在那里您将看到index.php。此文件是应用程序的入口点。

现在,您可以使用以下命令启动PHP服务器

php -S localhost:8000

您的应用程序正在运行,如果您在浏览器中输入localhost:8000,您将看到一个简单的404页面。那么接下来该怎么办呢?

文件夹和文件结构

对您来说,重要的是config和src文件夹。

在config文件夹中,您将看到3个文件

  • config.php(在这里您将指定服务器路径和当前环境)
  • database.php(在这里您将放入访问数据库的所有信息)
  • router.php(在这里您将告诉应用程序如何处理路由)

这些文件由框架创建,并已为您设置好以供使用。

在src文件夹中,您将找到

  • 控制器文件夹(在这里您将编写您的控制器)
  • 公共文件夹(在这里是您的入口点,以及您的外部可访问文件,如.js、.css和图像)
  • 视图文件夹(在这里您将放置您的视图和模板)

只有视图和控制器

在这个框架中,控制器是接收请求、执行所有“重劳动”(如数据库请求等)的组件,而视图是接收数据并将其展示给用户的组件。

如果您像我一样,不喜欢ORM的“暗黑魔法”(即“懒加载”),那么您可以忘记它们,以及这个框架中的模型。

如果您想将业务逻辑与控制器分离,可以创建一个文件夹来放置这些内容。别忘了在项目的composer.json中添加此文件夹及其命名空间。

工作示例

路由

想象一下,您有这个config/router.php文件

<?php

return [
    "home" => [
        "path" => "/{name}",
        "httpMethods" => ["GET", "POST"], // accept "GET", "POST", "PUT" and "DELETE"
        "controller" => "App\\Controller\\HomeController",
        "function" => "homeFunction",
        "parameters" => [
            "name" => [
                "default" => "Generic User"
            ],
            "age" => [
                "default" => 18
            ]
        ]
    ]    
];

这意味着对于路径"/{name}",您将有一个名为"home"的路由,它可以响应GET和POST请求。处理这些请求的控制器和函数分别是"App\Controller\HomeController"和"homeFunction"。

此函数将接收参数$name和$age。

控制器

现在,控制器应该是这样的

<?php

namespace App\Controller;

use ThatsIt\Controller\AbstractController;
use ThatsIt\Response\HttpResponse;
use ThatsIt\Response\View;

class HomeController extends AbstractController
{
    function homeFunction(string $name, int $age): HttpResponse
    {
        // create View that will show the test view
        $view = new View("test");
        // add $name to the view that will be available as $userName in the view
        $view->addVariable("userName", $name);
        // add $age to the view that will be available as $age in the view
        $view->addVariable("age", $age);
        
        return $view;
    }
}

在这段代码中,您可以看到在您提供的config/router.php中控制器函数中接收了$name和$age变量。在函数内部,创建了一个名为"teste"的视图,并向该视图添加了两个变量。最后,必须返回一个HttpResponse。目前,只有View和JsonResponse类继承了HttpResponse。如果您愿意,也可以创建更多。

您应将此文件放置在src/Controller中,命名为HomeController.php。

在这段代码中,HomeController继承了AbstractController,但实际上并不需要这样做。但让所有控制器都继承AbstractController会更好,因为它将提供

  • 访问数据库(使用$this->getPDO() - 更多关于PDO的信息,请参阅https://php.ac.cn/manual/en/book.pdo.php
  • 访问HttpRequest(使用$this->getRequest())
  • 访问所有路由(使用$this->getRoutes())
  • 访问日志记录器(使用$this->getLogger())

View

在您的视图中,您将编写HTML、CSS、JS,也可以使用PHP。例如

<html>
    <head>
        <style>
            /* css code */
        </style>
    </head>
    <body>
        <div>
            <b>Home page</b>
        </div>
        <div>
            Hello To ThatsIt, <?php echo $userName; ?>
        </div>
        <div>
            You're <?php echo $age; ?> years old
        </div>
        
        <script>
            // js code
        </script>
    </body>
</html>

我认为代码是自我解释的。您可以使用HTML编写您的视图,并使用PHP打印您的变量。当然,您将能够充分利用PHP。

您必须将此文件保存为src/View中的test.php。如果您想使用其他名称保存,则必须更改控制器中传递给View构造函数的参数。

您还可以将其保存在src/View/Other_folder中。如果是这样,您还必须在传递给View构造函数的参数中进行更改(例如"Other_folder/test")。

这就完了?

现在,如果您在src/Public中启动服务器

php -S localhost:8000

您可以在浏览器中访问localhost:8000/{在此处输入您的姓名}以查看代码的结果。如您所见,您的姓名显示在屏幕上。如果您想更改屏幕上显示的"age",可以访问

localhost:8000/{put your name here}?age={put your age here}

您的姓名仍然在那里,现在您的年龄也显示在那里。

这就完了。

我为什么做ThatsIt框架?

  • 首先,我喜欢控制我的数据。所以我更愿意自己编写查询,而不是信任ORM及其通常做的所有懒加载。
  • 其次,我一直认为PHP本身就是作为一个"独行侠"很棒。我只是不喜欢总是检查变量是否存在,或者它们的类型是什么(与$_GET和$_POST变量相关)
  • 第三,我喜欢数据处理和显示部分之间的分离。所以我需要的只是控制器和视图
  • 第四,这是了解框架背后基本原理的好练习(一个真正简单的框架)

注意:我要感谢Patrick Louys在GitHub上提供的HTTP库,我大量使用了它来制作自己的库,并进行了一些修正和调整,还要感谢他的无框架教程。尽管如此,ThatsIt框架并非基于这个教程,但它是一个很好的资源,可以学习已存在的优秀工具,并看到良好的原则。我推荐给任何想要了解框架“幕后”的人。